Apache IoTDB源码解析(0.11.2版本):RPC服务启动解析
Posted 你是小KS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache IoTDB源码解析(0.11.2版本):RPC服务启动解析相关的知识,希望对你有一定的参考价值。
当前版本:jdk1.8
、iotdb 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的特征:
- 构建了一个serverTransport
- 手动配置了TThreadPoolServer(源码发现这就是一个ExecutorService版的Socket处理)并设置了自定义的线程池
- 设置了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的源码解析