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

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

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

1.0版本

直接将服务穿透到外网。

API层只是套了壳,加了鉴权、中间件而已。具体返回值由服务定。

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

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

而我们的架构设计应该前轻后重的,面向业务场景设计接口,而不是面向数据资源。(不要让客户端做组装)

2.0版本

架构就是一层加一层。

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

我们新增了一个 app-interface 用于统一的协议出口,在服务内进行大量的 dataset join,按照业务场景来设计粗粒度的 API,给后续服务的演进带来的很多优势:

  • 轻量交互:协议精简、聚合。
  • 差异服务:数据裁剪以及聚合、针对终端定制化API。
  • 动态升级:原有系统兼容升级,更新服务而非协议。
  • 沟通效率提升,协作模式演进为移动业务+网关小组。

对接:

大前端---网关,只用对接数据结构。面向业务场景提供接口。

网关---服务,只需要对接服务接口。

BFF可以认为是一种适配服务,将后端的微服务进行适配(主要包括聚合裁剪和格式适配等逻辑),向无线端设备暴露友好和统一的 API,方便无线设备接入访问后端服务。

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

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

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

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

问题:

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

3.0版本

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

问题

  • 单个模块也会导致后续业务集成复杂度高,根据康威法则,单块的无线BFF和多团队之间就出现不匹配问题,团队之间沟通协调成本高,交付效率低下。
  • 很多跨横切面逻辑,比如安全认证,日志监控,限流熔断等。随着时间的推移,代码变得越来越复杂,技术债越堆越多。

有没有发现:

分久必合、合久必分。

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

4.0版本

跨横切面(Cross-Cutting Concerns)的功能,需要协调更新框架升级发版(路由、认证、限流、安全),因此全部上沉,引入了 API Gateway,把业务集成度高的 BFF 层和通用功能服务层 API Gateway 进行了分层处理。

在新的架构中,网关承担了重要的角色,它是解耦拆分和后续升级迁移的利器。

在网关的配合下,单块 BFF 实现了解耦拆分,各业务线团队可以独立开发和交付各自的微服务,研发效率大大提升。

BFF的划分:

  • 重要性
  • 垂直业务,闭环
  • 流量大小

另外,把跨横切面逻辑从 BFF 剥离到网关上去以后,BFF 的开发人员可以更加专注业务逻辑交付,实现了架构上的关注分离(Separation of Concerns)。

我们业务流量实际为:

移动端 -> API Gateway -> BFF -> Mircoservice

在 FE Web业务中,BFF 可以是 nodejs 来做服务端渲染(SSR,Server-Side Rendering),注意这里忽略了上游的 CDN、4/7层负载均衡(ELB)。

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

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

这一层完全和业务无关。

总结

当耦合性太高的时候,就加一层,作为缓冲。

当合并有单点的时候,就分开。当分开有不能统一的时候,就合并。

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

【微服务理论】API + BFF的更多相关文章

  1. 轻量级容器Docker+微服务+RESTful API

    [宗师]李锟(44035001) 10:23:03感觉Docker这样的轻量级容器+微服务+RESTful API三者可以形成一个铁三角.这也代表了PaaS未来的发展方向. [宗师]李锟(440350 ...

  2. .net core 微服务之Api网关(Api Gateway)

    原文:.net core 微服务之Api网关(Api Gateway) 微服务网关目录 1. 微服务引子 2.使用Nginx作为api网关 3.自创api网关(重复轮子) 3.1.构建初始化 3.2. ...

  3. SOA与ESB,微服务与API网关

    SOA与ESB,微服务与API网关 SOA: ESB: 微服务: API网关: 参考资料: 1.漫画微服务,http://www.sohu.com/a/221400925_100039689 2.SO ...

  4. 一站式入口服务|爱奇艺微服务平台 API 网关实战 原创 弹性计算团队 爱奇艺技术产品团队

    一站式入口服务|爱奇艺微服务平台 API 网关实战 原创 弹性计算团队 爱奇艺技术产品团队

  5. 微服务·API网关

    阅文时长 | 3.52分钟 字数统计 | 1232字符 主要内容 | 1.什么是API网关 2.微服务中的API网关 3.几种部署策略 『微服务·API网关』 编写人 | SCscHero 编写时间 ...

  6. Net分布式系统之六:微服务之API网关

    本人建立了个人技术.工作经验的分享微信号,计划后续公众号同步更新分享,比在此更多具体.欢迎有兴趣的同学一起加入相互学习.基于上篇微服务架构分享,今天分享其中一个重要的基础组件“API网关”. 一.引言 ...

  7. 基于spring-cloud的微服务(4)API网关zuul

    API网关是微服务架构中的很重要的一个部分,内部有多个不同的服务提供给外部来使用,API网关可以对外做统一的入口,也可以在网关上做协议转换,权限控制和请求统计和限流等其他的工作 spring-clou ...

  8. 微服务理论之五:微服务架构 vs. SOA架构

    一.面向服务的架构SOA 面向服务的架构是一种软件体系结构,应用程序的不同组件通过网络上的通信协议向其他组件提供服务.通信可以是简单的数据传递,也可以是两个或多个服务彼此协调连接.这些独特的服务执行一 ...

  9. Re:从 0 开始的微服务架构--(三)微服务架构 API 的开发与治理--转

    原文来自:聊聊架构公众号 前面的文章中有说到微服务的通信方式,Martin Folwer 先生在他对微服务的定义中也提到“每个服务运行在其独立的进程中,服务与服务间采用 轻量级的通信机制 互相协作(通 ...

随机推荐

  1. swiper-wrapper轮滑组件(多组轮滑界面)间隔无效问题

    在多组此种轮滑效果出现时,你需要加两个属性值,即 new Swiper('.swiper-container', { slidesPerView: 3, slidesPerColumn: 2, spa ...

  2. 根据类拼凑成url参数

    /// <summary>        /// 根据类拼凑成url参数        /// </summary>        /// <typeparam name ...

  3. Linux系列(35) - 光盘yum源搭建(2)

    光盘搭建yum源 背景 当前Linux服务器没有网络,yum源下载好了,在光盘中 step-01 挂载光盘 mkdir /mnt/cdrom #建立挂载点 mount /dev/cdrom /mnt/ ...

  4. WireShark高级用法

    报文注释 分组注释 尽量使用英文注释 时间显示 显示实际时间 抓包过滤器 按照规则抓取报文 显示过滤器 按照规则显示报文 自动生成过滤条件:做为过滤器应用 着色规则 默认 可自定义着色规则 追踪数据流 ...

  5. 关于open falcon 与nightingale 的一些调研

    针对 open-falcon 与 nightingale 的调研 一.open-falcon 1.1 组件介绍 1.1.1 agent > agent用于采集机器负载监控指标,比如cpu.idl ...

  6. P5488-差分与前缀和【NTT,生成函数】

    正题 题目链接:https://www.luogu.com.cn/problem/P5488 题目大意 求一个长度为$n$的序列的$k$阶差分/前缀和. 解题思路 先考虑前缀和怎么做 搞出来生成函数就 ...

  7. WPF进阶技巧和实战03-控件(2-特殊容器)

    ScrollViewer控件 直接继承ContextControl类,提供了虚拟界面,允许用户围绕更大的元素滚动.只能包含单个元素(ContextControl决定),但可以放置布局控件来实现多个任意 ...

  8. 细说JUC的线程池架构

    前言 线程的创建是需要JVM和OS(操作系统)相互配合的,一次的创建要花费许多的资源. 1.首先,JVM要为该线程分配堆栈和初始化大量内存块,栈内存至少是1MB. 2.其次便是要进行系统的调用,在OS ...

  9. Miller Rabin 详解 && 小清新数学题题解

    在做这道题之前,我们首先来尝试签到题. 签到题 我们定义一个函数:\(qiandao(x)\) 为小于等于 x 的数中与 x 不互质的数的个数.要求 \(\sum\limits _{i=l}^r qi ...

  10. CAD网页Web端显示开发为什么要以WebGIS的思路来开发?

    背景 在之前的博文CAD图DWG解析WebGIS可视化技术分析总结中讲解了如何把CAD的DWG格式的图纸Web可视化的方案.博文发布后,受到不少同行们的关注,也有不少咨询一些专业问题,其中大家可能疑惑 ...