解决方案:一份通俗易懂的微服务架构方案!
优采云 发布时间: 2022-09-30 15:20解决方案:一份通俗易懂的微服务架构方案!
"
本文将介绍微服务架构和相关组件,它们是什么以及为什么要使用微服务架构和这些组件。
图片来自 Pexels
本文着重于简明扼要地表达微服务架构的大图,因此不会深入探讨如何使用组件等细节。
要了解微服务,首先要了解那些不是微服务的。通常,与微服务相反的是单体应用程序,其中所有功能都打包到一个单元中。
从单体应用到微服务不是一蹴而就的,它是一个渐进的过程。本文将以一个在线超市应用为例来说明这个过程。
初始需求
几年前,小明和小皮一起开了一家网上超市。小明负责程序开发,小皮负责其他事情。
那个时候,互联网还没有发达,网上超市还是一片蓝海。只要实现了功能,就可以随意赚钱。
因此,他们的需求非常简单。他们只需要一个网站挂在公网上,用户就可以在这个网站上浏览商品和购买商品;此外,他们需要一个管理后台,可以管理产品、用户和订单数据。让我们整理一下功能列表:
网站:
管理背景:
由于要求简单,小明左手右手做了一个慢动作,网站就完成了。出于安全考虑,管理后台没有用网站做,小明的左右手慢放回放,管理网站也做。
整体架构图如下:
小明摆了摆手,找了个云服务来部署,网站就上线了。推出后,好评如潮,受到各类肥宅的喜爱。小明和小皮开心地躺下收钱。
随着业务的发展...
好时光并没有持续多久。几天之内,各种网上超市纷纷跟进,对小明小皮造成了强烈的冲击。
迫于竞争压力,小明小皮决定进行一些营销手段:
这些活动需要项目开发的支持。小明拉着同学小红加入队伍。小红负责数据分析和移动端相关开发。小明负责推广活动相关功能的开发。
因为开发任务比较紧迫,小明小红没有好好规划整个系统的架构,随便拍了拍脑袋,决定把推广管理和数据分析放在管理后台,分别搭建微信和手机APP。
经过几天的过夜,新功能和应用程序几乎完成了。此时的架构图如下:
现阶段有很多不合理的地方:
虽然有很多问题,但不能否认这一阶段的成果:根据业务变化快速搭建系统。
然而,紧迫而繁重的任务很容易导致人们陷入片面、短视的思维,做出妥协的决定。
在这种结构中,每个人都只专注于自己三分之一的一亩地,缺乏整体性和长远性的设计。长此以往,制度建设将越来越困难,甚至陷入不断推倒重建的循环。
是时候做出改变了
好在小明和小红都是有追求有理想的好青年。意识到问题后,小明和小红将一些精力从琐碎的业务需求中解放出来,开始梳理整体架构,准备根据问题开始转型。
要进行装修,首先需要有足够的精力和资源。如果您的需求方(业务人员、项目经理、老板等)如此专注于需求计划,以至于您无法调动额外的精力和资源,那么您可能什么也做不了……
在编程的世界里,最重要的是抽象的能力。微服务改造的过程实际上是一个抽象的过程。
小明和小红梳理了网上超市的业务逻辑,抽象了公共业务能力,做了几个公共服务:
每个应用后端只需要从这些服务中获取所需的数据,从而去除了大量的冗余代码,留下了轻薄的控制层和前端。
这个阶段的结构如下:
这个阶段只分离了服务,数据库仍然是共享的,所以烟囱系统的一些缺点仍然存在:
如果保持共享数据库的模式,整个架构会越来越死板,失去微服务架构的意义。
于是,小明和小红合力拆分了数据库。所有的持久层都是相互隔离的,每个服务都对其负责。
此外,为了提高系统的实时性,增加了消息队列机制。架构如下:
完全拆分后,每个服务都可以使用异构技术。例如,数据分析服务可以使用数据仓库作为持久层,以便高效地进行一些统计计算;商品服务和促销服务访问频繁,因此增加了缓存机制。
抽象公共逻辑的另一种方法是将这些公共逻辑制成公共框架库。这种方法可以减少服务调用的性能损失。但是这种方式的管理成本非常高,而且很难保证所有应用版本的一致性。
分库也存在一些问题和挑战:比如需要跨库级联,通过服务查询数据粒度的问题等。
但是这些问题可以通过合理的设计来解决。总的来说,数据库拆分是利大于弊的。
微服务架构还有一个非技术性的好处,它让整个系统的分工更加清晰,职责更加清晰,每个人都致力于为他人提供更好的服务。在单体应用时代,常见的业务功能往往没有明确的所有权。
最后,要么做自己的事,大家重新实现一遍;或者一个随机的人(通常是更有能力或热情的人)在他负责的应用程序中这样做。
在后一种情况下,这个人除了负责自己的应用之外,还要负责将这些公共功能提供给其他人——而这个功能本来就不对任何人负责,只是因为他比较有能力/热情,莫名其妙地拿了责备(这种情况也委婉地称为努力工作的能力)。
最后,大家都不愿意提供公共功能。随着时间的推移,团队中的人逐渐变得独立,不再关心整体架构设计。
从这个角度来看,使用微服务架构也需要对组织架构进行相应的调整。因此,微服务转型需要管理者的支持。
改造完成后,小明和小红明确了各自的锅。两人都很满意,一切都像麦克斯韦方程组一样优美完美。然而……
没有银弹
春天来了,万物复苏,又是一年一度的购物狂欢节。小皮小明和小红看到每日订单量稳步上升,开心地笑了。可惜好景不长,极致的喜悦生出悲伤。突然,系统挂断了。
过去,对于单体应用程序,故障排除通常通过查看日志、研究错误消息和调用堆栈来完成。在微服务架构中,整个应用被划分为多个服务,很难定位故障点。
小明一一查看日志,手动调用一个服务。经过十多分钟的搜索,小明终于找到了故障点:由于收到的请求太多,推广服务停止响应。
所有其他服务,直接或间接地调用促销服务,因此它们也会下降。在微服务架构中,一个服务的故障会产生雪崩效应,导致整个系统出现故障。事实上,在节日之前,小明和小红就做过请求量评估。
果不其然,服务器资源足以支撑节日的请求量,所以肯定有问题。
然而,情况紧急。一分一秒都在浪费钱,小明没时间排查问题,于是决定在云上新建几台虚拟机,然后一个一个部署新的推广服务。节点。
运行了几分钟后,系统终于恢复正常。整个失败时间估计已经损失了几十万的销量,三人的心都在滴血……
后来小明干脆写了一个日志分析工具(体积太大,文本编辑器几乎打不开,肉眼也看不到),统计了推广服务的访问日志,发现在失败期间,商品服务是由于代码问题,在某些场景下会向推广服务发出大量请求。
这个问题并不复杂,小明手指一弹,修复了价值几十万的bug。问题解决了,但不保证不会再出现其他类似问题。
微服务架构的逻辑设计虽然完美,但它就像一座用积木搭建的华丽宫殿,经不起风吹雨打。
微服务架构虽然解决了老问题,但也引入了新问题:
小明和小红苦苦思索,下定决心要解决这些问题。故障排除一般从两个方面着手:
监控:发现故障症状
在高并发、分布式的场景下,故障往往突如其来,如雪崩般突如其来。因此,有必要建立完善的监测系统,尽可能地发现故障的征兆。
微服务架构中有很多组件,每个组件需要监控不同的指标。比如Redis缓存一般监控占用内存值、网络流量、数据库监控连接数、磁盘空间、业务服务监控并发、响应延迟、错误率等。
因此,做一个庞大而全面的监控系统来监控每个组件是不现实的,扩展性会很差。
一般的做法是让每个组件都提供一个接口(Metrics接口)来报告它的当前状态,并且这个接口输出的数据格式应该是一致的。
然后部署一个指标采集器组件,定期从这些接口获取和维护组件状态,同时提供查询服务。
最后,需要一个UI来从指标采集器中查询各种指标,绘制监控界面或者根据阈值发出告警。
大部分组件不需要自己开发,网上有开源组件。小明下载了Redis Exporter和MySQL Exporter。这两个组件分别提供了Redis缓存和MySQL数据库的指标接口。
微服务根据每个服务的业务逻辑实现自定义指标接口。然后小明使用Prometheus作为指标采集器,Grafana配置监控界面和邮件告警。
搭建了这样一个微服务监控系统:
定位问题:链接跟踪
在微服务架构下,一个用户的请求往往会涉及到多个内部服务调用。为了方便定位问题,需要能够记录每个用户请求时在微服务内部进行了多少服务调用以及它们的调用关系。这称为链接跟踪。
让我们使用 Istio 文档中的链接跟踪示例来看看效果:
图片来自 Istio 文档
从图中可以看出,这是用户访问productpage页面的请求。在请求过程中,productpage服务依次调用details和reviews服务的接口。
评论服务在响应过程中调用评级接口。整个链接跟踪的记录是一棵树:
为了实现链接跟踪,每个服务调用在 HTTP HEADERS 中至少记录四项数据:
此外,还需要调用日志采集和存储组件,以及显示链接的UI组件调用。
以上只是简要说明。链接跟踪的理论基础可以参考谷歌的Dapper。
了解了理论基础后,小明选择了Dapper的开源实现Zipkin。然后,弹指之间,我编写了一个 HTTP 请求*敏*感*词*,它会在每次 HTTP 请求发出时生成这些数据并将它们注入 HEADERS,并将调用日志异步发送到 Zipkin 的日志采集器。
解决方案:网络信息采集大师(NetGet)
信息采集的难点是什么?数据比较复杂,形式多样;下载后的难点又是什么?数据管理。
网络信息采集大师(NetGet)的主要功能,就是解决这两个问题。一般数据采集是有针对性的,通常是针对某个或者某些网站,采集某些类别的数据。比如采集几个网站的人才招聘信息,产品信息,供求信息,公司库信息等等。对这些网站的数据结构进行简单分析后,设置相应的采集规则,就可以把想要的数据统统下载到本地。
功能简介:
1、本软件可采集任何类型的网站信息。包括htm,html,ASP,JSP,PHP等。采集速度快,信息一致准确。
2、网站登录。对于需要登录后才能采集的信息,提供了简便的登录设置,登录后轻松采集。自动保存Cookie。
3、支持脚本类型的网站。专门提供了脚本类型的任务,实行机器人自动点击采集。
4、多任务多线程,将采集效率最大化。
5、数据保存格式丰富。可把采集的数据,快速保存为Txt,Excel和多种数据库格式。
6、采集过程中信息自动保存。对于采集的信息,可设定一定的时间周期,自动保存数据。即使机器突然断电或其他异常情况,也能有效的保存数据。
7、信息再加工。对采集的信息,可进行二次批量再加工,使之更加符合您的实际要求。
8、可下载二进制文件,比如图片,软件,mp3等。
9、实时监测和发布(任务调度)。指定某些任务自动运行,把采集的数据自动去掉重复之后导入数据库(可指定组合唯一项)。可循环往复运行。
10、支持多种数据库。包括Sqlserver,Access,Mysql,DB2,Sybase等。可自定义数据库接口(和数据库原有表对接),或自动创建表和字段(字段长度自适应)。
11、把采集的数据,直接发布到网站数据库.此功能适用于租赁的数据库,不能直接连接,网络提供商只提供了一个发布页面的情况。
12、可增量采集和完整采集.增量采集对于大数据量的采集和监测,极大的降低网络负荷.