返回 创建
TiKV源码解析系列文章(七)gRPC Server初始化和启动流程
见解分享
2023-09-08 19:04:39
前言
在上一篇文章中,我们介绍了TiKV中的异步任务调度系统,而本篇文章中,我们将为大家介绍TiKV的另一周边组件——grpc-rs
。
grpc-rs
是PingCAP实现的一个gRPC的Rust绑定,其Server/Client端的代码框架都基于Future
,事件驱动的EventLoop
被隐藏在了库的内部。
在本文中,我们将通过对grpc-rs
的Server端源码进行分析,来为大家介绍gRPC Server的初始化和启动流程。
gRPC Server的初始化
gRPC
Server的初始化主要分为以下几个步骤:
- 创建
GrpcServer
对象 - 添加服务
- 配置Server
创建GrpcServer
对象
GrpcServer
对象是gRPC Server的核心,它负责管理Server端的各种资源,如连接、服务、事件循环等。
pub struct GrpcServer {
// ...
// 各个RPC服务相关的变量,下文细说
// ...
// Server绑定的地址,形如:0.0.0.0:4000
listen_addr: SocketAddr,
// 用于创建一个任务调度器,调度gRPC Server的各种任务,如:发送、接收消息等
scheduler: Option<mio::Scheduler>,
// 事件循环,负责处理各种事件,如:I/O事件、定时器事件等
event_loop: Option<mio::EventLoop<GrpcServer>>,
// ...
// 其他变量
// ...
}
我们可以通过调用GrpcServer::new
函数来创建一个GrpcServer
对象:
pub fn new(listen_addr: SocketAddr) -> GrpcServer {
// ...
// 进行各种初始化工作
// ...
}
添加服务
在创建完GrpcServer
对象后,我们需要向Server中添加服务。服务是gRPC Server提供给客户端的接口,客户端可以通过这些接口来调用Server上的方法。
pub fn add_service(&mut self, service: Service) {
// ...
// 将服务添加到GrpcServer对象中
// ...
}
配置Server
在添加完服务后,我们需要对Server进行配置。配置项包括:
- 监听地址:Server监听的地址,客户端可以通过该地址连接到Server。
- 线程池大小:Server中用于处理客户端请求的线程池大小。
- 协议版本:Server支持的gRPC协议版本。
pub fn configure(
&mut self,
listen_addr: SocketAddr,
thread_pool_size: Option<usize>,
protocol_version: Option<Version>,
) {
// ...
// 对Server进行配置
// ...
}
gRPC Server的启动
在对Server进行配置后,我们可以调用GrpcServer::start
函数来启动Server。
pub fn start(mut self) -> Result<()> {
// ...
// 启动Server
// ...
}
GrpcServer::start
函数主要做以下几件事情:
- 创建一个事件循环。
- 创建一个任务调度器。
- 启动事件循环。
- 将Server监听的地址绑定到事件循环上。
- 等待客户端的连接。
当客户端连接到Server后,Server会创建一个新的线程来处理该客户端的请求。
总结
在本文中,我们介绍了gRPC Server的初始化和启动流程。我们首先介绍了gRPC-rs
库,然后介绍了GrpcServer
对象的创建、添加服务、配置Server和启动Server等过程。希望本文对大家理解gRPC Server的实现原理有所帮助。