事实:没有银弹,微服务架构改造的一条不归路
优采云 发布时间: 2022-11-06 04:11事实:没有银弹,微服务架构改造的一条不归路
简介:本文将介绍微服务架构和相关组件,它们是什么以及为什么要使用微服务架构和这些组件。
本文着重于简明扼要地表达微服务架构的大图,因此不会深入探讨如何使用组件等细节。
要了解微服务,首先要了解那些不是微服务的。通常,微服务的对立面是单体应用,即将所有功能打包成一个独立单元的应用。
从单体应用到微服务不是一蹴而就的,它是一个渐进的过程。
本文将以一个在线超市应用为例来说明这个过程。
初始需求
几年前,小明和小皮一起开了一家网上超市。小明负责程序开发,小皮负责其他事情。
那个时候,互联网还没有发达,网上超市还是一片蓝海。只要实现了功能,就可以随意赚钱。
因此,他们的需求非常简单。他们只需要一个网站挂在公网上,用户就可以在这个网站上浏览商品和购买商品;此外,他们需要一个管理后台,可以管理产品、用户和订单数据。
让我们整理一下功能列表:
由于要求简单,小明左手右手做了一个慢动作,网站就完成了。出于安全考虑,管理后台没有用网站做,小明的左右手慢放回放,管理网站也做。
整体架构图如下:
小明摆了摆手,找了个云服务来部署,网站就上线了。推出后,好评如潮,受到各类肥宅的喜爱。小明和小皮开心地躺下收钱。
随着业务的发展...
好时光并没有持续多久。几天之内,各种网上超市纷纷跟进,对小明小皮造成了强烈的冲击。
迫于竞争压力,小明小皮决定进行一些营销手段:
这些活动需要项目开发的支持。小明拉着同学小红加入队伍。小红负责数据分析和移动端相关开发。小明负责推广活动相关功能的开发。
因为开发任务比较紧迫,小明小红没有好好规划整个系统的架构,随便拍了拍脑袋,决定把推广管理和数据分析放在管理后台,分别搭建微信和手机APP。
经过几天的过夜,新功能和应用程序几乎完成了。
此时的架构图如下:
现阶段有很多不合理的地方:
虽然有很多问题,但不能否认这一阶段的成果:根据业务变化快速搭建系统。
然而,紧迫而繁重的任务很容易导致人们陷入片面、短视的思维,做出妥协的决定。
在这种结构中,每个人都只专注于自己三分之一的一亩地,缺乏整体性和长远性的设计。长此以往,制度建设将越来越困难,甚至陷入不断推倒重建的循环。
是时候做出改变了
好在小明和小红都是有追求有理想的好青年。意识到问题后,小明和小红将一些精力从琐碎的业务需求中解放出来,开始梳理整体架构,准备根据问题开始转型。
要进行转型,首先需要有足够的精力和资源。如果您的需求方(业务人员、项目经理、老板等)如此专注于需求计划,以至于您无法调动额外的精力和资源,那么您可能什么也做不了……
在编程的世界里,最重要的是抽象的能力。微服务改造的过程实际上是一个抽象的过程。小明和小红梳理了网上超市的业务逻辑,抽象了公共业务能力,做了几个公共服务:
每个应用后端只需要从这些服务中获取所需的数据,从而去除了大量的冗余代码,留下了轻薄的控制层和前端。
这个阶段的结构如下:
这个阶段只分离了服务,数据库仍然是共享的,所以烟囱系统的一些缺点仍然存在:
数据库成为性能瓶颈并面临单点故障的风险。
数据管理趋于混乱。即使一开始就采用了良好的模块化设计,但随着时间的推移,总会出现一个服务直接从数据库中获取另一个服务的数据的现象。
数据库表结构可能被多个服务依赖,影响全局,难以调整。
如果保持共享数据库的模式,整个架构会越来越死板,失去微服务架构的意义。
于是,小明和小红合力拆分了数据库。所有的持久层都是相互隔离的,每个服务都对其负责。
此外,为了提高系统的实时性,增加了消息队列机制。
架构如下:
完全拆分后,每个服务都可以使用异构技术。例如,数据分析服务可以使用数据仓库作为持久层,以便高效地进行一些统计计算;商品服务和促销服务访问频繁,因此增加了缓存机制。
抽象公共逻辑的另一种方法是将这些公共逻辑制成公共框架库。这种方法可以减少服务调用的性能损失。但是这种方式的管理成本非常高,而且很难保证所有应用版本的一致性。
分库也存在一些问题和挑战:比如跨库级联的需要,通过服务查询数据粒度的问题等等。但是这些问题都可以通过合理的设计来解决。总的来说,数据库拆分是利大于弊的。
微服务架构还有一个非技术性的好处,它让整个系统的分工更加清晰,职责更加清晰,每个人都致力于为他人提供更好的服务。
在单体应用时代,常见的业务功能往往没有明确的所有权。最后,要么做自己的事,大家重新实现一遍;或者一个随机的人(通常是更有能力或热情的人)在他负责的应用程序中这样做。
在后一种情况下,这个人除了负责自己的应用之外,还要负责将这些公共功能提供给其他人——而这个功能本来就不对任何人负责,只是因为他比较有能力/热情,莫名其妙地拿了责备(这种情况也委婉地称为努力工作的能力)。最后,大家都不愿意提供公共功能。
随着时间的推移,团队中的人逐渐变得独立,不再关心整体架构设计。
从这个角度来看,使用微服务架构也需要对组织架构进行相应的调整。因此,微服务转型需要管理者的支持。
改造完成后,小明和小红明确了各自的锅。两人都很满意,一切都像麦克斯韦方程组一样优美完美。
然而……
没有银弹
春天来了,万物复苏,又是一年一度的购物狂欢节。小皮小明和小红看到每日订单量稳步上升,开心地笑了。
可惜好景不长,极致的喜悦生出悲伤。突然,系统挂断了。
过去,对于单体应用程序,故障排除通常通过查看日志、研究错误消息和调用堆栈来完成。在微服务架构中,整个应用被划分为多个服务,很难定位故障点。
小明一一查看日志,手动调用一个服务。经过十多分钟的搜索,小明终于找到了故障点:由于收到的请求太多,推广服务停止响应。所有其他服务,直接或间接地调用促销服务,因此它们也会下降。
在微服务架构中,一个服务的故障会产生雪崩效应,导致整个系统出现故障。事实上,在节日之前,小明和小红就做过请求量评估。果不其然,服务器资源足以支撑节日的请求量,所以肯定有问题。
然而,情况紧急。一分一秒都在浪费钱,小明没时间排查问题,于是决定在云上新建几台虚拟机,然后一个一个部署新的推广服务。节点。
运行了几分钟后,系统终于恢复正常。整个失败时间估计已经损失了几十万的销量,三人的心都在滴血……
后来小明干脆写了一个日志分析工具(体积太大,文本编辑器几乎打不开,肉眼也看不到),统计了推广服务的访问日志,发现在失败期间,商品服务是由于代码问题,在某些场景下会向推广服务发出大量请求。
这个问题并不复杂,小明手指一弹,修复了价值几十万的bug。
问题解决了,但不保证不会再出现其他类似问题。微服务架构的逻辑设计虽然完美,但它就像一座用积木搭建的华丽宫殿,经不起风吹雨打。微服务架构虽然解决了老问题,但也引入了新问题:
小明和小红决心解决这些问题。故障的处理一般从两个方面入手,一方面尽量减少故障发生的概率,另一方面减少故障的影响。
监测——发现失败的迹象
在高并发、分布式的场景下,故障往往突如其来,如雪崩般突如其来。因此,有必要建立完善的监测系统,尽可能地发现故障的征兆。
微服务架构中有很多组件,每个组件需要监控不同的指标。比如Redis缓存一般监控占用内存值、网络流量、数据库监控连接数、磁盘空间、业务服务监控并发、响应延迟、错误率等。
因此,做一个庞大而全面的监控系统来监控每个组件是不现实的,扩展性会很差。
一般的做法是让每个组件都提供一个接口(metrics接口)来报告它的当前状态,并且这个接口输出的数据格式应该是一致的。
然后部署一个指标采集器组件,定期从这些接口获取和维护组件状态,同时提供查询服务。最后,需要一个UI来从指标采集器中查询各种指标,绘制监控界面或者根据阈值发出告警。
大部分组件不需要自己开发,网上有开源组件。小明下载了RedisExporter和MySQLExporter
这两个组件分别为 Redis 缓存和 MySQL 数据库提供了指标接口。微服务根据每个服务的业务逻辑实现自定义指标接口。
然后小明使用Prometheus作为指标采集器,Grafana配置监控界面和邮件告警。搭建了这样一个微服务监控系统:
定位问题 - 链接跟踪
在微服务架构下,一个用户的请求往往会涉及到多个内部服务调用。为了方便定位问题,需要能够记录每个用户请求时在微服务内部进行了多少服务调用以及它们的调用关系。这称为链接跟踪。
让我们使用 Istio 文档中的链接跟踪示例来看看效果:
图片来自:
从图中可以看出,这是一个用户访问productpage页面的请求。
在请求过程中,productpage服务依次调用details和reviews服务的接口。评论服务在响应过程中调用评级接口。
整个链接跟踪的记录是一棵树:
为了实现链接跟踪,每个服务调用都会在 HTTP HEADERS 中记录至少四项数据:
此外,还需要调用日志采集和存储的组件,以及显示链接调用的UI组件。
以上只是一个最小的描述。链接跟踪的理论基础,请参考谷歌的Dapper
了解了理论基础后,小明选择了Dapper的开源实现Zipkin。然后弹指一挥,我写了一个 HTTP 请求*敏*感*词*,它会在每次 HTTP 请求发出时生成这些数据并将它们注入到 HEADERS 中,并将调用日志异步发送到 Zipkin 的日志采集器。
解决方案:一键生成小说app,ai智能小说生成软件(文章伪原创工具手机版)
神经网络伪原创认为,随着人工智能技术的推广和实践,AI智能写作在越来越多的应用场景中发挥了它的价值。一款人工智能辅助的内容创作工具,可帮助您高效创作,包括智能写作、智能推荐材料、稿件改写、稿件修改、稿件纠错等实用功能。我是钱 QQ/微信:6439979
获取大量国产电视剧数据的“剧本*敏*感*词*”小程序,可以给你一个短剧的大纲。官网提供Windows、MAC操作系统、Android、iOS、浏览器插件等版本的下载渠道,可按需安装。
1.经过测试,我没有找到可以自动写稿子,欺骗编辑秋浩的写作工具,但是搜索的过程是把这个文章提供给后来的人。在主题和关键词选择正确的情况下,讨论的话题比较简单,适合一般性的讨论,《小作文》发布的文章其实光看一眼就能骗过很多人。经过一定程度的编辑,也许实际上在最终作业中获得了及格分数。
2、校对模式下,在编辑器中输入内容后,火龙果智能写作软件会自动开始校对,并对文章中的语法错误、错别字等进行下划线。另外,在扩展迷网站上,下载火龙果智能写字机插件安装包,解压后将crx文件拖到浏览器的扩展管理页面即可完成安装。除了客户端,火龙果智能书写机插件也非常方便在线编辑。
3、生成功能开启后,在编辑器中点击要继续编写的文本,然后点击鼠标左键,点击【生成】气泡。您可以直接使用当前正在播放的内容,或者如果您不满意,您可以点击【交换】生成其他内容。在编写文章时,可以直接根据文章当前的智能生成后续内容,帮助大家快速克服文章困难,提高创作效率。现在,经过人工智能技术的飞速发展,帮助我们分心、克服写作障碍的智能写作软件终于问世了。
4. 太简单的东西好像只是为了娱乐,生成的文章不在桌面上。下一步是尝试更复杂的智能创作工具。火龙果智能写作软件是一款AI驱动的写作辅助神器,提供文章内容改写、智能改写、校对纠错、实时翻译等强大功能。首先是“营销号文案*敏*感*词*”工具,从输入到制作,用户只需要给出标题即可。比如喝鸡汤可以长生不老。