在日常上网冲浪的时候看到一篇文章,结合公司实际业务有感。
面临挑战
这篇文章大概讲述了在微服务架构下客户端应用如何访问微服务的问题。主要面临以下挑战:
- API 粒度不匹配:微服务通常提供细粒度 API,而客户端需要综合数据,导致客户端需要与多个服务交互
- 客户端需求差异:不同客户端(桌面浏览器、移动端、第三方应用)需要不同的数据结构和量
- 网络性能差异:移动网络通常比内网慢且延迟高,影响用户体验
- 服务实例动态变化:服务实例数量和位置(主机+端口)会不断变化
- 协议多样性:后端服务可能使用不同协议,有些对 Web 不友好
具体细节就不补充了。可以私聊 hhhhhh 交流。
解决方案
然后作者给出了他的解决方案,就是实现 API Gateway 模式:
- 实现统一入口:设计一个 API 网关作为所有客户端的单一入口点
- 请求处理方式:
- 简单代理/路由请求到对应服务
- 扇出请求到多个服务并聚合结果
- 客户端特定 API:为不同客户端提供定制化 API,而非一刀切方案
- 实现横切关注点:加入认证、授权、SSL 终止、缓存等功能
文章还介绍了一个变种:Backends for frontends(BFF) 模式,即为每种客户端类型(Web 应用、移动应用、第三方应用)设计专用 API 网关。
个人分析:
优点
集中化管理:所有 API 流量通过单一入口,便于统一监控、追踪和治理
在某金融机构实施后,安全事件响应时间从小时级降至分钟级,因为所有可疑流量都能在网关层快速识别。
横切关注点统一实现:认证、授权、限流等功能只需在网关层实现一次
协议转换与聚合:将内部多种协议转换为统一外部接口,减少客户端请求次数,某电商将 7 次独立调用合并为 1 次聚合 API,移动端加载时间减少 68%。
解耦实现:客户端与微服务内部结构解耦,服务可独立演进而不影响客户端
流量控制:具备智能路由、负载均衡、熔断降级能力,提高系统弹性
上面这些内容都是老生常谈的了。
缺点
潜在单点故障:所有流量依赖单一组件,若设计不当可能成为系统瓶颈,当燃这个就得看高可用分布式架构师的能力啦~
延迟增加:增加额外网络跳转,可能增加响应时间(通常为 5-10ms)
复杂度陡增:随着规模扩大,网关可能变得臃肿且难以维护
一家大型企业的 API 网关积累了超过 200 个定制化处理逻辑,最终导致无人敢修改代码。
团队协作挑战:网关变更需要跨团队协调,可能形成开发瓶颈
适用场景
- 中小型微服务架构:服务数量适中(10-50 个),客户端类型有限
- 安全要求高的系统:需要统一安全策略的金融、医疗等领域
- 混合协议环境:内部服务使用不同协议(REST、gRPC、AMQP 等)
- 需要统一网关治理:企业级应用需要集中化 API 治理策略
核心功能与实现效果
然后他还给出了他的 API 网关提供三大核心功能:
- 反向代理/网关路由:使用第 7 层路由重定向 HTTP 请求
- 请求聚合:将多个内部微服务请求聚合为单个客户端请求
- 横切关注点与网关卸载:集中实现通用功能
优势
- 客户端与微服务解耦:隔离客户端与微服务架构细节
- 提供最优 API:为各类客户端提供定制化 API
- 减少请求次数:单次请求获取多服务数据,降低网络开销
- 简化客户端逻辑:复杂调用逻辑从客户端迁移到 API 网关
- 协议转换:将公共 Web 友好 API 协议转换为内部协议
缺点
- 增加复杂性:新增一个需要开发、部署和管理的组件
- 增加响应时间:额外网络跳转可能增加延迟(对大多数应用影响不大)
- 单点故障风险:单一 API 网关可能成为瓶颈或单点故障
果然和我所想的是一样的。
实际部署策略
┌───────────┐ ┌───────────┐ ┌─────────────┐│ Web BFF │ │ Mobile BFF│ │ Third-party ││ │ │ │ │ BFF │└─────┬─────┘ └─────┬─────┘ └─────┬───────┘│ │ │▼ ▼ ▼┌─────────────────────────────────────┐│ Core API Gateway ││ (认证、监控、限流、基础路由) │└─────────────────────────────────────┘│ │ │▼ ▼ ▼┌─────────┐ ┌───────────┐ ┌───────────┐│ 服务集群1│ │ 服务集群2 │ │ 服务集群3 │└─────────┘ └───────────┘ └───────────┘
规模化考量
- 小型应用(5-15 个微服务):
- 推荐:单一 API 网关
- 理由:简单高效,避免过度设计
- 中型应用(15-50 个微服务):
- 推荐:基础 API 网关+少量关键 BFF
- 理由:平衡复杂性和客户端优化需求
- 大型应用(50+微服务):
- 推荐:完整三层架构(边缘网关+BFF 层+内部网关)
- 理由:支持组织扩展和复杂业务领域
决策要点
选择 API 网关策略时需考虑:
- 组织结构:Conway 法则表明系统设计往往反映组织结构
- 扩展预期:考虑 3-5 年内的业务增长和多样化
- 运维能力:评估团队管理多个网关的能力
- 一致性需求:业务对 API 行为一致性的要求程度
- 性能预算:额外网络跳转的延迟影响评估
无论选择何种模式,都应保持网关层轻量化,避免业务逻辑下沉过多导致"智能管道"反模式,并建立良好的监控体系,确保网关层性能与稳定性。