之前没有用过RPC相关的框架,只是使用过WebService进行远程通信。
一开始在选择技术的时候的时候,考虑的是Thrift 和 阿里的Dubbo , 后来选择了Thrift,因为Thrift跨语言好一些。公司有一些程序,是使用C++、Python写的,必须兼容。
阿里的Dubbo框架更侧重服务治理
下面开始贴上以前在公司,做的笔记...参考了网上的资料,资料的网址当时没有记录,就不写了....
Apache Thrift
远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发
所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势
Thrift 允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言
注 : 编译器是指thrift-0.9.0.exe
另 :
a. 最初由facebook开发用做系统内多个语言之间的RPC通信 。
b. 2007年由facebook贡献到apache基金 ,现在是apache下的opensource之一 。
c. 支持多种语言之间的RPC方式的通信:php语言client可以构造一个对象,调用相应的服务方法来调用java语言的服务 ,跨越语言的C/S rpc 调用 。
Thrift 如何工作
1. 定义一个服务调用接口
2. Server端 : 接口实现 ----- impl的实现 ----- 注册该服务实现(端口) ---- 启动服务
3. Client端 : 通过IP , 端口 , 服务名 得到服务 , 通过接口调用.
数据传输方式 : Java对象序列化.
Thritf架构
Thrift包含一个完整的堆栈结构用于构建客户端和服务端
1. 黄色部分 : 用户实现业务逻辑
2. 褐色部分 : 根据Thrift定义的服务接口描述文件生成的客户端和服务端代码框架.
3. 红色部分 : 根据Thrift文件生成代码实现数据的读写操作.
4. 红色部分以下是 : Thrift的传输体系 / 协议 以及 底层I/O通信
5. 使用Thrift可以很方便的定义一个服务并且选择不同的传输协议和传输层而不用重写代码.
6. Thrift 服务器包含用于绑定协议和传输层的基础架构,它提供阻塞、非阻塞、单线程和多线程的模式运行在服务器上,可以配合服务器 / 容器一起运行,可以和现有的 J2EE 服务器 /Web 容器无缝的结合
Thrift 数据类型
1. 基本类型
i. bool:布尔值,true 或 false,对应 Java 的 boolean
ii. byte:8 位有符号整数,对应 Java 的 byte
iii. i16:16 位有符号整数,对应 Java 的 short
iv. i32:32 位有符号整数,对应 Java 的 int
v. i64:64 位有符号整数,对应 Java 的 long
vi. double:64 位浮点数,对应 Java 的 double
vii. string:未知编码文本或二进制字符串,对应 Java 的 String
2. 结构体类型
i. struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
3. 容器类型
i. List : 对应Java中的ArrayList
ii. Set : 对应Java中的HashSet
iii. Map : 对应Java中的HashMap
4. 异常类型
i. Exception : 对应Java中的Exception
5. 服务类型
i. Service : 对应服务的类.
Thrift协议
Thrift 可以让用户选择客户端与服务端之间传输通信协议的类别.
在传输协议上总体划分为文本 (text) 和二进制 (binary) 传输协议,为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议为多数,有时还会使用基于文本类型的协议,这需要根据项目 / 产品中的实际需求。
在实际开发中, 服务端协议与客户端协议必须保持一致,否则会出现异常.
常用协议有以下几种 :
1. TBinaryProtocol : 二进制编码格式进行数据传输.
2. TCompactProtocol : 高效,密集的二进制编码格式进行数据传输.
i. 构建方法 :
1) TCompactProtocol.Factory proFactory = new TCompactProtocol.Factory();
2) TCompactProtocol protocol = new TCompactProtocol(transport);
3. TJSONProtocol : 使用JSON的数据编码协议进行数据传输.
i. 构建方法 :
1) TJSONProtocol.Factory proFactory = new TJSONProtocol.Factory();
2) TJSONProtocol protocol = new TJSONProtocol(transport);
* TBinaryProtocol – 二进制编码格式进行数据传输。
* TCompactProtocol – 这种协议非常有效的,使用Variable-Length Quantity (VLQ) 编码对数据进行压缩。
* TJSONProtocol – 使用JSON的数据编码协议进行数据传输。
* TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析
* TDebugProtocol – 在开发的过程中帮助开发人员调试用的,以文本的形式展现方便阅读。
Thrift服务端类型
常见的服务端类型有以下几种 :
1. TSimpleServer : 单线程服务器端使用标准的阻塞式IO
i. 构建方法 :
TServerSocket serverTransport = new TServerSocket(7911);
TProcessor processor = new Hello.Processor(new HelloServiceImpl());
TServer server = new TSimpleServer(processor, serverTransport);
System.out.println("Start server on port 7911...");
server.serve();
2. TThreadPoolServer : 多线程服务器端使用标准的阻塞式IO
TNonblockingServer : 多线程服务器端使用非阻塞式IO
* TSimpleServer - 单线程服务器端使用标准的堵塞式I/O。
* TThreadPoolServer - 多线程服务器端使用标准的堵塞式I/O。
* TNonblockingServer – 多线程服务器端使用非堵塞式I/O,并且实现了Java中的NIO通道。
server端
TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(Integer.valueOf(config.getServer_port()));
Thrift_WhoisServer.Processor processor = new Thrift_WhoisServer.Processor(new WhoisServerImpl());
Factory protoFactory = new TBinaryProtocol.Factory(true, true);
TServer server = new THsHaServer(new Args(serverTransport).workerThreads(config.getServer_pool_size()).processor(processor).protocolFactory(protoFactory));
client端
transport = new TSocket(serverIp, serverPort, timeOut);
TFramedTransport t = new TFramedTransport(transport);
TProtocol protocol = new TBinaryProtocol(t);
client = new Thrift_WhoisServer.Client(protocol);
transport.open();
Thrift与其他传输方式相比较
xml与JSON相比体积太大,但是xml传统,也不算复杂。
json 体积较小,新颖,但不够完善。
thrift 体积超小,使用起来比较麻烦,不如前两者轻便,但是对于1.高并发、2.数据传输量大、3.多语言环境, 满足其中2点使用 thrift还是值得的。
Thrift的安装使用
thrift.exe我上传不了csdn,大家,可以去官网下载...
1.下载thrift-0.9.2 .exe文件命名为thrift .exe放在c盘下的一个Thtift文件夹中。
2. 环境变量的设置
3. 测试