Thrift源码分析阅读(二)

Thrift总结

总体结构:

Server:

  1. ServerSocket监听请求,请求到达时,读取请求数据。
  2. 根据请求数据创建一个InputTransport,创建OutputTransport
  3. 根据InputTransport和OutputTransport创建相应的input protocol 和 output protocol。
  4. 依据protocol 创建processor,在processor中完成业务分发操作。
  5. 将请求信息结果数据写回客户端。

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细节!

附一个thrift java server测试总结:

https://github.com/m1ch1/mapkeeper/wiki/Thrift-Java-Servers-Compared

时间: 2024-12-13 20:15:55

Thrift源码分析阅读(二)的相关文章

Thrift源码分析阅读(一)

Thrift -Storm篇 从Nimbus启动说起: 当用户通过命令启动nimbus时,Classloader将会找到一个称之为bytetype.storm.daemon.nimbus的一个class文件,这个是由numbis.clj文件编译而成,来看nimbus.clj这个的启动方法: (defn -main [] (-launch (standalone-nimbus))) (standalone-nimbus) 执行这个方法返回一个INimbus接口的实例 执行launch(INimbu

Thrift源码分析(二)-- 协议和编解码

协议和编解码是一个网络应用程序的核心问题之一,客户端和服务器通过约定的协议来传输消息(数据),通过特定的格式来编解码字节流,并转化成业务消息,提供给上层框架调用. Thrift的协议比较简单,它把协议和编解码整合在了一起.抽象类TProtocol定义了协议和编解码的顶层接口.个人感觉采用抽象类而不是接口的方式来定义顶层接口并不好,TProtocol关联了一个TTransport传输对象,而不是提供一个类似getTransport()的接口,导致抽象类的扩展性比接口差. TProtocol主要做了

Unity时钟定时器插件——Vision Timer源码分析之二

Unity时钟定时器插件--Vision Timer源码分析之二 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面的已经介绍了vp_Timer(点击前往查看),vp_TimeUtility相对简单很多,vp_TimeUtility定义了个表示时间的结构Units: C#代码   /// <summary> /// represents a time measured in standard units /// </summar

AndroidPn源码分析(二)

接上篇: (一)客户端与服务器建立连接 上一篇写到ClientSession createClientSession这里,创建一个客户端的session.在SessionManager类中创建了session之后,这里拼接了两个xml内容的text.一个是Build the start packet response,创建一个头条包,作为回应.另外一个是:XMPP 1.0 needs stream features,是xmpp1.0所需要的文件结构.两个消息的格式内容如下: <?xml vers

[Android]Volley源码分析(二)

上一篇介绍了Volley的使用,主要接触了Request与RequestQueue这两个类,这篇就来了解一下这两个类的具体实现. Request类图: Request类: Request是一个抽象类,其中的主要属性: mMethod: 请求方法,目前支持GET, POST, PUT, DELETE, HEAD, OPTIONS,TRACE, PATCH方法 mUrl: 请求Url mErrorListener: 错误处理监听器,请求出错时调用 mSequence: 请求的序号,相同优先级的请求在

Cordova Android源码分析系列二(CordovaWebView相关类分析)

本篇文章是Cordova Android源码分析系列文章的第二篇,主要分析CordovaWebView和CordovaWebViewClient类,通过分析代码可以知道Web网页加载的过程,错误出来,多线程处理等. CordovaWebView类分析 CordovaWebView类继承了Android WebView类,这是一个很自然的实现,共1000多行代码.包含了PluginManager pluginManager,BroadcastReceiver receiver,CordovaInt

区块链教程以太坊源码分析core-state-process源码分析(二)

兄弟连区块链教程以太坊源码分析core-state-process源码分析(二):关于g0的计算,在黄皮书上由详细的介绍和黄皮书有一定出入的部分在于if contractCreation && homestead {igas.SetUint64(params.TxGasContractCreation) 这是因为 Gtxcreate+Gtransaction = TxGasContractCreation func IntrinsicGas(data []byte, contractCre

《极简笔记》源码分析(二)

0. 介绍 此文将对Github上lguipeng大神所开发的 极简笔记 v2.0 (点我下载源码)代码进行分析学习. 通过此文你将学到: 应用源码的研读方法 MVP架构模式 Application的应用 Degger2依赖注入框架 搜索控件的使用 ButterKnife库的使用 Material主题 RecyclerView等新控件的用法 Lambda表达式 Java自定义注解 aFinal框架 RxJava框架 EventBus消息框架 布局文件常用技巧 PreferenceFragment

【Spring】Spring&amp;WEB整合原理及源码分析(二)

一.整合过程 Spring&WEB整合,主要介绍的是Jsp/Servlet容器和Spring整合的过程,当然,这个过程是Spring MVC或Strugs2整合Spring的基础. Spring和Jsp/Servlet整合操作很简单,使用也很简单,按部就班花不到2分钟就搞定了,本节只讲操作不讲原理,更多细节.原理及源码分析后续过程陆续涉及. 1. 导入必须的jar包,本例spring-web-x.x.x.RELEASE.jar: 2. 配置web.xml,本例示例如下: <?xml vers