返回

TiKV源码解析系列文章(七)gRPC Server初始化和启动流程

见解分享

前言

在上一篇文章中,我们介绍了TiKV中的异步任务调度系统,而本篇文章中,我们将为大家介绍TiKV的另一周边组件——grpc-rs

grpc-rs是PingCAP实现的一个gRPC的Rust绑定,其Server/Client端的代码框架都基于Future,事件驱动的EventLoop被隐藏在了库的内部。

在本文中,我们将通过对grpc-rs的Server端源码进行分析,来为大家介绍gRPC Server的初始化和启动流程。

gRPC Server的初始化

gRPC Server的初始化主要分为以下几个步骤:

  1. 创建GrpcServer对象
  2. 添加服务
  3. 配置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函数主要做以下几件事情:

  1. 创建一个事件循环。
  2. 创建一个任务调度器。
  3. 启动事件循环。
  4. 将Server监听的地址绑定到事件循环上。
  5. 等待客户端的连接。

当客户端连接到Server后,Server会创建一个新的线程来处理该客户端的请求。

总结

在本文中,我们介绍了gRPC Server的初始化和启动流程。我们首先介绍了gRPC-rs库,然后介绍了GrpcServer对象的创建、添加服务、配置Server和启动Server等过程。希望本文对大家理解gRPC Server的实现原理有所帮助。

参考资料