一、概述

RPC 传输层服务端负责接收客户端序列化后的请求数据,同时把响应数据序列化后传给客户端。

二、架构设计

2.1. 服务端引导程序 TransportServerBootstrap

接口 TransportServerBootstrap 定义了服务端引导程序的规范,服务端引|导程序旨在当客户端与服务端建立连接之后,在服务端持
有的客户端管道上执行的引导程序。TransportServer 的构造器中的 bootstraps 是 TransportServerBootstrap 的列表。

2.2. 组件

2.2.1. TransportServer

TransportServer 是 RPC 框架的服务端,可提供高效、低级别的流服务。

TransportServer

三、实现

3.1. TransportServer

3.1.1. 构造器

TransportServer 的构造器中的各个变量如下。

1
2
3
4
5
6
7
8
public TransportServer(
TransportContext context,
String hostToBind,
int portToBind,
RpcHandler appRpcHandler,
List<TransportServerBootstrap> bootstraps) {
//...
}
  1. context: 参数传递的TransportContext的引|用。

  2. conf: 指TransportConf, 这里通过调用 TransportContext 的 getConf() 获取。

  3. appRpcHandler: RPC请求处理器RpcHandler。

  4. bootstraps: 参数传递的TransportServerBootstrap列表。

  5. bootstraps 是 TransportServerBootstrap 的列表。

    接口 TransportServerBootstrap 定义了服务端引导程序的规范, 服务端引导程序旨在当客户端与服务端建立连接之后,在服务端持有的客户端管道上执行的引导程序

3.1.2. 初始化 TransportServer

NettyRpcEnv 中创建 TransportServer 的代码如下:

1
@volatile private var server: TransportServer = _

TransportServer 在此时并未实例化,那么它是何时实例化的🤔️~

TransportContext.createServer() 方法用于创建 TransportServer, TransportServer 的构造器中调用了 init 方法,init 方法用于对 TransportServer 进行初始化。

1
2
3
public TransportServer createServer(int port, List<TransportServerBootstrap> bootstraps) {
return new TransportServer(this, null, port, rpcHandler, bootstraps);
}
  1. 创建 bossGroup 和 workerGroup

  2. 创建一个汇集 ByteBuf 但对本地线程缓存禁用的分配器。

  3. 调用 Netty 的 API 创建 Netty 的服务端根引导程序并对其进行配置。

  4. 为根引导程序设置管道初始化回调函数,此回调函数首先设置 TransportServerBootstrap 到根引导程序中,然后调用

    TransportContext 的 initializePipeline 方法初始化 Channel 的 pipeline

  5. 给根引导程序绑定Socket的监听端口,最后返回监听的端口