您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

微服务实践总结

时间:2023-07-26 13:41:51  来源:今日头条  作者:台近秋

微服务是近几年比较流行的概念,我在自己负责的项目里也用上了,改造成微服务模式后,我遇到了很多问题。下面我的一些经验分享,如果你对使用微服务还在犹豫中,也许会有帮助。总之,三思而后行,一定要适度。

延迟

微服务带来的最严重问题就是网络延迟了,调用链超复杂延迟就越高。马斯克吐槽 Twitter 微服务过多延迟过高的事情相信大家都了解,在更早之前亚马逊 Prime Video 团队也从微服务转为单体架构

要改善这个问题,先从根本上入手,尽可能的少拆分,像 twitter 这样拆分出上千个服务的真的恐怖。我负责的项目虽然规模不算很大但是已经有几十个服务了,这给管理维护带来了很大的困难。

减少微服务得从一开始设计的时候就做好,如果已经很多了,重构的代价可能是很大的。调用链不能改变,那就尽可能减少网络延迟吧,让微服务都在一个局域网中相互请求。实在做不到的,也尽可能让服务器在一个地区。

追踪

微服务一旦复杂起来就非常麻烦,最头疼的就是调试了。由于网络依赖较多,出了错程序的堆栈信息只能看到服务内的情况,前面的调用链就不知道了。假如支付服务出错了,那么哪个服务调用的支付服务呢,如果是订单,订单又是哪个服务调用的,从哪里下单的?甚至于两个服务相互调用,造成死循环都有可能,排查起来可比单体构架难多了。

现在已经有不少的解决方案了,原理是在消息头中都带入上下文信息,有些 RPC 框架自带了追踪功能。这些跟踪方案都是有代价的,就是性能,微服务一多本来延迟就大,跟踪又增加了网络开销。

其实我也没有好办法,只能说尽可能少拆分,保持较少的服务数,调用链尽可能简单,服务间的依赖要尽可能的少。规模一小,跟踪就容易多了,使用排除法就很容易找到问题。

事务

事务应该是最难搞的了,虽然有很多分布式事务方案,但是很多时候并不一定能用的上。像我负责的项目,后端编程语言有 JAVAphp、Nodejs,数据库也有 MySQL 和 MongoDB 等,想要在复杂的服务调用中让各个服务保持一致性还真不容易。

最好是各个服务都统一技术栈和数据库,至少这样搞分布式事务能容易一些。你可能很奇怪为什么我把项目搞成这个样子,最初的想法也是要团结一切可团结的力量,大家遵守一定的规范就行了,不强制要求。我现在的做法是,不依赖于事务,事务只存在于服务内即可,至于服务协作的情况则有一套较为复杂的验证机制,总之就是不断的检查和重复操作。

服务管理

服务注册,负载均衡,熔断与恢复这些功能,如果使用了 k8s 集群,我建议交给 k8s 就好。如果程序中去开服务,开发和管理成本真的太高了。当然像熔断可能有些需要细致的操作,容器编排是不能自动帮你完成的。

通过服务拆分,可以实现业务的单独更新,比如排行榜是个单独的服务,那么排行榜如果需要改动,就可以单独更新而不影响其它的功能,不必整个业务被重启或临时中断。同样的,扩展也比较方便,新的服务开发好就可以更新上去,不影响已有功能,不必修改现有的代码。当前,这都是理想情况,实际上还要看业务需要,如果服务间的依赖关系很复杂就难说了。

服务拆分带来的另一个好处是团队管理,尤其是规模较大的团队,可以分组或让每个开发人员来单独负责一个服务,不必所有人都在同一个项目下改代码。这样就可以互不干扰的完成工作,减少了文件冲突,更好的协作。还可以一定程度实现保密效果,每个小组成员只能看到自己负责的服务的代码,不能拥有项目完整的代码,一定程度防止代码泄露。

跨服务的业务操作

不管是否微服务架构,统计都是非常让人头疼的,微服务架构只会更麻烦。要跨多个服务采集数据,就需要各个服务都提供查询的接口,然后统计服务将数据汇总,相比单体架构直接使用 orm 查询要麻烦的多。

我之前还遇到过要统计图库中的图片在哪些地方使用过,涉及的服务太广泛了,每个服务也有多个业务在使用富文本,后来只好拒绝掉这个需求。

Saas 平台做复制你可能觉得太扯了,但是我就遇到了,将一个企业的数据复制,然后生成一个新的企业。这个即便是单体架构,也是非常麻烦的,微服务就更不要说了。

做微服务最怕的就是一个服务与所有其它的服务都有关联,这意味着,一旦别的服务有改动,这个服务就有可能需要改动,这个服务改动,别的服务也有可能受影响。关联太复杂,就实现不了上面说的单独管理和单独部署了,如果不同的服务由不同的开发人员来负责,沟通协调成本也很好,服务的对接比单体架构麻烦多了,要写接口和文档,要编写接口请求逻辑。

硬件成本

硬件成本就不用说了,一大堆服务,每个服务都开多副本的话,成本肯定不低。很多公司可能对硬件的成本不是在乎,但是管理成本是必须要关注的。在首次使用时,可能要设置安全组,要设置自动续费。但是后续的管理也不简单,集群中的服务分布不均衡,还要设置亲和策略来均衡。服务器配置不够,升级配置重启也会带来很大的影响,被升级的服务器上的服务会转移到别的服务器,然后再迁回。

不管怎么说,现在有 k8s 这样的容器集群管理工具还是很方便的,再加上云服务的便利,小规模的公司服务器管理技术主管一个人就可以搞定。

总结

上了微服务后,就要面对很多随之而来的新问题,成本的增长是方方面面的。能不上肯定不上的好,规模不是非常巨大的项目,能够支持集群开多副本就可以了。如果必须得上,还是尽可能保持克制,减少拆分。



Tags:微服务   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  Search: 微服务  点击:(5)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  Search: 微服务  点击:(115)  评论:(0)  加入收藏
九条微服务最佳实践,你学会了哪条?
微服务之间连贯一致的代码库对于可维护性至关重要。保持代码成熟度相似,可确保系统统一演进,防止服务间出现性能、安全性和功能差异。在开发微服务时,我们需要遵循哪些最佳实践...【详细内容】
2024-01-05  Search: 微服务  点击:(98)  评论:(0)  加入收藏
Go微服务入门到容器化实践
Go微服务入门到容器化实践Go 是一门高效、现代化、快速增长的编程语言,非常适合构建 Web 应用程序。而 Docker 是一种轻量级的容器化技术,能够使得您的应用程序在任何地方运行...【详细内容】
2024-01-01  Search: 微服务  点击:(62)  评论:(0)  加入收藏
微服务全做错了!谷歌提出新方法,成本直接降为1/9!
2023,微服务“水逆”之年。长期以来,不管大厂还是小厂,微服务都被认为是云原生服务应用程序架构的事实标准,然而2023,不止那位37signals的DHH决心下云,放弃微服务,就连亚马逊和谷歌...【详细内容】
2023-12-29  Search: 微服务  点击:(118)  评论:(0)  加入收藏
微服务架构中的数据一致性
在微服务中,一个逻辑上原子操作可以经常跨越多个微服务。即使是单片系统也可能使用多个数据库或消息传递解决方案。使用多个独立的数据存储解决方案,如果其中一个分布式流程参...【详细内容】
2023-12-27  Search: 微服务  点击:(141)  评论:(0)  加入收藏
监控 Spring Cloud 微服务的实践方案
一、简介Spring Cloud是一个基于Spring Boot实现的微服务框架,它提供了丰富的微服务功能,如分布式配置、服务注册与发现、服务熔断、负载均衡等。为了更好地管理和监控这样复...【详细内容】
2023-12-19  Search: 微服务  点击:(142)  评论:(0)  加入收藏
聊聊微服务链路服务
微服务架构图片如果有用户反馈某个页面很慢,我们知道这个页面的请求调用链是 A -----> C -----> B -----> D(图片有误),怎么来定位是由哪个服务引起的问题呢? 更进一步,如果...【详细内容】
2023-12-15  Search: 微服务  点击:(123)  评论:(0)  加入收藏
选择适合微服务的编程语言,让你的工作事半功倍!
讨论编程语言就像是一场政治辩论。每个开发者都会过分捍卫他/她所使用的编程语言。然而,编程语言应该被看作是它们真正是的东西,即一种工作工具。每种编程语言都有特定的目的...【详细内容】
2023-12-14  Search: 微服务  点击:(177)  评论:(0)  加入收藏
Eureka: 微服务架构中不可或缺的服务治理工具
Eureka是Netflix开源的一款用于服务治理的工具,它是NetflixOSS(OpenSourceSoftware)项目的一部分,主要用于实现微服务架构中的服务注册与发现。在当今庞大而复杂的微服务系统中,E...【详细内容】
2023-12-14  Search: 微服务  点击:(191)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(10)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条