thrift 简介
thrift 最初由 facebook 开发 , 开源的。Thrift 是一个软件框架(远程过程调用框架),用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引 擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。注意特征: 跨语言,所以后端开源软件都在使用,比如 Cassandra , hbase 等等。
使用:
以 java 为例,只需要定义好接口,以及服务端实现,其他的 远程调用 模型,编解码,通过配置,就可以使用,不需要自己关心。
比如:定义 thrift 接口文件:HelloWorldService.thrift
namespace * com.jd.iot.mapan
/**
* 测试接口sayhello
**/
service HelloWorldService {
/**
* sayhello
* Parmas:
* username:用户名
**/
string sayHello(1:string username),
}
通过 thrift 编译,会生成 1000 多行的代码类:
生成如下的类:
public class HelloWorldService
定义实现:
我们看到,在 thrift 生成的代码里面,包括一个接口 HelloWorldService.Iface 接口,只需要实现此接口就行
public class HelloWorldServiceImpl implements HelloWorldService.Iface{
@Override
public String sayHello(String username) throws TException {
return null;
}
}
所以,这个 RPC 调用的逻辑,可以不用关心他的中间调用过程,只需要查看他 实现代码逻辑就可以了。
iotdb thrift 调用:
查看 iotdb 源码,包括如下的 thrift 代码:
| 文件 | 说明 | |
| client.thrift | 客户端调用的代码,例如 : client 调用, | |
| confignode.thrift | confignode 提供的 RPC 接口 | |
| datanode.thrift | datanode 提供的 RPC 接口 | |
client RPC 接口:
总共 47 方法, 这个就是 iotdb client 端操作调用的所有的接口,所有的实现在 IClientRPCServiceWithHandler 类中,实现类如下:
两个的区别:
TSServiceImpl : iotdb 老单机模式云端的实现
ClientRPCServiceImpl : iotdb 分布式模式调用的实现, 以及,在第一篇文章里面写的, iotdb 提供了一个 start-new-server.sh 里面 单机模式的 实现,
具体的实现,后面文章再写。
client.thrift :
service IClientRPCService {
TSOpenSessionResp openSession(1:TSOpenSessionReq req);
common.TSStatus closeSession(1:TSCloseSessionReq req);
TSExecuteStatementResp executeStatement(1:TSExecuteStatementReq req);
common.TSStatus executeBatchStatement(1:TSExecuteBatchStatementReq req);
TSExecuteStatementResp executeQueryStatement(1:TSExecuteStatementReq req);
TSExecuteStatementResp executeUpdateStatement(1:TSExecuteStatementReq req);
TSFetchResultsResp fetchResults(1:TSFetchResultsReq req)
TSFetchMetadataResp fetchMetadata(1:TSFetchMetadataReq req)
common.TSStatus cancelOperation(1:TSCancelOperationReq req);
common.TSStatus closeOperation(1:TSCloseOperationReq req);
TSGetTimeZoneResp getTimeZone(1:i64 sessionId);
common.TSStatus setTimeZone(1:TSSetTimeZoneReq req);
ServerProperties getProperties();
common.TSStatus setStorageGroup(1:i64 sessionId, 2:string storageGroup);
common.TSStatus createTimeseries(1:TSCreateTimeseriesReq req);
common.TSStatus createAlignedTimeseries(1:TSCreateAlignedTimeseriesReq req);
common.TSStatus createMultiTimeseries(1:TSCreateMultiTimeseriesReq req);
common.TSStatus deleteTimeseries(1:i64 sessionId, 2:list path)
common.TSStatus deleteStorageGroups(1:i64 sessionId, 2:list storageGroup);
common.TSStatus insertRecord(1:TSInsertRecordReq req);
common.TSStatus insertStringRecord(1:TSInsertStringRecordReq req);
common.TSStatus insertTablet(1:TSInsertTabletReq req);
common.TSStatus insertTablets(1:TSInsertTabletsReq req);
common.TSStatus insertRecords(1:TSInsertRecordsReq req);
common.TSStatus insertRecordsOfOneDevice(1:TSInsertRecordsOfOneDeviceReq req);
common.TSStatus insertStringRecordsOfOneDevice(1:TSInsertStringRecordsOfOneDeviceReq req);
common.TSStatus insertStringRecords(1:TSInsertStringRecordsReq req);
common.TSStatus testInsertTablet(1:TSInsertTabletReq req);
common.TSStatus testInsertTablets(1:TSInsertTabletsReq req);
common.TSStatus testInsertRecord(1:TSInsertRecordReq req);
common.TSStatus testInsertStringRecord(1:TSInsertStringRecordReq req);
common.TSStatus testInsertRecords(1:TSInsertRecordsReq req);
common.TSStatus testInsertRecordsOfOneDevice(1:TSInsertRecordsOfOneDeviceReq req);
common.TSStatus testInsertStringRecords(1:TSInsertStringRecordsReq req);
common.TSStatus deleteData(1:TSDeleteDataReq req);
TSExecuteStatementResp executeRawDataQuery(1:TSRawDataQueryReq req);
TSExecuteStatementResp executeLastDataQuery(1:TSLastDataQueryReq req);
i64 requestStatementId(1:i64 sessionId);
common.TSStatus createSchemaTemplate(1:TSCreateSchemaTemplateReq req);
common.TSStatus appendSchemaTemplate(1:TSAppendSchemaTemplateReq req);
common.TSStatus pruneSchemaTemplate(1:TSPruneSchemaTemplateReq req);
TSQueryTemplateResp querySchemaTemplate(1:TSQueryTemplateReq req);
common.TSStatus setSchemaTemplate(1:TSSetSchemaTemplateReq req);
common.TSStatus unsetSchemaTemplate(1:TSUnsetSchemaTemplateReq req);
common.TSStatus dropSchemaTemplate(1:TSDropSchemaTemplateReq req);
common.TSStatus handshake(TSyncIdentityInfo info);
common.TSStatus sendPipeData(1:binary buff);
common.TSStatus sendFile(1:TSyncTransportMetaInfo metaInfo, 2:binary buff);
}