微服务与API网关:谁应处理请求数据聚合工作?
嘿,这个问题问到点子上了!结合微服务架构的最佳实践,再参考Uber这类大厂的实际落地情况,通常是请求预估微服务(也就是你说的「请求微服务」)来负责调用下游的定价、时长/距离、司机等微服务,而非让API网关直接完成这项工作,原因主要有这几点:
API网关的职责边界要清晰
API网关的核心定位是「入口层通用组件」,负责路由转发、身份认证、限流熔断、负载均衡这些跨服务的通用工作。如果把调用多个下游服务并聚合结果的业务逻辑塞进网关,会让网关变得臃肿不堪,慢慢变成一个“全能上帝服务”——不仅维护成本飙升,一旦网关出问题,整个系统的入口都会受影响,风险太高。业务聚合逻辑归属业务微服务
请求预估本身就是一个业务聚合场景:它需要把时长、距离、价格这些分散的数据整合起来,甚至可能还要做一些业务层面的处理(比如高峰时段价格与预估时长的联动调整、不同车型的参数适配)。这些逻辑属于请求预估服务的核心业务职责,放在专门的业务微服务里,更便于迭代、测试和维护,也符合“单一职责”的微服务设计原则。容错与降级更灵活
当请求预估服务作为协调者时,它可以针对每个下游服务做细粒度的容错处理:比如时长服务超时了,要不要返回缓存的历史预估数据?价格服务暂时不可用,要不要给用户提示“暂无法预估价格”而非直接返回500?这种精细化的控制在API网关里很难实现,而在业务微服务中可以轻松落地,提升系统的稳定性和用户体验。
当然也不是绝对的——如果是极其简单的无业务逻辑数据拼接,有些架构会让网关做,但像Uber这种复杂的出行场景,肯定是由专门的请求预估微服务来完成下游服务的调用与结果聚合。
内容的提问来源于stack exchange,提问作者joethemow

