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中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值