Thrift源码分析阅读
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thrift源码分析阅读相关的知识,希望对你有一定的参考价值。
Thrift总结
总体结构:
Server:
- ServerSocket监听请求,请求到达时,读取请求数据。
- 根据请求数据创建一个InputTransport,创建OutputTransport
- 根据InputTransport和OutputTransport创建相应的input protocol 和 output protocol。
- 依据protocol 创建processor,在processor中完成业务分发操作。
- 将请求信息结果数据写回客户端。
Transport:
提供了一个读取/写入网络的一个抽象,在读取时,可以指定到消费多少个字节,当前读取到的位置。写入时,控制写入的位置等,这些操作其实是在内存byte buffer上进行的。
Protocol:
定义了数据怎样解析读取,怎样写入,如TBinaryProtocol 协议的定义格式。
Processor:
业务分发,操作Input/Output
类结构图:
在TTransport中 TFramedTransport和TFastFramedTransport使用了装饰模式。
看到这里,还以为这种将请求与业务逻辑的映射关系写到代码中并不是一个很好的写法,然而他提供了方式来解决,即编译thrift文件,比如,我们定义一个这样的hello.thrift服务:
namespace java com.kuxun.generated
service Hello{
/**
* 1: 后面需要加一个空格
*/
string welcome (1: string name)
}
经过 thrift –gen java hello.thrift后,帮我们自动生成请求与业务逻辑的映射关系, 客户端,需要实现的service接口Iface, 而交给用户的,是需要实现这些定义好的业务,在创建一个server的时,配置好实现的业务逻辑代码即可,这样确实更轻松的解耦 框架与业务逻辑,确实是一个比较优秀的框架。
不仅如此,服务可以采用不同的实现,如C、Python、php等,定义好业务逻辑后,直接采用thrift --gen <language> *.thrift 即可生成不同类型的逻辑转发器、业务接口等。代码可以写得如此轻松和可拓展!
在构建一个Server的服务时,我们需要配置TServerTransport、TProtocol协议、配置定义的业务逻辑即可。
TNonblockingServerTransport transport = new TNonblockingServerSocket(8081);
Args args = new THsHaServer.Args(transport)
.protocolFactory(new TBinaryProtocol.Factory(false, true))
.processor(new Hello.Processor<Hello.Iface>
(new HelloIfaceImpl()))
.workerThreads(10);
TServer server = new THsHaServer(args);
server.serve();
通过源码可以知道,服务端在读取完客户端的数据时,并没有将对应的socket连接关闭掉,所以这个相当于一个长连接,因此这个在客户端不在使用的时候,必须将他关闭,另外,服务端读取数据时,首先会读取数据的长度,因此客户端socket写入数据时,必须将socket套入到TFramedTransport,
TTransport transport = new TFramedTransport.Factory().getTransport(new TSocket("localhost", 8081));
TFramedTransport中有个缓存,当调用flush时,将数据流大小信息加入到整个输出流中。
在后续的过程中,可以关注更多的thrift细节!
https://github.com/m1ch1/mapkeeper/wiki/Thrift-Java-Servers-Compared
以上是关于Thrift源码分析阅读的主要内容,如果未能解决你的问题,请参考以下文章