使用 Node.js 构建 BFF 层(二)
前言
上一篇文章介绍了 BFF 的概念和应用场景,并且做了一个简单的 BFFdemo。接下来可以讨论一下如何优化 BFF 层
协议设计
上文提到,RPC
通过传输层协议传输数据,传输层传输的是二进制数据,发送端需要将请求的方法名和数据序列化后发送,接收端接收到二进制数据后则需要反序列化并处理数据。所以,RPC 调用的流程大致如下:
所谓协议,通俗的就是用固定的格式封装成报文数据,双方按照这一固定格式对数据进行发送和接收。例如以前讲过的利用 TCP 实现一个 HTTP 服务。
根据上图的流程,实现设计一个简单的通信通信协议并且实现它,利用这个协议进行通信。这个协议由报文头和报文主体组成
报文头主要有的信息:
| — type — | ——- requestId ——- | —- length —- | — timeout — |
| ———————————————————————— |
| ———————————- body ——————————– |
| ———————————————————————— |
- 报文头的长度是固定的
type
是请求的类型,占1
个字节: 规定0 - REQUEST
1 - RESPONSE
requestId
请求的 ID,占4
个字节:范围 0 ~ 4 * 2^8length
报文主体长度,占4
个字节timeout
响应超时事件,规则报文双文,占1
个字节
到这里,一个简单的报文已经设计完成,其中,header 一共占10个字节
,接下来就是要在代码中描述它。
用 node.js 描述报文
1 | // 需要发送的信息 |
一个发送的报文就描述出来了。当报文被发送出去被接收后,需要将报文数据进行解码,继续来实现一下解码的过程~
1 | // 反序列化方法 |
将报文数据传输进去之后输出
到这里,我们已经实现了 RPC 通信报文的序列化
和反序列化
,接下来就是实现一个传输层服务
。
用 node 实现 RPC 框架
在 node 中创建 TCP 连接需要使用net
的库,不熟悉的可以看一下官方关于 net 的文档
1 | import { createServer, createConnection } from 'net'; |
调用后返回。
成功~ 我们已经成功实现了一个 TCP 通信service
和client
。最后,把通信接入到 BFF 层。
优化 BFF 层
- 修改一下网络层方法,对外暴露处理数据的接口
1 | export function createService(port, callback) { |
- 第二步,将微服务中的 HTTP 服务改为刚刚创建的网络服务
1 | // 订单服务 |
- 最后,修改一下公共请求方法
1 | // 公共请求方法 |
测试一下
执行后返回
小结
本文主要介绍了 RPC 协议的设计和使用 node 实现协议。
将实现好的 RPC 应用到 BFF 层与微服务之间调用。