thrift使用
一、什么是thrift
Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由FaceBook为“大规模跨语言服务开发”而开发的。它通过一个代码生成引擎联合了一个软件栈,来创建不同程度的、无缝的跨平台高效服。后来捐献给apache组织了。
二、thrift的架构
- TBinaryProtocol – 一种简单的二进制格式,简单,但没有为空间效率而优化。比文本协议处理起来更快,但更难于调试。
- TCompactProtocol – 更紧凑的二进制格式,处理起来通常同样高效。
- TDebugProtocol – 一种人类可读的文本格式,用来协助调试。
- TDenseProtocol – 与TCompactProtocol类似,将传输数据的元信息剥离。
- TJSONProtocol – 使用JSON对数据编码。
- TSimpleJSONProtocol – 一种只写协议,它不能被Thrift解析,因为它使用JSON时丢弃了元数据。适合用脚本语言来解析。
- TFileTransport – 该传输协议会写文件。
- TFramedTransport – 当使用一个非阻塞服务器时,要求使用这个传输协议。它按帧来发送数据,其中每一帧的开头是长度信息。
- TMemoryTransport – 使用存储器映射输入输出。(Java的实现使用了一个简单的ByteArrayOutputStream。)
- TSocket – 使用阻塞的套接字I/O来传输。
- TZlibTransport – 用Zlib执行压缩。用于连接另一个传输协议。
- 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使用的更多相关文章
- 和 Thrift 的一场美丽邂逅
一. 与 Thrift 的初识 也许大多数人接触 Thrift 是从序列化开始的.每次搜索 “java序列化” + “方式”.“对比” 或 “性能” 等关键字时,搜索引擎总是会返回一大堆有关各种序列化 ...
- Apache thrift RPC 双向通信
在上一篇介绍Apache thrift 安装和使用,写了一个简单的demo,讲解thrift服务的发布和客户端调用,但只是单向的客户端发送消息,服务端接收消息.而客户端却得不到服务器的响应. 在不涉及 ...
- common-pool2 学习:thrift连接池的另一种实现
对象池是一种很实用的技术,经典的例子就是数据库连接池.去年曾经从零开始写过一个thrift客户端连接池.如果不想重造轮子,可以直接在apache开源项目commons-pool的基础上开发. 步骤: ...
- thrift:swift项目笔记
先声明:此swift不是Apple公司的那个swift开发语言,而是facebook的另一个开源项目. facebook的thrift IDL文件,如果默认用thrift -gen java生成jav ...
- dubbo/dubbox 增加原生thrift及avro支持
(facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,dubbo框架虽然有thrift的支持,但 ...
- Thrift的TJsonProtocol协议分析
Thrift协议实现目前有二进制协议(TBinaryProtocol),紧凑型二进制协议(TCompactProtocol)和Json协议(TJsonProtocol). 前面的两篇文字从编码和协议原 ...
- Thrift的TBinaryProtocol二进制协议分析
先上张图,说明一下thrift的二进制协议是什么东东. 报文格式编码: bool类型: 一个字节的类型,两个字节的字段编号,一个字节的值(true:1,false:0). Byte类型: 一个字节的类 ...
- 高可用thrift客户池的实现详解
最近,公司要求将组内的thrift客户端组件推广至公司内使用.基本的要求如下: 1.高可用 2.集成名称服务,也就配置文件支持服务发现 3.解耦,客户端和高可用组件解耦,简单来说就是,如果以后要切换其 ...
- 2016windows(10) wamp 最简单30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world
2016最简单windows(10) wamp 30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world thrift是什么 最简单解释 thrift是用来帮助各个编程语 ...
- thrift 服务端linux C ++ 与客户端 windows python 环境配置(thrift 自带tutorial为例)
关于Thrift文档化的确是做的不好.摸索了很久才终于把跨linux与windows跨C++与python语言的配置成功完成.以下是步骤: 1) Linux下环境配置 ...
随机推荐
- 阅读笔记:基础知识(Java篇)
1. GC机制(垃圾回收机制) 找到垃圾的方法:引用计数法.可达性分析法 回收垃圾的方法:标记清除算法.复制算法.标记整理法.分代算法 2. JVM内存划分 线程私有:程序计数器.JVM虚拟机栈.本地 ...
- datatable的部分问题处理(动态定义列头,给某行添加事件,初始显示空数据)
一.动态定义列头 在ajax中,用datatable再去重新配置列头,当然传回的数据中,要有对应放列头的键值对 我自定义了Mock数据,用于前端自己交互. 其中,rowdata用于存放传回的数据,co ...
- DVWA 黑客攻防演练(十二) DOM型 XSS 攻击 DOM Based Cross Site Scripting
反射型攻击那篇提及到,如何是"数据是否保存在服务器端"来区分,DOM 型 XSS 攻击应该算是 反射型XSS 攻击. DOM 型攻击的特殊之处在于它是利用 JS 的 documen ...
- 我喜欢的vs code快捷键for mac
mac上的快捷键,尽量是像我用vs studio上靠近. cmd+K+S: 显示快捷键列 cmd+shift+p: 系统配置命令行 cmd+p:项目中文件列表,选择文件 cmd+shift+o:当前文 ...
- 《Python神经网络编程》的读书笔记
文章提纲 全书总评 读书笔记 C01.神经网络如何工作? C02.使用Python进行DIY C03.开拓思维 附录A.微积分简介 附录B.树莓派 全书总评 书本印刷质量:4星.纸张是米黄色,可以保护 ...
- scrapy formRequest 表单提交
scrapy.FormRequest 主要用于提交表单数据 先来看一下源码 参数: formdata (dict or iterable of tuples) – is a dictionary ( ...
- LINUX配置过程记录(二) 工具安装
安装谷歌游览 sudo apt-get update sudo apt-get install google-chrome-stable Ubuntu 16.04下源码安装Catkin https:/ ...
- nginx 常见正则匹配符号表示
1.^: 匹配字符串的开始位置: 2. $:匹配字符串的结束位置: 3..*: .匹配任意字符,*匹配数量0到正无穷: 4.\. 斜杠用来转义,\.匹配 . 特殊使用方法,记住记性了: 5.(值1|值 ...
- python3 使用ssl安全连接发送邮件
今天在测试,阿里云服务器发邮件时,发现使用默认的25端口,邮件无法正常发送,查了相关的资料,才知道,大部分的云服务器都会禁用25端口,所以才想到使用ssl 发送. 下面为具体的python3 使用ss ...
- 认识 WebService
什么是服务? 1)现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作.更别说只使用一种语言了. 2)大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用 ...