做了几年微服务架构,踩了很多坑,今天来全景式分享微服务实战中的各种坑和解决方案。

做,了,几年,微服务,架构,从,最,开始,的,单体,应用,拆分,成,微服务,到,后来,微服务,体系,的,完善,踩,了,很多,坑,也,积累,了,很多,实战,经验。

今天,这篇,文章,就,来,全景式,分享,微服务,实战,中,的,各种,坑,和,解决,方案,包括,服务,拆分,服务,治理,分布式,事务,服务,监控,服务,部署,等等,各个,方面,的,坑,希望,能,给,正在,做,或者,准备,做,微服务,的,朋友,一些,参考,和,启发,帮,大家,少,踩,坑,少,走,弯路。

一、服务拆分的坑

微服务,第一,步,就是,服务,拆分,把,单体,应用,拆分,成,多个,微服务,这,一步,看,起来,简单,其实,很,容易,踩,坑,拆分,得,好,后面,都,顺利,拆分,得,不好,后面,会,很,痛苦。

坑一:拆分粒度太细,服务太多太碎

这,是,很多,人,刚,做,微服务,容易,犯,的,错误,觉得,微服务,就是,要,拆,得,越,细,越,好,一个,功能,就,拆,一个,服务,结果,拆,出来,几十个,甚至,上百个,服务,每个,服务,都,很,小,很,碎,但是,这样,带来,了,很多,问题,首先,服务,太多,运维,成本,很高,部署,监控,排查,问题,都,很,麻烦,其次,服务,之间,调用,关系,复杂,一个,业务,流程,可能,要,调用,十几个,服务,链路,很,长,性能,差,也,容易,出,问题,最后,服务,太,碎,很多,功能,需要,跨,多个,服务,协作,分布式,事务,的,问题,很,严重,数据,一致性,很难,保证。

我们,最,开始,也,犯,了,这个,错误,把,一个,电商,系统,拆,成,了,三十多个,服务,结果,运维,起来,很,痛苦,后来,我们,重新,梳理,了,业务,领域,按,领域,驱动,设计,DDD,的,思路,把,一些,关系,紧密,的,服务,合并,了,最后,精简,到,十几个,服务,每个,服务,的,职责,更,清晰,边界,更,合理,运维,起来,也,轻松,了,很多。

所以,服务,拆分,不是,越,细,越,好,要,根据,业务,领域,和,团队,情况,合理,拆分,一般,来说,一个,服务,对应,一个,业务,领域,或者,一个,独立,的,业务,能力,粒度,适中,既能,独立,开发,部署,又,不会,太,碎,太,复杂,就,好,不要,为了,微服务,而,微服务,盲目,拆,细。

坑二:服务边界不清晰,职责重叠

这,也是,常见,的,坑,拆分,服务,的,时候,服务,边界,划,得,不,清晰,导致,多个,服务,职责,重叠,都,做,同样,的,事情,或者,一个,功能,不知道,该,放,哪个,服务,里,结果,就是,服务,之间,耦合,严重,改,一个,功能,要,改,好几个,服务,而且,数据,不一致,的,问题,很,严重。

比如,我们,最,开始,拆分,的,时候,用户,信息,在,用户,服务,里,但是,订单,服务,也,存,了,一份,用户,信息,商品,服务,也,存,了,一些,用户,相关,的,信息,结果,用户,信息,修改,了,要,同步,好几个,服务,很,容易,不一致,后来,我们,重新,梳理,了,服务,边界,明确,每个,服务,的,职责,和,数据,归属,用户,信息,只,在,用户,服务,里,其他,服务,需要,用户,信息,通过,接口,调用,获取,或者,做,数据,冗余,但是,要,保证,同步,机制,这样,服务,边界,清晰,了,职责,明确,了,耦合,也,降低,了。

所以,拆分,服务,的,时候,一定,要,明确,服务,边界,和,职责,每个,服务,负责,什么,不,负责,什么,数据,归属,哪个,服务,都,要,清晰,定义,避免,职责,重叠,和,数据,冗余,建议,用,领域,驱动,设计,DDD,的,方法,来,划分,服务,边界,按,业务,领域,来,拆分,这样,服务,边界,更,清晰,更,合理。

坑三:拆分太快,一步到位

很多,团队,做,微服务,喜欢,一步到位,一下子,把,整个,单体,应用,全,拆,成,微服务,结果,风险,很,大,问题,很,多,因为,拆分,本身,就是,一个,很,复杂,的,事情,涉及,代码,重构,数据,迁移,接口,定义,等等,一下子,全,拆,很,容易,出,问题,而且,出,了,问题,很难,定位,和,回滚。

我们,最,开始,也,想,一步到位,后来,发现,风险,太,大,改,成,了,逐步,拆分,先,拆,最,独立,的,模块,比如,用户,服务,商品,服务,这些,边界,比较,清晰,的,先,拆,出来,跑,一段时间,稳定,了,再,拆,下一个,这样,逐步,拆分,风险,小,也,能,在,拆分,过程,中,积累,经验,完善,微服务,的,基础设施,和,治理,体系,最后,整个,系统,都,拆,完,了,也,很,稳定。

所以,微服务,拆分,不要,一步到位,要,逐步,拆分,先,拆,边界,清晰,独立,性,强,的,模块,跑,稳定,了,再,拆,其他,的,这样,风险,可控,也,能,逐步,完善,体系,不要,急于求成,一下子,全,拆,很,容易,出,大,问题。

二、服务治理的坑

服务,拆分,之后,就,需要,服务,治理,了,包括,服务,注册,发现,负载均衡,熔断,降级,限流,等等,这,也是,微服务,的,核心,很,容易,踩,坑。

坑一:没有服务注册发现,硬编码地址

很多,人,刚,做,微服务,最,开始,服务,之间,调用,用,硬编码,的,IP,和,端口,写死,在,配置,里,结果,服务,部署,变更,的,时候,要,改,配置,很,麻烦,而且,服务,实例,扩容,缩容,的,时候,不能,动态,感知,负载均衡,也,做,不,好,很,容易,出,问题。

我们,最,开始,也,是,硬编码,后来,服务,多,了,实在,维护,不,过来,引入,了,服务,注册,发现,组件,我们,用,的,是,Nacos,当然,也,可以,用,Eureka,Consul,Zookeeper,等等,引入,服务,注册,发现,之后,服务,启动,自动,注册,调用,方,自动,发现,服务,实例,动态,负载均衡,服务,扩容,缩容,都,能,自动,感知,不用,改,配置,方便,了,很多,也,更,可靠。

所以,微服务,一定,要,有,服务,注册,发现,不要,硬编码,服务,地址,这,是,微服务,的,基础,设施,必须,有,不然,服务,多,了,根本,维护,不,过来。

坑二:没有熔断降级,一个服务挂了拖垮整个系统

这,是,微服务,最,危险,的,坑,之一,微服务,之间,调用,链路,很,长,如果,一个,服务,挂,了,或者,响应,慢,调用,它,的,服务,就,会,阻塞,等待,然后,线程,被,占满,接着,这个,服务,也,挂,了,然后,往上,蔓延,最后,整个,系统,都,被,拖垮,这,就是,服务,雪崩,很,可怕。

我们,就,遇到,过,一次,一个,底层,的,商品,服务,因为,数据库,问题,响应,很慢,结果,调用,它,的,订单,服务,线程,全,被,占满,了,订单,服务,也,挂,了,然后,调用,订单,服务,的,前端,服务,也,挂,了,最后,整个,网站,都,访问,不,了,影响,很,大,后来,我们,引入,了,熔断,降级,机制,用,的,是,Sentinel,当然,也,可以,用,Hystrix,Resilience4j,等等,引入,熔断,降级,之后,当,一个,服务,响应,慢,或者,出错,率,高,的,时候,自动,熔断,快速,失败,返回,降级,结果,不,会,阻塞,等待,也就,不会,拖垮,调用,方,避免,了,服务,雪崩,后来,再,遇到,类似,问题,就,只,影响,部分,功能,不,会,整个,系统,挂,了。

所以,微服务,一定,要,有,熔断,降级,机制,这,是,保证,系统,高可用,的,重要,手段,不要,等,出,了,雪崩,才,想,起来,加,那,时候,损失,已经,造成,了,要,提前,做好,熔断,降级,防患于未然。

坑三:没有限流,被流量冲垮

这,也是,常见,的,坑,微服务,虽然,能,横向,扩展,但是,也,不是,无限,的,遇到,大促,或者,突发,流量,超过,系统,承载,能力,的,时候,如果,没有,限流,就,会,被,流量,冲垮,整个,系统,崩溃,而且,恢复,起来,很,麻烦。

我们,大促,的,时候,就,遇到,过,流量,比,预期,大,很多,服务,没有,限流,结果,数据库,连接,被,占满,服务,响应,很慢,最后,整个,系统,都,卡,了,后来,我们,加,了,限流,机制,在,网关,层,和,服务,层,都,加,了,限流,根据,系统,的,承载,能力,设置,合理,的,限流,阈值,超过,阈值,的,请求,直接,拒绝,或者,排队,保证,系统,不,被,冲垮,后来,再,大促,就,很,稳定,了,即使,流量,超过,预期,也,只,是,部分,请求,被,限,不,会,整个,系统,崩溃。

所以,微服务,一定,要,有,限流,机制,尤其是,核心,服务,和,网关,要,做好,限流,防止,突发,流量,冲垮,系统,限流,的,算法,有,很多,比如,令牌桶,漏桶,滑动窗口,等等,可以,根据,场景,选择,合适,的,算法,Sentinel,这些,框架,都,内置,了,各种,限流,算法,用,起来,很,方便。

三、分布式事务的坑

微服务,之后,一个,业务,流程,可能,涉及,多个,服务,多个,数据库,原来,的,本地,事务,就,不,能用,了,需要,分布式,事务,这,是,微服务,最,难,的,问题,之一,也,很,容易,踩,坑。

坑一:用两阶段提交2PC,性能差阻塞严重

很多,人,做,分布式,事务,最,开始,想到,的,就是,两阶段,提交,2PC,比如,用,XA,事务,但是,2PC,有,很,大,的,问题,首先,性能,差,因为,要,等,所有,参与者,都,准备,好,才能,提交,延迟,高,吞吐量,低,其次,阻塞,严重,协调者,挂,了,参与者,会,一直,阻塞,锁,资源,不,释放,影响,其他,业务,最后,一致性,也,不,是,100%,保证,极端,情况,还是,会,有,问题,所以,2PC,在,高并发,的,互联网,场景,下,很,不,适用。

我们,最,开始,也,尝试,过,XA,事务,结果,性能,很,差,而且,经常,阻塞,后来,放弃,了,改用,最终,一致性,的,方案,用,消息,队列,加,本地,消息,表,的,方式,保证,最终,一致性,把,一个,大,事务,拆,成,多个,本地,小,事务,通过,消息,异步,协调,保证,最终,数据,一致,虽然,不是,强,一致,但是,对于,大部分,互联网,业务,最终,一致,就,够,了,性能,也,好,很多,也,没有,阻塞,问题。

所以,微服务,的,分布式,事务,尽量,不要,用,2PC,强,一致,方案,性能,差,阻塞,严重,不,适合,高并发,场景,优先,考虑,最终,一致性,方案,比如,可靠,消息,最终,一致,TCC,Saga,等等,根据,业务,场景,选择,合适,的,方案,大部分,场景,最终,一致,都,能,满足,需求,性能,也,更,好。

坑二:忽略幂等性,重复消费导致数据错误

用,最终,一致性,方案,比如,消息,队列,的,时候,很,容易,忽略,幂等性,的,问题,消息,队列,为了,保证,消息,不,丢,可能,会,重复,投递,消息,如果,消费,方,没有,做,幂等,处理,重复,消费,就,会,导致,数据,错误,比如,重复,扣款,重复,下单,等等,问题,很,严重。

我们,最,开始,就,踩,了,这个,坑,消息,消费,没有,做,幂等,结果,因为,网络,抖动,消息,重复,投递,导致,一笔,订单,被,处理,了,两次,库存,扣,了,两次,后来,我们,给,所有,消息,消费,都,加,了,幂等,处理,用,唯一,业务,ID,或者,消息,ID,来,判断,是否,已经,消费,过,了,消费,之前,先,查,一下,有没有,消费,记录,有,就,直接,返回,不,重复,处理,没有,就,处理,并且,记录,消费,状态,这样,即使,消息,重复,投递,也,不会,重复,处理,保证,数据,正确。

所以,用,消息,队列,做,最终,一致性,的,时候,一定,要,做,幂等,处理,这,是,保证,数据,正确,的,关键,不要,忽略,幂等性,不然,重复,消费,会,导致,很,严重,的,数据,问题,幂等,的,实现,方式,有,很多,比如,唯一,索引,状态机,版本号,等等,可以,根据,业务,场景,选择,合适,的,方式。

四、服务监控的坑

微服务,服务,多,调用,链路,长,出,了,问题,很难,排查,所以,服务,监控,很,重要,但是,很多,团队,监控,做,得,不,好,踩,了,很多,坑。

坑一:只有基础监控,没有链路追踪

很多,团队,微服务,的,监控,只,做,了,基础,的,机器,监控,比如,CPU,内存,磁盘,网络,等等,还有,服务,的,基本,健康,检查,但是,没有,分布式,链路,追踪,结果,出,了,问题,比如,一个,请求,响应,慢,或者,报错,不,知道,是,哪个,服务,出,的,问题,要,一个,一个,服务,查,日志,很,麻烦,排查,问题,效率,很,低。

我们,最,开始,也,是,只有,基础,监控,后来,服务,多,了,排查,问题,实在,太,麻烦,引入,了,分布式,链路,追踪,我们,用,的,是,SkyWalking,当然,也,可以,用,Zipkin,Jaeger,Pinpoint,等等,引入,链路,追踪,之后,一个,请求,经过,了,哪些,服务,每个,服务,耗时,多少,哪个,服务,报错,了,都,能,一目了然,排查,问题,效率,提升,了,很多,而且,还,能,看到,服务,之间,的,调用,关系,和,依赖,拓扑,很,方便。

所以,微服务,一定,要,做,分布式,链路,追踪,这,是,排查,问题,的,重要,工具,没有,链路,追踪,服务,多,了,出,了,问题,根本,没法,快速,排查,影响,问题,解决,的,效率,也,影响,系统,的,稳定性。

坑二:日志不规范,没有统一日志中心

微服务,服务,多,每个,服务,都,有,自己,的,日志,散落在,各个,机器,上,出,了,问题,要,登录,各个,机器,查,日志,很,麻烦,而且,日志,格式,不统一,关键字,段,不,全,很难,关联,和,分析,排查,问题,很,痛苦。

我们,最,开始,也,是,这样,日志,散落在,各个,机器,格式,也,不,统一,后来,我们,做,了,统一,日志,中心,用,ELK,Elasticsearch + Logstash + Kibana,当然,也,可以,用,EFK,Loki,等等,所有,服务,的,日志,都,收集,到,统一,的,日志,中心,并且,规范,了,日志,格式,每个,日志,都,包含,traceId,服务名,实例,IP,时间,级别,等等,关键字,段,这样,出,了,问题,根据,traceId,就能,把,一个,请求,在,各个,服务,的,日志,都,查,出来,关联,分析,很,方便,排查,问题,效率,提升,了,很多。

所以,微服务,一定,要,做,统一,日志,中心,并且,规范,日志,格式,包含,链路,ID,等,关键字,段,方便,问题,排查,不要,让,日志,散落在,各个,机器,不,统一,不,规范,那样,排查,问题,会,很,痛苦。

五、服务部署的坑

微服务,服务,多,部署,也,是,一个,大,问题,很,容易,踩,坑。

坑一:手动部署,效率低容易出错

很多,团队,微服务,部署,还是,手动,的,打包,上传,重启,一个,服务,一个,服务,来,结果,部署,效率,很,低,而且,容易,出错,比如,漏,部署,某个,服务,版本,搞错,配置,搞错,等等,而且,服务,多,了,一次,发布,要,部署,几十个,服务,手动,根本,忙,不过来。

我们,最,开始,也,是,手动,部署,后来,服务,多,了,实在,太,痛苦,做,了,CI/CD,持续,集成,持续,部署,用,的,是,Jenkins,当然,也,可以,用,GitLab CI,GitHub Actions,等等,代码,提交,后,自动,构建,测试,打包,部署,到,测试,环境,验证,通过,后,一键,部署,到,生产,环境,而且,支持,灰度,发布,回滚,等等,部署,效率,提升,了,很多,也,不,容易,出错,了。

所以,微服务,一定,要,做,CI/CD,自动化,部署,不要,手动,部署,效率,低,还,容易,出错,服务,少,的,时候,还,能,凑合,服务,多,了,手动,根本,维护,不,过来,必须,自动化。

坑二:没有灰度发布,出问题全量影响

很多,团队,微服务,发布,是,全量,发布,一下子,所有,实例,都,更新,成,新版本,结果,如果,新版本,有,问题,就,全量,影响,所有,用户,损失,很大,而且,回滚,也,要,全量,回滚,恢复,慢。

我们,就,遇到,过,一次,新版本,有,个,隐藏,bug,全量,发布,后,才,发现,结果,影响,了,所有,用户,后来,我们,做,了,灰度,发布,机制,发布,的,时候,先,更新,一小部分,实例,比如,10%,观察,一段时间,没问题,再,逐步,增加,比例,直到,全量,发布,如果,有,问题,立即,回滚,只,影响,小部分,用户,损失,小,很多,后来,再,发布,就,很,安全,了,即使,有,问题,也,只,影响,小部分,用户,不,会,全量,影响。

所以,微服务,发布,一定,要,有,灰度,发布,机制,不要,全量,发布,出,问题,影响,太大,灰度,发布,能,把,发布,风险,降到,最低,即使,新版本,有,问题,也,只,影响,小部分,用户,能,快速,回滚,损失,小,很多,Kubernetes,这些,容器,编排,平台,都,支持,灰度,发布,用,起来,很,方便。

六、写在最后

微服务,是,一个,很,复杂,的,架构,涉及,服务,拆分,服务,治理,分布式,事务,服务,监控,服务,部署,等等,很多,方面,每个,方面,都,有,很多,坑,需要,踩,需要,积累,经验,才能,做好,我们,也是,踩,了,很多,坑,才,慢慢,把,微服务,体系,完善,起来,的。

今天,把,我们,踩,过,的,一些,主要,的,坑,和,解决,方案,分享,出来,希望,能,给,正在,做,或者,准备,做,微服务,的,朋友,一些,参考,和,启发,帮,大家,少,踩,坑,少,走,弯路,当然,微服务,的,坑,远,不止,这些,还有,很多,这里,只是,列举,了,一些,我们,遇到,的,比较,典型,的,坑,实际,做,的,时候,还,会,遇到,各种,各,样,的,问题,需要,具体,问题,具体,分析。

最后,想,说,的,是,微服务,不是,银弹,不是,所有,系统,都,适合,微服务,也,不是,做,了,微服务,就,一定,好,微服务,有,它,的,优势,也,有,它,的,复杂度,和,成本,要,根据,自己,的,业务,规模,团队,情况,技术,能力,合理,选择,不要,盲目,跟风,为了,微服务,而,微服务,如果,单体,应用,能,满足,需求,团队,也,不大,就,不要,强行,做,微服务,不然,反而,会,增加,复杂度,降低,效率,得不偿失,只有,当,业务,规模,大,了,团队,大,了,单体,应用,确实,遇到,瓶颈,了,再,考虑,微服务,而且,要,逐步,拆分,完善,基础设施,和,治理,体系,不要,一步到位,急于求成。

希望,这篇,文章,能,给,大家,带来,一些,帮助,和,启发,也,欢迎,大家,在,评论,区,分享,你们,做,微服务,踩,过,的,坑,和,解决,方案,一起,交流,一起,进步,谢谢,大家,的,阅读。