架构师带你实时解读微服务架构改造案例:天气预报系统的架构设计
天气预报系统的架构设计
到目前为止,天气预报系统已经初具规模了。我们不但实现了天气数据的采集,还实现了数据的缓存、天气数据的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的文档格式,就能非常方便地实现城市数据的存储和读取。
本文给大家讲解的内容是天气预报系统的架构设计
- 下篇文章给大家讲解天气数据采集微服务的实现;
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持!!
架构师带你实时解读微服务架构改造案例:天气预报系统的架构设计相关推荐
- 十年架构师带你详解微服务:Spring Cloud原理及核心
研究了一段时间Spring Boot了准备向Spring Cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统 ...
- 最全Java架构师130面试题:微服务、高并发、大数据、缓存等中间件
一.数据结构与算法基础 · 说一下几种常见的排序算法和分别的复杂度. · 用Java写一个冒泡排序算法 · 描述一下链式存储结构. · 如何遍历一棵二叉树? · 倒排一个LinkedList. · 用 ...
- 某灵JAVA互联网架构师专题/分布式/高并发/微服务
威❤:codeMaster001 Java可以做什么 图灵计算机架构 开发工具 涉及编译(javac),运行(java),监视,调试和文档生成(javadoc) 编程接口 API 提供 Java 编程 ...
- python微服务框架_微服务架构框架有哪些?常用微服务架构介绍
小伙伴们知道常用的微服务架构框架有哪些吗?上回我们介绍了一些常用的微服务架构设计模式,这次我们就来了解一下一些常用的微服务架构框架吧. 一.Dubbo Dubbo框架是由阿里巴巴开发的开源式的分布式服 ...
- 汇总微服务架构落地的6种java微服务框架
这两年,微服务这个概念火了,火到什么程度呢?2016年有一个统计说,两千家企业里,30%在使用微服务,15%在实验开发和测试微服务架构,24%在学习微服务准备转型,只有剩下的30%的企业没有使用微服务 ...
- BATJ大数据架构师带你领略实时计算框架Flink的魅力!
你是不是经常体验或看到以下这些场景? "小张,你看能不能做个监控大屏实时查看促销活动销售额(GMV)?" "小王,我们现在搞促销活动能不能实时统计销量 Top3 啊?&q ...
- 深入解读微服务架构下分布式事务解决方案
微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.概念一经提出迅速火遍全球.当前 Hailo 有160个不同服务构成,NetFlix 有大约 ...
- 旷世巨作!20年架构师手写《架构解密:从分布式到微服务》
前言 "微服务"架构在这几年被广泛传播,变得非常火热,以至于关于微服务架构相关的开源框架和工具都变得越来越活跃,比如: Netlix OSS.Dubbo.Apache Thrift ...
- javaweb k8s_K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程...
K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程 课程内容是关于Kubernetes微服务架构学习课程,基于K8S开展ASP.NET核心进行微 ...
最新文章
- 给Scrum Master的十个建议,你值得拥有((转自scrum中文网))
- JAVA三元运算符排序三个随机数
- Swift之深入解析如何使用Xcode和LLDB v2修改UI元素
- C++学习笔记:(七)C语言实现面向对象编程
- WIN7情况下VMWARE虚构机中Microsoft Windows XP Professional 2002 Service Pack2与win7共享文件的编制:
- vim 中的 quickfix 指令
- burp爆破线程设置多少_你知道线程池创建多少线程比较合理吗?
- 一句公道话引发的......
- three.js 下载安装、开发环境
- 凯尔卡C68全球版汽车电脑诊断仪
- 测试之smart原则
- MIPI 系列之 DSI
- 景点接口 查询携程旅游门票景点详情
- 看板方法不是方法论 | David博客系列 | Agilean学院出品
- uint8数据类型图片和double数据类型图片的转化和显示
- Kindle 可旋转桌面时钟
- 万物皆可健身环:UP主爆改switch,用健身环玩起《塞尔达传说之旷野「喘」息》...
- html 编辑器编码漏洞,某富文本编辑器文件上传漏洞(小论如何控制IsPostBack的值) | CN-SEC 中文网...
- LLVM WEEKLY系列停止转载
- 北京大额股票配资 北京股票金融配资
热门文章
- linux传输文件命令scp乱码,CP,SCP 命令(包括windows与linux用xshell互传)
- sockert组成部分_IOT-OS之RT-Thread(十六)--- WLAN管理框架 + AP6181(BCM43362) WiFi模块
- 使用HTML5的Canvas标签实现绘图板内拖拽元素
- 油猴插件高速下载百度网盘文件方法
- Python实现全自动购买火车票 抢票回家过年咯
- ShardingSphere-JDBC执行原理
- 2022-2028年全球与中国狗指甲钳行业深度分析
- Unity人物第三人称移动
- java 中final修饰的变量_java中final修饰符的使用方法
- 计算机无法跳转登录页面,电脑连接校园网后CMCC登录界面不能弹出的解决方法...