【微服务理论】API + BFF 不再为兼容和适配烦恼

2,958 阅读3分钟

「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!

对于微服务,常见的架构模型就是API网关+服务。

  • API网关实现鉴权、负载均衡、中间件等公共入口逻辑。
  • 服务实现具体的业务功能。

那么,API网关设计中又有什么坑呢?

1.0版本

直接将服务穿透到外网。 API层只是套了壳,加了鉴权、中间件而已。具体返回值由服务定。

  • 客户端到微服务直接通信,强耦合。根本不敢重构,一改结构客户端就崩了。
  • 需要多次请求,客户端聚合数据,工作量巨大,延迟高。
    • 如果一个页面由多个服务组成,比如商品、优惠券、相关推荐、评价。客户端要请求多个接口,命名规则还不一样。
    • 有的接口成功,有的接口失败,需要客户端自己做降级。
  • 协议不利于统一,各个部门间有差异,需要客户端端来兼容。
  • 面向“端”的API适配,耦合到了内部服务。
    • 每个服务都要为不同的设备做适配代码。
  • 多终端兼容逻辑复杂,每个服务都需要处理。
  • 统一逻辑无法收敛,比如安全认证、限流。

这样就导致了客户端、服务端都累得要死,谁都不讨好。

2.0版本

架构就是一层加一层。

添加了一个BFF层,backend for forntend,专门做适配。

针对页面提供接口,比如商品页面,就一个接口,然后BFF层去调用多个服务,在这里做降级,比如优惠券服务没有返回就不显示就完了。

客户端只用和BFF层沟通,什么适配、协议、兼容、定制都是这一层来做。客户端感觉很爽。

服务端也只用提供基础数据,不用关心业务逻辑,不用管适配,返回的接口是什么结构。服务端也很爽。

BFF层只做了数据裁剪,兼容之类的逻辑,轻不轻松?也很轻松。

问题:

  • BFF单点了。也就是所有的流量都会到这一层, 如果有流量洪峰或者代码有bug,全盘宕机。

3.0版本

将BFF根据业务拆分,比如查看商品一个,订单页面一个。这样一个挂不会影响全局。

问题

  • 很多跨横切面逻辑,比如安全认证,日志监控,限流熔断等。随着时间的推移,代码变得越来越复杂,技术债越堆越多。

有没有发现:

分久必合、合久必分。 分开了就有不能统一的地方,合并了就会单点故障。

4.0版本

image.png

将通用逻辑做到了API网关层,BFF层专注于业务逻辑。

API层采用Nginx这种高可用的软件,基本不会挂,挂了重启即可,限流、负载等逻辑用模块实现,方便部署。 这一层完全和业务无关。

总结

当耦合性太高的时候,就加一层,作为缓冲。 当合并有单点的时候,就分开。当分开有不能统一的时候,就合并。

尽量让专门的人做专门的事情。减少业务对技术的耦合。

相关阅读: