本章把镜头对准那台已经切开的商城:器官都分出来了,接下来要让它们"活"起来——服务之间到底怎么说话?同步还是异步?谁来当统一大门?这么多服务老是变来变去,客户端怎么知道找谁?这四件事,是"切得开"之后"活得起来"的总闸。
服务边界是静态的(上一章),通信是动态的(本章)。拆出来的服务犯的最大的错,是把它当回单体来调用——互相直接 class.func()、直接读对方数据库、把接口契约当摆设。通信没设计好,十几个服务只会变成"分布式的巨型单体",比原来更难养。所以本章连着讲四关,一关卡一关。
场景还是那台商城:用户点"下单",一笔交易需要商品、库存、支付、积分多个服务配合。我们跟着这笔"下单"一起走——它先落到哪个关卡、用同步还是异步、要过几扇门、最终怎么把结果凑齐。走完你就懂了通信的取舍,而不是死记"同步 vs 异步哪个好"。
3.1 同步通信:REST 与 gRPC 双通道——讲清同步调用怎么用、什么场景要"立刻要结果",以及 REST 和 gRPC 各自适合谁、什么时候别硬上同步。
3.2 异步通信:消息队列与事件驱动——讲清什么时候该"发出去就不管",消息队列、事件流各自的玩法,以及解耦的另一面——你再也拿不到一个即时的调用结果,事情没做完怎么办。
3.3 API 网关:手术室的门禁与分流——讲清为什么客户端不该直连一堆服务,网关怎么干"路由、认证、限流、聚合"这几件杂活,以及网关本身的单点风险怎么化解。
3.4 服务发现:定位每个跳动的器官——讲清服务扩容、宕机、升级后地址漂移,客户端和网关怎么知道该找谁,注册中心 + 心跳是怎么工作的,以及注册中心本身挂了怎么办。
本章最重要的认知转折是:"同步好还是异步好"是个伪命题,真正的问题是"这个动作能容忍多久才要结果"。一个必须立刻给用户答复的动作,多半走同步;一个可以缓口气再处理的动作,多半走异步。把这个判断练顺了,网关怎么搭、要不要事件流都有了解答。这也是第 4 章"数据一致性"的地基——异步拿不到即时结果,才需要最终一致。
通信设计错了,服务拆得再好也是白拆。三个最常犯的错:
把这三道关想清楚再看站点,通信的取舍会顺很多。
通信通了,下一个绕不开的是数据。第 4 章我们把镜头沉到服务下面——每个服务说自己管一份自己的数据,那数据怎么拆、怎么保证最终一致、跨服务的查询怎么做。这几关在拆服务时最容易被低估,也是后面无数事故的源头。