概念梳理
在了解 BFF 之前,我们要先对 api 网关有个基本概念。
api 网关
定义
一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。
核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。服务端通过API-GW注册和管理服务
API 网关作用
作为一个系统的后端总入口,接口聚合、路由转换、安全、限流、缓存、日志、监控、重试、熔断等。
API 分类
克里斯·理查德森 (Chris Richardson) 十大软件架构师 在博客中把API网关划分为两种, 即
1. 单节点 API 网关
2. Backends for frontends 网关(BFF 网关)
那什么又是BFF层
我们常说的 Node BFF层,并不完全等同于 BFF 网关,它是微服务里面的一个概念,它只具有 BFF 网关的一部分功能(接口聚合),也可以将它称之为聚合层
或者适配层
。
以下所指和我在其他文章所的 BFF层
均是这个定义。
BFF 的使用场景
- SSR -> 同构
- 服务接口的聚合、裁剪、透传(GraphQL)
BFF 的利弊
优点
- 利于前后端解耦
- 利于多端适配
- 职能分工明确细化
- 利于提升前端体验和性能
缺点
- 增多了数据流链路,不利于排查和定位问题
- 前端增加了开发工作量
- 增加了前后端开发人员的技术要求
- 增加了整体框架的复杂程度
技术预研
Graphql 只是 api 服务的一个方案,这里我只是想顺带尝鲜了解一番,与实践 Node.js 并无太大关系。
- 模板引擎
- RPC
- Graphql
预期目标
使用 Node.js 搭建一个简易的 BFF,支持静态资源服务,SSR,RPC调用后端,Api请求
实践目的
- 学习如何使用 Node.js 搭建一个可用的 BFF。
- 熟悉 RPC 调用的模式。
- 熟悉 Node.js 如何支持 SSR 和 提供接口服务。
实践流程简图
BFF 将请求报文解析后根据路由匹配分发到不同模块进行处理。
graphql api
graphql api 请求先去 schema 中寻找匹配的模型,然后根据模型解析到请求信息后,调用 client 模块建立 socket 链接,完成 RPC 调用后,将获得的数据原路返回。
html 文档请求
需要 SSR 的文档,分别从 views 中找到对应的模板,从 client 的 RPC 调用找到相应数据后,在模板引擎的作用下组成完整的 html 文档,返回给浏览器。
静态资源请求
从设置的静态资源文件夹下找到同名的资源后,读取并返回给浏览器。
项目目录结构
├── SSR 服务端渲染
├── client RPC 客户端
├── protocols RPC 协议内容
├── schema graphql 接口模型
├── server 用 Node.js 模拟的后端
├── static 静态资源
└── views 视图
源码
- 源码