☰
《微服务架构设计模式》 第八章读书笔记:外部API模式
2026/9/29 20:20:47 网站建设 项目流程

标签:微服务API网关API GatewayBFFSpring Cloud GatewayGraphQL一句话:微服务拆分后不能直接对外暴露细粒度服务接口;API Gateway/BFF 作为统一入口,解决多客户端、网络差异、协议转换、多服务数据聚合问题。

前言

单体应用对外只提供一套API。拆分为微服务之后,每个服务独立提供API,如果让移动端、浏览器JS、第三方应用直接调用后端微服务,会带来大量工程问题。本章核心就是外部API设计难题,以及两种核心模式:API Gateway、后端前置模式(BFF,Backend For Frontend),同时介绍两种落地实现方案:Spring Cloud Gateway响应式网关、GraphQL网关。

案例:FTGO外卖应用,订单详情分散在Order、Kitchen、Delivery、Accounting多个服务。单体一次请求拿到全部订单信息;微服务架构下客户端直接调用需要串行/并行发起4次网络请求。

一、微服务直接暴露给客户端的三大痛点

1. 网络性能差,用户体验糟糕

移动端/公网网络延迟远高于内网局域网。客户端多次请求:

  • 串行调用:延迟叠加,页面卡顿;
  • 并行调用:依然多次往返,消耗移动设备电量;
  • 前端要写复杂的多接口聚合逻辑,前端重心偏离UI交互。

2. 封装丢失,服务与客户端强耦合

客户端感知后端服务拆分、接口定义。后端服务一旦改接口、拆分服务,移动端App需要发版,还要等待应用商店审核,用户不一定升级;第三方API更是需要长期兼容旧版本,变更成本极高。

3. 协议不统一,防火墙穿透困难

后端微服务内部可能使用gRPC、AMQP等协议。公网客户端只适合HTTP/WebSocket,直接暴露内部协议无法穿透防火墙。

补充:内网Web应用(防火墙内)可以直接调用后端服务,因为低延迟、同团队迭代,所以不是所有客户端都必须走网关。

二、API Gateway 模式(核心)

模式定义:API Gateway是微服务体系对外的统一入口,类似外观模式(Facade),封装后端微服务内部架构,面向外部客户端提供定制API。

API Gateway 四大核心能力

  1. 请求路由:反向代理,匹配路径/HTTP方法转发到对应后端服务(类似Nginx)。
  2. API聚合(API组合):网关内部并行调用多个微服务,把多个服务结果合并,客户端只需要一次请求(FTGO订单详情场景)。
  3. 协议转换:对外HTTP,对内gRPC等,屏蔽内部通信协议。
  4. 边缘公共能力:鉴权、限流、熔断、日志、监控、TLS终止、请求缓存。

API Gateway两种架构选型

  1. 单一API Gateway:所有客户端共用同一个网关,一套代码维护。
    • 缺点:不同客户端(移动端、桌面Web、第三方)数据需求不一样,容易膨胀,团队冲突。
  2. 后端前置模式 BFF(Backend For Frontend):为每一类客户端单独部署独立网关。
    • 优势:各前端团队独立维护自己的网关,可以自主迭代、发布,互不影响。
    • 适用:移动端、管理后台Web、用户Web端,各自独立BFF。

现代工程实践:BFF模式现在广泛用于前后端分离项目,前端团队拥有自己的BFF服务,做数据裁剪、聚合,不再让后端主网关承担所有客户端适配工作。

三、API Gateway落地实现方案

方案1:Spring Cloud Gateway(Java响应式网关)

书中示例使用Spring Cloud Gateway + WebFlux + Project Reactor。

  • 底层:响应式非阻塞,Mono/Flux,高并发,资源开销小。
  • 两种路由规则:
    1. 简单代理路由:路径匹配,直接转发到后端微服务;
    2. 自定义Handler:拦截请求,在网关内编写API聚合逻辑,并行调用多个服务,组装返回结果。
  • 代码要点:
    • @Configuration+ RouterFunction 定义路由DSL;
    • WebClient:响应式HTTP客户端,调用后端服务;
    • Mono.when():并行聚合多个服务调用结果;
    • onErrorReturn:容错,部分非核心服务失败,返回空对象,保证整体接口可用。

现代扩展:现在云原生环境除了Spring Cloud Gateway,还有APISIX、Kong、Envoy(Istio网关),性能更强,适合K8s集群;Spring Cloud Gateway更适合Spring技术栈自建网关。

方案2:GraphQL 实现API Gateway

REST网关痛点:不同客户端返回字段不一样,要维护大量接口/扩展参数,开发量大。GraphQL解决客户端按需获取字段。

  1. Schema:定义对象模型(Order、Consumer、Restaurant)、字段、对象关系;
  2. Resolver解析器:每个字段绑定解析函数,调用后端微服务;
  3. 查询:客户端单次请求,精确指定需要哪些字段,不会出现过度获取(over-fetching)。
GraphQL性能优化重点
  • 问题:简单实现会产生N+1查询问题(例如查询N个订单,循环N次调用餐馆服务);
  • 解决方案:DataLoader,批处理 + 缓存,合并同一轮事件循环内相同ID的请求,减少后端调用次数。

现代技术补充:Apollo Federation,把GraphQL Schema拆分到各个微服务,实现分布式GraphQL网关,现在很多大厂使用;GraphQL适合移动端、复杂前端;但公开第三方API,REST依然是首选,缓存简单、调试方便。

四、方案选型对比

方案优势缺点适合场景
自建Spring Cloud GatewayJava栈友好,自定义聚合逻辑灵活,响应式高性能需要自己维护代码、处理熔断容错Spring微服务,需要定制业务聚合逻辑
GraphQL网关客户端按需取字段,一套Schema适配多端学习成本高,N+1问题需要DataLoader,HTTP缓存弱多端(移动端+Web),页面需要灵活组合异构数据
商用/开源网关(Kong/APISIX)开箱即用,限流鉴权,云原生,高性能业务聚合能力弱,复杂API聚合需要BFF配合只需要路由、鉴权,业务聚合逻辑简单

五、本章核心总结 & 工程落地建议

  1. 不要直接把细粒度微服务暴露给公网客户端,会产生网络、耦合、协议三类问题;
  2. API Gateway核心价值:入口收敛、协议转换、多服务数据聚合、边缘安全能力;
  3. BFF(后端前置)是API Gateway的变种,多客户端场景优先考虑BFF,团队解耦,现在主流前端架构都在用;
  4. API聚合逻辑两种写法:Spring Cloud Gateway响应式Handler / GraphQL Resolver;
  5. 边界思考:网关适合做数据聚合、裁剪、安全,不要把复杂业务逻辑写在网关,网关太重会成为新的单体。

延伸思考(2026云原生视角): 现在很多项目把纯网关能力(路由、限流)交给Envoy/APISIX,业务聚合逻辑下沉到BFF服务,网关只做流量入口,BFF做数据组装,分层架构,职责更清晰。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询