一、什么是thrift

  Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由FaceBook为“大规模跨语言服务开发”而开发的。它通过一个代码生成引擎联合了一个软件栈,来创建不同程度的、无缝的跨平台高效服。后来捐献给apache组织了。

二、thrift的架构  

Thrift包含一套完整的栈来创建客户端和服务端程序。顶层部分是由Thrift定义生成的代码。而服务则由这个文件客户端和处理器代码生成。在生成的代码里会创建不同于内建类型的数据结构,并将其作为结果发送。协议和传输层是运行时库的一部分。有了Thrift,就可以定义一个服务或改变通讯和传输协议,而无需重新编译代码。除了客户端部分之外,Thrift还包括服务器基础设施来集成协议和传输,如阻塞、非阻塞及多线程服务器。栈中作为I/O基础的部分对于不同的语言则有不同的实现。
Thrift支持众多通讯协议:
  • TBinaryProtocol – 一种简单的二进制格式,简单,但没有为空间效率而优化。比文本协议处理起来更快,但更难于调试。
  • TCompactProtocol – 更紧凑的二进制格式,处理起来通常同样高效。
  • TDebugProtocol – 一种人类可读的文本格式,用来协助调试。
  • TDenseProtocol – 与TCompactProtocol类似,将传输数据的元信息剥离。
  • TJSONProtocol – 使用JSON对数据编码。
  • TSimpleJSONProtocol – 一种只写协议,它不能被Thrift解析,因为它使用JSON时丢弃了元数据。适合用脚本语言来解析。
支持的传输协议有:
  • TFileTransport – 该传输协议会写文件。
  • TFramedTransport – 当使用一个非阻塞服务器时,要求使用这个传输协议。它按帧来发送数据,其中每一帧的开头是长度信息。
  • TMemoryTransport – 使用存储器映射输入输出。(Java的实现使用了一个简单的ByteArrayOutputStream。)
  • TSocket – 使用阻塞的套接字I/O来传输。
  • TZlibTransport – 用Zlib执行压缩。用于连接另一个传输协议。
Thrift还提供众多的服务器,包括:
  • TNonblockingServer – 一个多线程服务器,它使用非阻塞I/O(Java的实现使用了NIO通道)。TFramedTransport必须跟这个服务器配套使用。
  • TSimpleServer – 一个单线程服务器,它使用标准的阻塞I/O。测试时很有用。
  • TThreadPoolServer – 一个多线程服务器,它使用标准的阻塞I/O。

三、thrift的使用

  1.下载并安装thrift.exe,然后配置环境变量,使用thrift -version 来验证是否安装成功

  2.编写.thrift文件

  

//名称空间,用来隔离代码,防止数据类型定义中名字冲突
namespace java netty_thrift //引入其他thrift文件
//include "test.thrift" /**
数据类型定义,通过typedef将thrift中的类型和java中的类型对应起来,然后直接使用java中的数据类型,方便理解
下面就是thrift中使用的基本数据类型
*/
typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String
typedef double double //定义常量
//const int CONSTANT_A = 12345 /**
定义结构
1.每个属性都有唯一一个正整数标识符
2.每个属性都可以标记为optional和required
3.每个结构体都可以包含其他结构体
4.每个属性都有默认值
5.
*/
struct Person{
1: optional String username
2: optional int age
3: optional boolean married
} //异常定义
exception DataException{
1: optional String message
2: optional String callStack
3: optional String date
} //服务定义
service PersonService{ Person getPersonByName(1: required String username) throws (1: DataException dataException), void savePerson(1: required Person person)
}
enum TweetType {//仅仅是作为一个例子,后面生成代码时没有用到

TWEET,         // 编译器默认从1开始赋值
RETWEET = 2, // 可以赋予某个常量某个整数
DM = 0xa, //允许常量是十六进制整数
REPLY // 末尾没有逗号
}

  3.生成java代码

    使用命令行thrift -gen java D:\WorkSpace1\netty\src\netty_thrift\data.thrift   生成的文件在执行命令时所在的目录。

  4.编写服务端和客户端的代码

    

public class Server {

    public static void main(String[] args) throws TTransportException {
TNonblockingServerSocket socket = new TNonblockingServerSocket(9999);
org.apache.thrift.server.THsHaServer.Args args3 = new THsHaServer.Args(socket);
Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl()); args3.protocolFactory(new TCompactProtocol.Factory());
args3.transportFactory(new TFramedTransport.Factory());
args3.processorFactory(new TProcessorFactory(processor)); THsHaServer server = new THsHaServer(args3);
server.serve();
} }
public class PersonServiceImpl implements PersonService.Iface {

    @Override
public Person getPersonByName(String username) throws DataException, TException {
Person p = new Person();
p.setUsername(username);
p.setAge(28);
p.setMarried(false);
return p;
} @Override
public void savePerson(Person person) throws TException {
System.out.println(person);
} }
public class Client {

    public static void main(String[] args) throws DataException, TException {
TFramedTransport tFramedTransport = new TFramedTransport(new TSocket("localhost",9999));
TProtocol protocol = new TCompactProtocol(tFramedTransport);
netty_thrift.PersonService.Client client = new PersonService.Client(protocol);
tFramedTransport.open(); Person person = client.getPersonByName("kyle");
System.out.println(person); Person p = new Person();
p.setUsername("xiaoming");
p.setAge(24);
p.setMarried(false);
client.savePerson(p); }
}

thrift使用的更多相关文章

  1. 和 Thrift 的一场美丽邂逅

    一. 与 Thrift 的初识 也许大多数人接触 Thrift 是从序列化开始的.每次搜索 “java序列化” + “方式”.“对比” 或 “性能” 等关键字时,搜索引擎总是会返回一大堆有关各种序列化 ...

  2. Apache thrift RPC 双向通信

    在上一篇介绍Apache thrift 安装和使用,写了一个简单的demo,讲解thrift服务的发布和客户端调用,但只是单向的客户端发送消息,服务端接收消息.而客户端却得不到服务器的响应. 在不涉及 ...

  3. common-pool2 学习:thrift连接池的另一种实现

    对象池是一种很实用的技术,经典的例子就是数据库连接池.去年曾经从零开始写过一个thrift客户端连接池.如果不想重造轮子,可以直接在apache开源项目commons-pool的基础上开发. 步骤: ...

  4. thrift:swift项目笔记

    先声明:此swift不是Apple公司的那个swift开发语言,而是facebook的另一个开源项目. facebook的thrift IDL文件,如果默认用thrift -gen java生成jav ...

  5. dubbo/dubbox 增加原生thrift及avro支持

    (facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,dubbo框架虽然有thrift的支持,但 ...

  6. Thrift的TJsonProtocol协议分析

    Thrift协议实现目前有二进制协议(TBinaryProtocol),紧凑型二进制协议(TCompactProtocol)和Json协议(TJsonProtocol). 前面的两篇文字从编码和协议原 ...

  7. Thrift的TBinaryProtocol二进制协议分析

    先上张图,说明一下thrift的二进制协议是什么东东. 报文格式编码: bool类型: 一个字节的类型,两个字节的字段编号,一个字节的值(true:1,false:0). Byte类型: 一个字节的类 ...

  8. 高可用thrift客户池的实现详解

    最近,公司要求将组内的thrift客户端组件推广至公司内使用.基本的要求如下: 1.高可用 2.集成名称服务,也就配置文件支持服务发现 3.解耦,客户端和高可用组件解耦,简单来说就是,如果以后要切换其 ...

  9. 2016windows(10) wamp 最简单30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world

    2016最简单windows(10) wamp 30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world thrift是什么 最简单解释 thrift是用来帮助各个编程语 ...

  10. thrift 服务端linux C ++ 与客户端 windows python 环境配置(thrift 自带tutorial为例)

    关于Thrift文档化的确是做的不好.摸索了很久才终于把跨linux与windows跨C++与python语言的配置成功完成.以下是步骤: 1)                 Linux下环境配置 ...

随机推荐

  1. [20190418]exclusive latch spin count.txt

    [20190418]exclusive latch spin count.txt--//昨天测试"process allocation" latch,主要这个latch与其它拴锁s ...

  2. 利用Navicat高效率postgresql转mysql数据库

    本人很喜欢postgresql数据库,也一直认为postgresql比mysql要更好更强大. 可生态环境太差了,无奈,最近要把一个小站转成mysql数据库. 小站主要表数据110万,pg_dump备 ...

  3. 【原】无脑操作:EasyUI Tree实现左键只选择叶子节点、右键浮动菜单实现增删改

    Easyui中的Tree组件使用频率颇高,经常遇到的需求如下: 1.在树形结构上,只有叶子节点才能被选中,其他节点不能被选中: 2.在叶子节点上右键出现浮动菜单实现新增.删除.修改操作: 3.在非叶子 ...

  4. 我的Windows日常——炫酷的windows组件命令行打开方式

    regedit -------注册表编辑器 gpedit.msc-------组策略编辑器 secpol.msc--------本地安全策略 control ----------控制面板 cmd--- ...

  5. ubuntu如何安装chromium浏览器并设置成中文版

    在Ubuntu上使用APT安装Chromium有3种方法: 1.在Ubuntu软件中心输入chromium,然后在结果中选择安装即可. 2.在新立得软件包管理器中输入chromium,然后标记安装即可 ...

  6. leetcode题解-122买卖股票的最佳时期

    题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...

  7. kerberos环境下flume写hbase

    直接看官网 http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#hbasesinks a1.channels = c1 ...

  8. 【js】字符串方法

    let str = 'na'; console.log(str.repeat('3'));//nanana console.log(str.startsWith('n'));//true consol ...

  9. 使用FreeCookies 控制浏览器cookies及修改http响应内容

    FreeCookies 插件安装 :您的计算机需要已经安装Fiddler (如未安装,请至官网下载安装 http://docs.telerik.com/fiddler/configure-fiddle ...

  10. Activiti开发案例之代码生成工作流图片

    图例 环境 软件 版本 SpringBoot 1.5.10 activiti-spring-boot-starter-basic 6.0 生成代码 以下是简化代码: /** * 查看实例流程图,根据流 ...