《微服务设计》是萨姆·纽曼的经典著作,是微服务架构领域的必读书。我花了一个月时间读完,对微服务有了全新的认识。本文分享我读完这本书最大的收获,包括微服务的核心理念、拆分原则、部署策略、监控运维、组织架构等。如果你在做微服务相关的开发,或者对软件架构感兴趣,这本书强烈推荐。
一、为什么读这本书
先说说我为什么读《微服务设计》。
我们公司的系统正在从单体架构向微服务架构迁移。刚开始的时候,我对微服务的理解很肤浅,以为就是把一个大系统拆成几个小服务,用RESTful API通信就行了。
但是真正开始做的时候,发现问题很多。服务怎么拆?拆多细?数据怎么管理?服务之间怎么通信?出了问题怎么排查?这些问题都没有答案。
后来有同事推荐了《微服务设计》这本书,说这是微服务领域的圣经。我就买了一本,花了一个月时间,认认真真地读完了。
读完之后,我对微服务的理解完全不一样了。微服务不只是一种技术架构,更是一种组织和协作的方式。它解决的不只是技术问题,还有团队协作、部署效率、系统扩展性等问题。
下面就来分享我读完这本书最大的收获。
二、收获1:微服务的核心是独立部署
这本书让我明白的第一个道理是:微服务的核心不是"小",而是"独立部署"。
很多人以为微服务就是把服务拆得很小,越细越好。但是纽曼说,微服务最重要的特征是可以独立部署。每个服务都可以独立开发、独立测试、独立部署、独立扩展,不需要依赖其他服务。
服务的大小不是关键,关键是服务之间的耦合度要低。如果两个服务必须一起部署、一起修改,那它们其实应该是一个服务。
这个观点纠正了我之前的错误认识。我们之前拆服务的时候,追求拆得细,结果拆出来的服务之间耦合很紧,改一个服务要同时改好几个,部署也要一起部署。这样的"微服务"其实没有意义,反而增加了复杂度。
正确的做法是:按照业务领域来拆分服务,每个服务负责一个完整的业务能力,服务之间通过明确的接口通信,做到高内聚、低耦合。
三、收获2:按照业务领域拆分服务
第二个收获是:微服务应该按照业务领域来拆分,而不是按照技术层来拆分。
很多团队拆微服务的时候,会拆成用户服务、订单服务、数据库服务、缓存服务这样的技术分层。但是纽曼说,这种拆分方式是错的。因为一个业务需求(比如下单)需要同时修改用户服务、订单服务、数据库服务,跨了好几个服务,团队协作很麻烦。
正确的拆分方式是按照业务领域(Domain)来拆分。比如电商系统,可以拆成商品服务、订单服务、支付服务、物流服务、用户服务。每个服务负责一个完整的业务领域,包含这个领域的所有逻辑(包括数据、业务逻辑、接口)。
这种拆分方式的好处是:每个业务需求只需要修改一个服务,团队可以独立负责一个服务,开发和部署效率都很高。
这其实就是领域驱动设计(DDD)的思想。纽曼在书里多次强调,微服务和DDD是天然契合的,用DDD的限界上下文来划分服务边界,是最合理的方式。
四、收获3:数据管理是微服务最大的挑战
第三个收获是:微服务最大的挑战不是服务拆分,而是数据管理。
单体架构的时候,所有数据都在一个数据库里,事务、关联查询都很方便。但是微服务架构下,每个服务有自己的数据库,服务之间不能直接访问对方的数据库,只能通过接口通信。
这就带来了很多问题:
- 跨服务的事务怎么处理?分布式事务很复杂,性能也差
- 跨服务的关联查询怎么处理?不能join了,只能调用多个接口然后在内存里组装
- 数据一致性怎么保证?服务之间的数据可能不一致
- 数据报表怎么做?需要从多个服务拉数据
纽曼在书里详细讨论了这些问题,给出了一些解决方案:
- 尽量避免分布式事务,用最终一致性代替强一致性
- 用事件驱动的方式来同步数据,服务之间通过事件来通知数据变化
- 报表数据可以用专门的报表服务,通过事件订阅来汇总数据
- 每个服务的数据库要严格隔离,不能跨服务访问数据库
这一点对我们的帮助很大。我们之前就是因为数据管理没做好,导致服务之间耦合很紧。按照书里的方法调整之后,服务的独立性好了很多。
五、收获4:部署和运维要自动化
第四个收获是:微服务架构下,部署和运维必须自动化,否则会被复杂度淹没。
单体架构的时候,部署一个应用就够了。但是微服务架构下,可能有几十个甚至上百个服务,每个服务都要部署、监控、扩容。如果靠人工来做,根本忙不过来。
所以微服务必须配合自动化的部署和运维体系:
- 持续集成和持续部署(CI/CD):代码提交后自动测试、自动构建、自动部署
- 容器化:用Docker打包服务,保证环境一致
- 编排:用Kubernetes来管理容器,自动扩容、自动恢复
- 监控:集中式的日志和监控,能快速定位问题
- 配置中心:统一管理各个服务的配置
纽曼在书里强调,没有自动化的运维体系,就不要做微服务。因为微服务的复杂度很高,人工运维根本跟不上。
这一点我们深有体会。刚开始拆微服务的时候,部署还是手工的,每次发布都要手动部署好几个服务,又慢又容易出错。后来我们搭建了CI/CD流水线,用Docker和K8s,部署效率提升了很多。
六、收获5:监控和可观测性是生命线
第五个收获是:微服务架构下,监控和可观测性是生命线。
单体架构的时候,出了问题看日志就差不多了。但是微服务架构下,一个请求可能经过好几个服务,出了问题不知道是哪个服务的错。如果没有完善的监控,排查问题就像大海捞针。
纽曼在书里讲了微服务的监控体系,包括三个层次:
- 日志:集中收集各个服务的日志,用ELK或者Loki来管理
- 指标:收集各个服务的性能指标(QPS、延迟、错误率等),用Prometheus和Grafana来展示
- 链路追踪:追踪一个请求经过的所有服务,用Zipkin或者Jaeger来实现
有了这三个层次的监控,出了问题就能快速定位是哪个服务、哪个接口出的问题,大大提升了排查效率。
我们之前就是因为监控不完善,出了问题要查好几个服务的日志,花很长时间才能定位。后来按照书里的建议搭建了监控体系,排查问题的效率提升了很多。
七、收获6:组织架构要跟着架构变
第六个收获是:微服务不只是技术架构的变化,组织架构也要跟着变。
纽曼在书里提到了康威定律:系统的架构会反映出组织的沟通结构。也就是说,如果你的团队是按技术分层的(前端组、后端组、DBA组),那么你的系统架构也会是按技术分层的。
如果要做微服务,按照业务领域拆分服务,那么团队也应该按照业务领域来组织。每个团队负责一个或几个相关的服务,从开发、测试到部署、运维,全流程负责。
这种团队叫"跨职能团队"或者"特性团队",团队里有前端、后端、测试、运维等各种角色,能独立完成一个业务功能的开发和交付。
这一点对我们的触动很大。我们之前团队是按技术分的,做一个需求要前端、后端、测试协调,效率很低。后来我们调整了团队结构,按照业务领域组建了跨职能团队,交付效率明显提升。
八、收获7:微服务不是银弹
第七个收获,也是最重要的收获:微服务不是银弹,不是所有系统都适合微服务。
纽曼在书里反复强调,微服务有很多好处,但是也有很多成本和复杂度。如果你的系统不大、团队不多、业务不复杂,单体架构可能更合适。
微服务的成本包括:
- 分布式系统的复杂度(网络延迟、分布式事务、数据一致性)
- 运维成本(需要自动化的部署和监控体系)
- 团队成本(需要跨职能团队,需要更多的沟通和协作)
- 技术门槛(需要掌握容器、编排、监控等技术)
如果你的系统没有这些问题,就不需要为了"微服务"而微服务。先把单体做好,等业务增长到一定程度,再考虑拆分。
这一点让我冷静了很多。之前我们有点盲目追潮流,觉得微服务就是先进的,不管自己的情况就要上微服务。读完书之后才明白,适合的才是最好的。
九、这本书的优点和不足
优点
- 全面:覆盖了微服务的方方面面,从拆分、部署、监控到组织架构都有涉及
- 实用:不是纯理论,有很多实际的案例和建议
- 深入:不只是讲怎么做,还讲了为什么这么做
- 客观:既讲了微服务的好处,也讲了成本和风险
- 经典:虽然出版有几年了,但是核心思想依然适用
不足
- 部分内容有点过时:比如有些技术工具已经更新了,但是核心思想没问题
- 缺少代码示例:书里主要是讲思想和原则,代码示例不多
- 有些章节比较浅:比如安全、测试等章节,讲得不够深入
十、适合谁读
适合的人
- 正在做微服务或者准备做微服务的开发者和架构师
- 对软件架构感兴趣,想系统学习微服务的人
- 技术管理者,想了解微服务对组织和流程的影响
- 从单体架构向微服务迁移的团队
不适合的人
- 完全没有开发经验的新手(这本书需要一定的基础)
- 只想学具体技术工具的人(这本书讲的是思想和原则,不是工具教程)
- 觉得微服务是银弹,想找一本"微服务从入门到精通"的人
十一、写在最后
《微服务设计》是我这几年读过的最好的技术书之一。它不只是教你怎么搭微服务,更是教你怎么思考架构、怎么组织团队、怎么权衡取舍。
读完这本书,我最大的改变是:不再盲目追求技术潮流,而是学会了根据业务需求和团队情况来选择合适的架构。微服务很好,但是不是所有情况都适合。单体架构也不差,只要能满足业务需求,就是好架构。
如果你在做微服务,或者对软件架构感兴趣,我强烈推荐这本书。它可能不会让你立刻成为架构师,但是会让你对微服务有更深入、更全面的理解。
最后用一句话结束本文:"架构是权衡的艺术,没有最好的架构,只有最合适的架构。"愿每一个开发者都能根据自己的实际情况,做出最合适的架构选择。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录