天气预报系统的架构设计

到目前为止,天气预报系统已经初具规模了。我们不但实现了天气数据的采集,还实现了数据的缓存、天气数据的API服务及天气预报UI界面等功能。天气预报系统就是一个大而全的单块架构系统,里面混杂了太多的功能,可以预见的是,如果越往后发展,则系统会变得越来越难以管理和维护。同时不同服务之间存在着依赖,对于测试也是一个挑战。对于这样的系统,为了更好地实现可维护性、可扩展性,需要进行微服务改造。

本节所介绍的天气预报系统,正好是作为微服务架构改造的很好的案例。

在micro-weather-report应用的基础上,我们将对其进行逐步的拆分,最终形成独立自治的微服务。

天气预报系统的改造需求

我们要对天气预报系统进行微服务的改造。在经过一场头脑风暴之后,迅速将我们的期望和需求记录下来。

  • 微服务的拆分应该足够得小,每个微服务的业务是非常单一的。
  • 微服务应能支持水平扩展。
  • 如果有需要,应能够实现微服务间的相互调用。

….

最后的省略号代表了这个需求是未完的。我们可以在改造系统的过程中不断去完善系统架构,这也符合软件开发的特征。但就目前而言,我们认为最重要的就是这些需求。

天气预报系统的微服务拆分

如果你熟悉DDD,那么很容易就能够从系统的限界上下文中,提取出我们的微服务。图7-1展示了限界上下文与微服务之间的映射关系。

整个系统可以分为天气数据采集微服务、天气数据API微服务、城市数据API微服务、天气预报微服务4个微服务。其中每个微服务又可以由不同的组件组成,其中:

  • 天气数据采集微服务包含数据采集组件、数据存储组件。数据采集组件是通用的用于采集天气数据的组件。数据存储组件是用于存储天气数据的组件;
  • 天气数据API微服务包含了天气数据查询组件。天气数据查询组件提供了天气数据查询的接口;
  • 城市数据API微服务包含了城市数据查询组件。城市数据查询组件提供了城市数据查询的接口;
  • 天气预报微服务包含了数据展示组件。数据展示组件用于将数据模型展示为用户能够理解的UI界面。

微服务代码的拆分

对于代码而言,每个微服务都是一个独立的工程(应用)。针对上述拆分的4个微服务,代码可以分为如下4个工程。

  • .msa-weather-collection-server:天气数据采集微服务。
  • msa-weather-data-server:天气数据API微服务。
  • msa-weather-city-server:城市数据API微服务。
  • msa-weather-report-server:天气预报微服务。

系统的数据流向

数据是驱动系统发展的核心,了解系统的数据流向非常重要。

天气预报系统的数据,最初是来自第三方系统。这些第三方系统可以是国家气象局,也可以是其他专业天气数据服务网站。本书所采用的天气数据接口,都是来自互联网上免费测试用的接口,仅用于学习。

为了避免对第三方的数据接口产生冲击,我们需要限制下调用的次数。另外,我们还采用了Redis缓存服务器对数据进行存储,这样一方面可以减少直接调用第三方接口的次数;另一方面,可以有效提升天气预报系统的并发访问量。

图7-2展示了整个系统的数据流向。其中,为了提高系统的整体可用性,微服务可以水平扩展为多个实例。

天气数据API微服务对于调用方而言,大致分为两种。一种是提供给天气预报微服务作为天气数据的来源;另一种是直接提供给客户端来调用。

天气数据的采集依赖于城市数据API微服务,因为天气数据采集是根据城市ID列表来进行遍历的。同时,天气预报微服务也是依赖于城市数据API微服务的。

系统的通信设计

了解了数据流向之后,我们就能开始对系统之间的通信方式进行设计。

我们首先采用基于HTTP的RESTfulAPI的方式来进行系统之间的调用。RESTful API具有平台无关性,其数据格式可以很好地被开发人员所理解。

这些API大致分为以下几种。

  • 第三方天气接口。

*调用方式:GET
http://wthrcdn.etouch.cn/weather_mini?citykey={cityId}。

*参数:cityId为城市ID。

  • 天气数据接口。

*调用方式:GET /weatherlcityld/ {cityld}。

*参数:cityId为城市ID。

*调用方式:GET /weather/cityName/{cityName}。

*参数:cityName为城市名称。

  • 天气预报接口。

*调用方式:GET/report/cityId/ {cityId}。

*参数:cityId为城市ID。

  • 城市数据接口。

*调用方式:GET/cities。

*参数:无。

系统的存储设计

我们的系统并没有采用传统的关系型数据库,如MySQL、Oracle、SQL Server等,而是采用了NoSQL的方式(本书采用了Redis ) 。

对于经常需要访问的数据,放置在Redis缓存中可以极大地提升并发能力。同时,Redis由于都是在内存中操作,插入或更新的数据速度会非常快,非常适合我们系统的应用场景。

另外一些数据,比如城市信息,都是常年不会变更的数据——有时,这些数据也称为静态数据或码表数据——那么这类数据就可以简单地用一个文件来进行存储,例如,本文采用XML的文档格式,就能非常方便地实现城市数据的存储和读取。

本文给大家讲解的内容是天气预报系统的架构设计

  1. 下篇文章给大家讲解天气数据采集微服务的实现;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!!

架构师带你实时解读微服务架构改造案例:天气预报系统的架构设计相关推荐

  1. 十年架构师带你详解微服务:Spring Cloud原理及核心

    研究了一段时间Spring Boot了准备向Spring Cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统 ...

  2. 最全Java架构师130面试题:微服务、高并发、大数据、缓存等中间件

    一.数据结构与算法基础 · 说一下几种常见的排序算法和分别的复杂度. · 用Java写一个冒泡排序算法 · 描述一下链式存储结构. · 如何遍历一棵二叉树? · 倒排一个LinkedList. · 用 ...

  3. 某灵JAVA互联网架构师专题/分布式/高并发/微服务

    威❤:codeMaster001 Java可以做什么 图灵计算机架构 开发工具 涉及编译(javac),运行(java),监视,调试和文档生成(javadoc) 编程接口 API 提供 Java 编程 ...

  4. python微服务框架_微服务架构框架有哪些?常用微服务架构介绍

    小伙伴们知道常用的微服务架构框架有哪些吗?上回我们介绍了一些常用的微服务架构设计模式,这次我们就来了解一下一些常用的微服务架构框架吧. 一.Dubbo Dubbo框架是由阿里巴巴开发的开源式的分布式服 ...

  5. 汇总微服务架构落地的6种java微服务框架

    这两年,微服务这个概念火了,火到什么程度呢?2016年有一个统计说,两千家企业里,30%在使用微服务,15%在实验开发和测试微服务架构,24%在学习微服务准备转型,只有剩下的30%的企业没有使用微服务 ...

  6. BATJ大数据架构师带你领略实时计算框架Flink的魅力!

    你是不是经常体验或看到以下这些场景? "小张,你看能不能做个监控大屏实时查看促销活动销售额(GMV)?" "小王,我们现在搞促销活动能不能实时统计销量 Top3 啊?&q ...

  7. 深入解读微服务架构下分布式事务解决方案

    微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.概念一经提出迅速火遍全球.当前 Hailo 有160个不同服务构成,NetFlix 有大约 ...

  8. 旷世巨作!20年架构师手写《架构解密:从分布式到微服务》

    前言 "微服务"架构在这几年被广泛传播,变得非常火热,以至于关于微服务架构相关的开源框架和工具都变得越来越活跃,比如: Netlix OSS.Dubbo.Apache Thrift ...

  9. javaweb k8s_K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程...

    K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程 课程内容是关于Kubernetes微服务架构学习课程,基于K8S开展ASP.NET核心进行微 ...

最新文章

  1. 给Scrum Master的十个建议,你值得拥有((转自scrum中文网))
  2. JAVA三元运算符排序三个随机数
  3. Swift之深入解析如何使用Xcode和LLDB v2修改UI元素
  4. C++学习笔记:(七)C语言实现面向对象编程
  5. WIN7情况下VMWARE虚构机中Microsoft Windows XP Professional 2002 Service Pack2与win7共享文件的编制:
  6. vim 中的 quickfix 指令
  7. burp爆破线程设置多少_你知道线程池创建多少线程比较合理吗?
  8. 一句公道话引发的......
  9. three.js 下载安装、开发环境
  10. 凯尔卡C68全球版汽车电脑诊断仪
  11. 测试之smart原则
  12. MIPI 系列之 DSI
  13. 景点接口 查询携程旅游门票景点详情
  14. 看板方法不是方法论 | David博客系列 | Agilean学院出品
  15. uint8数据类型图片和double数据类型图片的转化和显示
  16. Kindle 可旋转桌面时钟
  17. 万物皆可健身环:UP主爆改switch,用健身环玩起《塞尔达传说之旷野「喘」息》...
  18. html 编辑器编码漏洞,某富文本编辑器文件上传漏洞(小论如何控制IsPostBack的值) | CN-SEC 中文网...
  19. LLVM WEEKLY系列停止转载
  20. 北京大额股票配资 北京股票金融配资

热门文章

  1. linux传输文件命令scp乱码,CP,SCP 命令(包括windows与linux用xshell互传)
  2. sockert组成部分_IOT-OS之RT-Thread(十六)--- WLAN管理框架 + AP6181(BCM43362) WiFi模块
  3. 使用HTML5的Canvas标签实现绘图板内拖拽元素
  4. 油猴插件高速下载百度网盘文件方法
  5. Python实现全自动购买火车票 抢票回家过年咯
  6. ShardingSphere-JDBC执行原理
  7. 2022-2028年全球与中国狗指甲钳行业深度分析
  8. Unity人物第三人称移动
  9. java 中final修饰的变量_java中final修饰符的使用方法
  10. 计算机无法跳转登录页面,电脑连接校园网后CMCC登录界面不能弹出的解决方法...