【Thrift】Thrift框架和使用教程-- C/S框架使用教程

1、前言

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

在xxx.Thrift文件中用Thrift语法写接口和数据类型---> 用thrift编译器thrift_xxx_xx.exe 编译xxx.Thrift文件生成指定语言的代码文件(如生成c++接口代码文件:thrift_0.8.0_win32.exe -r --gen csharp sample.thrift)-->将代码文件加入到工程中,调用接口。

【Thrift】Thrift框架和使用教程-- C/S框架使用教程_第1张图片

图片来源:Thrift框架-具体使用 - 岑惜 - 博客园

2、架构

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

【Thrift】Thrift框架和使用教程-- C/S框架使用教程_第2张图片

【Thrift】Thrift框架和使用教程-- C/S框架使用教程_第3张图片

实战:Thrift框架使用教程

注:这个框架的强大之处在于它只需要写一个简单的thrift脚本就能生成不同语言的SourceCode,这些SourceCode包含了几乎所有Client端以及Server端代码,

你只需要简单几句代码的调用就能达到想要的结果,轻松实现C-S交互的跨平台。

1.安装

1)下载页面:Apache Thrift - Download

              其中,thrift-0.8.0.tar.gz 是Thrift对应不同语言的源码,我们需要它来编译Library。 (推荐用vcpkg来安装:【vcpkg】vcpkg:用于 Windows、Linux 和 macOS 的 C++ 包管理器_bandaoyu的博客-CSDN博客)

              Thrift compiler for Windows (thrift-0.8.0.exe)是针对windows平台的编译器,我们需要它在windows上编译xxx.thrift生成不同语言的代码文件。

2)编译Library 

解压下载好的Thrift源码,在lib文件夹下找到你所需语言的源码工程,使用该工程编译所需的Library。

教程:Windows下的Thrift环境搭建及简单教程 - 知乎

2.编写thrift脚本

编写thrift脚本的基本教程在官方wiki上有:

              http://wiki.apache.org/thrift/Tutorial

以下是一个最简单的例子:

sample.thrift

struct RequestStruct
{
1 :i32 requestId
2 :i32 requestData
}//定义一个请求包结构



struct ResponseStruct
{
1 :i32 requestId
2 :string responseData
}//定义一个响应包结构



//定义一个收发数据服务接口
service SharedService
{
    ResponseStruct SendReceive(1: RequestStruct request)
}

3.编译thrift脚本

解压下载好的windows编译器,执行以下命令行对脚本进行编译:

//C++
thrift-0.13.0.exe -r --gen cpp sample.thrift
//C#
thrift-0.13.0.exe -r --gen csharp sample.thrift
//java
thrift-0.13.0 -gen java sample.thrift

这里可能有警告信息:
[WARNING:generation:1] The 'csharp' target is deprecated. Consider using 'netstd' instead.
不用管它,不影响。

其中,上面的csharp/cpp/java是要编译的目标语言,可以替换成你想要的语言,编译生成的代码在gen-xxx文件夹里。

4.使用

(1) 先把从thrift脚本编译得到的代码和编译好的Library添加到你的项目里。

(2) Client端使用例子: 

//创建传输协议,这里用的是Socket,你也可以用Http等其它Thrift支持的协议

TTransport  transport = newTSocket("localhost", 9090);

//创建数据交互协议,这里用的是Binary,你也可以用Jason等Thrift支持的协议

TProtocol  protocol = newTBinaryProtocol(transport);

//创建client,这个Client是由thrift脚本自动生成的

SharedService.Client ? client = ? newSharedService.Client(protocol);

//与服务器交互开始

transport.Open();

//发送一个请求并等待服务器返回结果

//请求包是由脚本的SendReceive接口的参数指定,下面的request就是请求包

//响应包是由脚本的SendReceive接口的返回值指定,下面的result就是接收包

RequestStruct  request = newRequestStruct
{

    RequestId = 0,
    RequestData = 1

};

ResponseStruct  result = client.SendReceive(request);

//停止交互

transport.Close();

(3)Server端使用例子:   

//Server端首先要实现Iface接口,在这里对client端的请求进行处理,返回结果数据
classServerHandler:
SharedService.Iface
{

    publicServerHandler() {}
    publicResponseStruct  SendReceive(RequestStruct  request)
    {

        ResponseStruct  result =  newResponseStruct()
        {
            RequestId = request.RequestId,
            RequestData  = "This is a return value from server"
        };

        return  result;
    }
}


//根据我们上面实现的请求处理类,创建一个请求处理器
ServerHandler  handler =  newServerHandler();
SharedService.Processor  processor =  newSharedService.Processor(handler);

//创建Server端传输协议并监听端口,这里的传输协议要与client端一致
TServerTransport  serverTransport = newTServerSocket(9090);

//创建一个server,你也可以用多线程等Thrift支持的Server
TServer  server = newTSimpleServer(processor, serverTransport);

//启动server并开始监听
server.Serve();

好了,欢呼吧,就这样完成了,你是不是很惊讶使用thrift完成一个基本的C-S交互居然如此简单!!!!

java语言的例子:Windows下Thrift安装与简单使用_灰灰是菇凉呀的博客-CSDN博客_thrift安装 windows

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

(1)支持的传输格式
TBinaryProtocol – 二进制格式.
TCompactProtocol – 压缩格式
TJSONProtocol – JSON格式
TSimpleJSONProtocol –提供JSON只写协议, 生成的文件很容易通过脚本语言解析。
TDebugProtocol – 使用易懂的可读的文本格式,以便于debug

(2) 支持的数据传输方式
TSocket -阻塞式socker
TFramedTransport – 以frame为单位进行传输,非阻塞式服务中使用。
TFileTransport – 以文件形式进行传输。
TMemoryTransport – 将内存用于I/O. java实现时内部实际使用了简单的ByteArrayOutputStream。
TZlibTransport – 使用zlib进行压缩, 与其他传输方式联合使用。当前无java实现。

(3)支持的服务模型
TSimpleServer – 简单的单线程服务模型,常用于测试
TThreadPoolServer – 多线程服务模型,使用标准的阻塞式IO。
TNonblockingServer – 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)  

thrift 的原理和使用 https://www.cnblogs.com/chenny7/p/4224720.html

Apache Download Mirrors--http://www.apache.org/dyn/closer.cgi?path=/thrift/0.12.0/thrift-0.12.0.tar.gz

Thrift C++ Server demo 实现_https://blog.csdn.net/yuzx2008/article/details/50179033

你可能感兴趣的:(网络编程,扩展知识,java,开发语言)