Apache IoTDB源码解析(0.11.2版本):RPC服务启动解析

Posted 你是小KS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache IoTDB源码解析(0.11.2版本):RPC服务启动解析相关的知识,希望对你有一定的参考价值。

当前版本:jdk1.8iotdb 0.11.2

1. 声明

当前内容主要查看Iotdb服务启动过程中的rpc的绑定的源码解析(通过之前的解析可以得到IotDB的rpc服务必定是Thrift的实现,通信中Session使用的为Client)

2. 找到启动类

一般是通过start-server.bat启动的所以可以通过该脚本发现启动类的位置


发现使用org.apache.iotdb.db.service.IoTDB这个类作为启动类,开始下载源码并找到启动类


可以从里面找到IoTDB这个类就可以得到结果了

3. 分析IoTDB启动类


构建一个IoTDB的实例,开启校验检查,最后调用setUp方法启动

通过查看代码发现RegisterManager在注册一个实例的时候就会自动调用该实例的start方法(Thrift本身就是用来构建rpc服务的)

继续找到RPCService发现没有start方法,所以可以通过ThriftService得到start方法

public class RPCService extends ThriftService implements RPCServiceMBean

ThriftService 中的代码

@Override
 public  void start()  throws StartupException 
   JMXService.registerMBean(getImplementation(), mbeanName);
   startService();
 

发现该方法中具有注册JMX服务的实例操作,并实际为startService方法


  @SuppressWarnings("squid:S2276")
  public synchronized void startService() throws StartupException 
    if (STATUS_UP.equals(getRPCServiceStatus())) 
      logger.info(":  has been already running now", IoTDBConstant.GLOBAL_DB_NAME,
          this.getID().getName());
      return;
    
    logger.info(": start ...", IoTDBConstant.GLOBAL_DB_NAME, this.getID().getName());
    try 
      reset();
      initTProcessor();  // 创建当前的TProcessor就是TServer使用的处理,实际上就是构建TSServiceImpl实例操作
      initThriftServiceThread(); // 构建ThriftService线程用于启动rpc的服务
      thriftServiceThread.setThreadStopLatch(stopLatch);
      thriftServiceThread.start(); // 启动这个线程
	  // 阻塞直到服务启动为止
      while (!thriftServiceThread.isServing()) 
        //sleep 100ms for waiting the rpc server start.
        Thread.sleep(100);
      
     catch (InterruptedException | ClassNotFoundException |
        IllegalAccessException | InstantiationException e) 
      Thread.currentThread().interrupt();
      throw new StartupException(this.getID().getName(), e.getMessage());
    

    logger.info(": start  successfully, listening on ip  port ", IoTDBConstant.GLOBAL_DB_NAME,
        this.getID().getName(), getBindIP(), getBindPort());
  

通过上面可以得到IoTDB的rpc服务实际上是由一个ThriftServiceThread构建的TServer并完成服务端的rpc启动的(启动会阻塞并直到rpc服务启动为止,异常会终止服务启动)

至于当前的为什么使用TTServiceImpl作为服务端的处理这是由于下面这个导致的

public class TSServiceImpl implements TSIService.Iface, ServerContext 

4. 服务的启动

观察ThriftServiceThread的构造函数

得到ThriftServiceThread的特征:

  1. 构建了一个serverTransport
  2. 手动配置了TThreadPoolServer(源码发现这就是一个ExecutorService版的Socket处理)并设置了自定义的线程池
  3. 设置了TFastFramedTransport(这就是为什么Session中需要配置相同的原因)

找到run方法

这里其实就是和Thrift构建server的启动方式完全一样都是调用serve方法

5. 总结

1. IoTDB是使用Thrift作为客户端和服务器端的通信框架,使用为线程池方式的socket实现

2. IoTDB是采用一个ThriftServiceThread的线程方式启动一个Thrift的Server端

3. IoTDB本身会将某些数据写入到JMX中

以上是关于Apache IoTDB源码解析(0.11.2版本):RPC服务启动解析的主要内容,如果未能解决你的问题,请参考以下文章

Apache IoTDB源码解析(0.11.2版本):Session的源码解析

Apache IoTDB源码解析(0.11.2版本):RPC服务启动解析

Apache IoTDB源码解析(0.11.2版本):MultiFileLogNodeManager服务解析

Apache IoTDB源码解析(0.11.2版本):MultiFileLogNodeManager服务解析

Apache IoTDB源码解析(0.11.2版本):Session执行executeQueryStatement的源码解析

Apache IoTDB源码解析(0.11.2版本):Session执行executeQueryStatement的源码解析