[三]、基本概念
1.数据类型
- 基本类型:
- bool:布尔值,true 或 false,对应 Java 的 boolean
- byte:8 位有符号整数,对应 Java 的 byte
- i16:16 位有符号整数,对应 Java 的 short
- i32:32 位有符号整数,对应 Java 的 int
- i64:64 位有符号整数,对应 Java 的 long
- double:64 位浮点数,对应 Java 的 double
- string:utf-8编码的字符串,对应 Java 的 String
- 结构体类型:
- struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
- 容器类型:
- list:对应 Java 的 ArrayList
- set:对应 Java 的 HashSet
- map:对应 Java 的 HashMap
- 异常类型:
- exception:对应 Java 的 Exception
- 服务类型:
- service:对应服务的类
2.服务端编码基本步骤:
- 实现服务处理接口impl
- 创建TProcessor
- 创建TServerTransport
- 创建TProtocol
- 创建TServer
- 启动Server
package service.demo; import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TJSONProtocol; import org.apache.thrift.server.TThreadedSelectorServer; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TNonblockingServerSocket; import org.apache.thrift.transport.TNonblockingServerTransport; import org.apache.thrift.transport.TTransportException; import org.apache.thrift.transport.TTransportFactory; import service.demo.thrift.Hello; public class HelloServiceServer2 { /** * 启动 Thrift 服务器 * * @param args */ public static void main(String[] args) { int port = 7912; try { TNonblockingServerTransport transport = new TNonblockingServerSocket( 7912); // 定义处理器 TProcessor processor = new Hello.Processor(new HelloServiceImpl()); // 定义传输工厂(默认使用的是:) TTransportFactory transportFactory = new TFramedTransport.Factory(); // 定义协议工厂(默认使用的是:TBinaryProtocol) TJSONProtocol.Factory protocol = new TJSONProtocol.Factory(); // 定义server参数对象 TThreadedSelectorServer.Args ttsargs = new TThreadedSelectorServer.Args( transport); // 指定该server使用 的 传输,传输协议,业务处理器 ttsargs.protocolFactory(protocol); ttsargs.transportFactory(transportFactory); ttsargs.processor(processor); TThreadedSelectorServer server = new TThreadedSelectorServer( ttsargs); // 启动server server.serve(); } catch (TTransportException e) { e.printStackTrace(); } } }
3.客户端编码基本步骤:
- 创建Transport
- 创建TProtocol
- 基于TTransport和TProtocol创建 Client
- 调用Client的相应方法
同步代码: // 设置调用的服务地址为本地,端口为 7911 TTransport transport = new TSocket("localhost", 7911); transport = new TFramedTransport(transport); transport.open(); // 设置传输协议为 TProtocol protocol = new TJSONProtocol(transport); Hello.Client client = new Hello.Client(protocol); // 调用服务的 helloVoid 方法 client.helloVoid(); //异步代码: TAsyncClientManager clientManager = new TAsyncClientManager(); TNonblockingSocket transport = new TNonblockingSocket("localhost", port, 500000); TJSONProtocol.Factory protocolFactory = new TJSONProtocol.Factory(); Hello.AsyncClient asycnClient = new Hello.AsyncClient( protocolFactory, clientManager, transport); MyCallback callback = new MyCallback(wait); asycnClient.helloString("libin", callback); synchronized (wait) { wait.wait(); } AsyncClient.helloString_call msg = callback.getResult(); System.out.println("================== async client msg = " + msg);
4.数据传输协议
- TBinaryProtocol : 二进制格式.
- TCompactProtocol : 压缩格式
- TJSONProtocol : JSON格式
- TSimpleJSONProtocol : 提供JSON只写协议, 生成的文件很容易通过脚本语言解析
tips:客户端和服务端的协议要一致
thrift里面常见的几种同步异步用法
thrift客户端与服务器之间同步异步的方法:
客户端-服务器 | 调用类型 | 同步服务器 | 异步服务器 | |
同步客户端 | 同步调用 | OK | OK | |
同步客户端 | 异步调用 | OK(不保证返回结果) | 待确认 | |
异步客户端 | --- | NO | OK |
默认使用的是:同步客户端,同步调用,同步服务器
同步客户端,异步调用 ,同步服务器: thrift框架保证传输到位,但应用不保证一定处理完成
需要注意的问题
1. Thrift生成的server端是thread safe的. 但是client端不是thread safe. 所以需要多个thread和server端通信,则每个thread需要initiate一个自己的client实例.
2. 如果服务器采用TNonblockingServer的话,客户端必须采用TFramedTransport。程序链接的时候需要thriftnb。
3. 默认TServerSocket和TSocket都设置了NoDelay为1,使得报文尽快发送出去,如果客户端和服务器间传输数据量较大,通过可以设置NoDelay为0来开启Nagel算法,缓存一段数据后再进行发送,减少报文数量。
TSocket默认开启了Linger,并设置linger time为0,这样close会丢弃socket发送缓冲区中的数据,并向对端发送一个RST报文,close不会被阻塞,立即返回。
TServerSocket默认关闭了Linger,close不会被阻塞,立即返回。
4. fb303作为handler的基类,里面预置了一些rpc方法,用于监控,包括系统状态,请求次数等状态信息。
3. 默认TServerSocket和TSocket都设置了NoDelay为1,使得报文尽快发送出去,如果客户端和服务器间传输数据量较大,通过可以设置NoDelay为0来开启Nagel算法,缓存一段数据后再进行发送,减少报文数量。
TSocket默认开启了Linger,并设置linger time为0,这样close会丢弃socket发送缓冲区中的数据,并向对端发送一个RST报文,close不会被阻塞,立即返回。
TServerSocket默认关闭了Linger,close不会被阻塞,立即返回。
4. fb303作为handler的基类,里面预置了一些rpc方法,用于监控,包括系统状态,请求次数等状态信息。
相关推荐
Thrift开发所需jar
THRIFT开发教程[参照].pdf
编写thrift文件,示例如下:进入命令行,切换到thrift文件所在的目录,然后执行以下命令Thrift -r --gen cpp test.thrift这个
Thrift作为可伸缩的跨语言服务开发框架,网上的资源较少,这里是一个简单的入门小程序,文件中的mylib下包含了依赖的jar包,并且在file目录下放了一个简单的thrift文件和生成thrift-0.9.0.exe工具,直接使用 thrift-...
一个简单的demo,关于使用thrift进行跨语言服务间的通信
Apache Thrift is an open source cross language serialization and RPC framework. With support for over 15 programming languages, Apache Thrift can play an important role in a range of distributed ...
Thrift是一个各种语言开发的中间连接件,是用Java开发的源码模组插件包 可以单独编译安装.可是很多时候 按照官方提供的步骤都是不成功的的. 更要命的问题是,官方采用了SVN自动文件更新服务,在编译过程中有自动连接SVN...
然后运行 restart_thrift.sh 脚本就可以直接启动 ps 一下进程是否正常,如果错误请查看日志 然后就可以使用线下的php直接调用, 代码是从网上找到的,比较容易入门 当然也可以直接导入java目录下的java工程,直接运行...
Laravel开发-thrift-laravel 在拉拉维尔节俭
thrift开发时,将thrift文件自动生成java文件需要用到thrift-0.9.3.exe
thrift安装文件
thrift开发时,将thrift文件自动生成java文件需要用到thrift-0.9.0.exe
thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码thrift源码...
python thrift 开发model
thrift 安装包。
thrift开发时,将thrift文件自动生成java文件需要用到thrift-0.9.0.exe
thrift,Apache Thrift 0.9.2 版本,解压后直接直接安装,可伸缩的跨语言服务开发框架,命令: 解压命令:tar -zxf thrift-0.9.2.tar.gz 安装命令:./configure --with-lua=no && make && make install 查看版本:...
thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, ...
网上一直搜不到Windows下QT使用thrift的例子,自己整了个 QT版本 5.8.0 Boost版本 boost_1_61_0 Thrift版本 thrift-0.10.0
使用wireshark抓取thrift协议接口调用