博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
thrift框架介绍
阅读量:6319 次
发布时间:2019-06-22

本文共 4780 字,大约阅读时间需要 15 分钟。

hot3.png

1、前言

Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由生成的代码负责RPC协议层和传输层的实现。

2、架构

Thrift实际上是实现了C/S模式,通过代码生成工具将接口定义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在Thirft描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提服务)便可以了。其中protocol(协议层, 定义数据传输格式,可以为二进制或者XML等)和transport(传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库。

3、 支持的数据传输格式、数据传输方式和服务模型

TBinaryProtocol – 二进制格式.

TCompactProtocol – 压缩格式

TJSONProtocol – JSON格式

TSimpleJSONProtocol –提供JSON只写协议, 生成的文件很容易通过脚本语言解析。

TDebugProtocol – 使用易懂的可读的文本格式,以便于debug

(2) 支持的数据传输方式

TFramedTransport – 以frame为单位进行传输,非阻塞式服务中使用。

TFileTransport – 以文件形式进行传输。

TMemoryTransport – 将内存用于I/O. java实现时内部实际使用了简单的ByteArrayOutputStream。

TZlibTransport – 使用zlib进行压缩, 与其他传输方式联合使用。当前无java实现。

TSimpleServer – 简单的单线程服务模型,常用于测试

TThreadPoolServer – 多线程服务模型,使用标准的阻塞式IO。

TNonblockingServer – 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)

4、 Thrift安装

下载: 

Unix/linux 系统,windows+cygwin

java 语言:JDK、Apache Ant

其他语言:Python、PHP、Perl, etc…

编译安装:./configure –》make –》make install

主要流程:编写服务说明,保存到.thrift文件–》根据需要, 编译.thrift文件,生成相应的语言源代码–》根据实际需要, 编写client端和server端代码。

一般将服务放到一个.thrift文件中,服务的编写语法与C语言语法基本一致,在.thrift文件中有主要有以下几个内容:变量声明、数据声明(struct)和服务接口声明(service, 可以继承其他接口)。

下面分析Thrift的tutorial中带的例子tutorial.thrift

包含头文件:

59行:include “shared.thrift”

指定目标语言:

65行:namespace cpp tutorial

定义变量:

80行:const i32 INT32CONSTANT = 9853

定义结构体:

103行:struct Work {

i32 num1 = 0,

i32 num2,

Operation op,

optional string comment,

}

定义服务:

service Calculator extends shared.SharedService {

void ping(),

i32 add(1:i32 num1, 2:i32 num2),

i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),

oneway void zip()

}

     要生成C++代码:./thrift --gen cpp tutorial.thrift,结果代码存放在gen-cpp目录下
     要生成java代码:./thrift --gen java tutorial.thrift,结果代码存放在gen-java目录下       …..

(2) client端和server端代码编写

client端和sever端代码要调用编译.thrift生成的中间文件。

下面分析cpp文件下面的CppClient.cpp和CppServer.cpp代码

在client端,用户自定义CalculatorClient类型的对象(用户在.thrift文件中声明的服务名称是Calculator, 则生成的中间代码中的主类为CalculatorClient), 该对象中封装了各种服务,可以直接调用(如client.ping()), 然后thrift会通过封装的rpc调用server端同名的函数。

在server端,需要实现在.thrift文件中声明的服务中的所有功能,以便处理client发过来的请求。

4、java实例

定义接口文件

新建一个名为test.thrift的文件。以下是该文件里的内容:

namespace java test.thrift_testservice TestService {  string getStruct(1: i32 num,2: string name)}

这就是一个很简单的接口文件。thrift的引擎就要利用test.thrift生成你指定的语言的代码。这个接口有两个参数,一个是32位的整数,一个是一个字符串,返回值的类型也是一个字符串。关于接口文件定义的方式,请参见下一篇文章《thrift类型定义》。

利用接口文件生成代码

./thrift --gen java test.thrift

你会发现有一个名为"gen-java"的文件夹,该文件夹下就是生成的java代码。

搭建maven环境

利用你的Java IDE构建一个maven工程。这里是pom.xml中需要添加的内容:

org.apache.thrift
libthrift
0.9.3

这里面有thrift运行时所需要的所有依赖jar。

注意,请把gen-java文件夹下的代码粘贴到工程中去!

实现代码

首先实现TestService接口:

package test.thrift_test;import org.apache.thrift.TException;import test.thrift_test.TestService.Iface;//我们定义的test.thrift的接口的具体实现class TestServiceHandler implements Iface{	public String getStruct(int num, String name) throws TException {		return name + num;	}	}

Thrift是CS的通信方式,即有一个server端,和一个client端。

     以下是Server端的示例代码:

package test.thrift_test;import org.apache.thrift.server.TServer;import org.apache.thrift.server.TServer.Args;import org.apache.thrift.server.TSimpleServer;import org.apache.thrift.transport.TServerSocket;import org.apache.thrift.transport.TServerTransport;import org.apache.thrift.transport.TTransportException;public class Server {	public static void main( String[] args ){    	try {    		TestService.Processor processor = new TestService.Processor(new TestServiceHandler());    				TServerTransport serverTransport = new TServerSocket(9090);		TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));		server.serve();		    	} catch (TTransportException e) {		e.printStackTrace();	}    }}

以下是Client端的示例代码:

package test.thrift_test;import org.apache.thrift.TException;import org.apache.thrift.protocol.TBinaryProtocol;import org.apache.thrift.protocol.TProtocol;import org.apache.thrift.transport.TSocket;import org.apache.thrift.transport.TTransport;import org.apache.thrift.transport.TTransportException;public class Client {	public static void main(String[] args) {		TTransport transport = new TSocket("localhost", 9090);		try {			transport.open();			TProtocol protocol = new TBinaryProtocol(transport);			TestService.Client client = new TestService.Client(protocol);			String result = client.getStruct(123, "test");			System.out.println(result);			transport.close();		} catch (TTransportException e) {			e.printStackTrace();		} catch (TException e) {			e.printStackTrace();		}	}}

启动的时候,先运行 Server.java,再运行Client.java。正常情况下,控制台输出结果为:test123

转载于:https://my.oschina.net/u/2000675/blog/1542739

你可能感兴趣的文章
数据库存储结构
查看>>
国内银行CNAPS CODE 查询 苹果开发者,应用内购,需要填写税务相关信息必须的...
查看>>
Linux下抓图工具shutter
查看>>
javascript获取select,checkbox,radio的值
查看>>
Metro Win8风格的按钮(Filp翻转)
查看>>
cookies/session/token
查看>>
清除代码异味
查看>>
【转】从知乎上看到“全栈开发者”讨论之后的自黑
查看>>
Java-IO流
查看>>
Linux入门-6 Linux网络基本配置
查看>>
洗礼灵魂,修炼python(22)--自定义函数(3)—函数作用域,闭包
查看>>
newcoder Tachibana Kanade Loves Probability(小数点后第k位)题解
查看>>
vue项目未加载完成前显示loading...
查看>>
leetcode981
查看>>
安装DNS Server linux 【转载】
查看>>
windows 与linux 下用C++读取sqlite实现文件复制(一)
查看>>
IOS 5 中为什么outlet 输出口总是设定成弱类型(weak)呢
查看>>
Read-Copy Update (RCU)
查看>>
基于centos系统,系统基本检查及巩固
查看>>
在以太坊上如何取消/修改已经提交的交易
查看>>