server如何调用 thrift_一文带你了解 Thrift,一个可伸缩的跨语言 RPC 框架(pinpoint 源码分析系列)...
Thrift 支持包括上图中所有等28种语言,所以使得在使用不同编程语言的程序,可以很容易的传输共享数据和进行远程过程调用。它是一个轻量级的,独立于语言的开发框架,在点对点rpc数据传输,数据的序列化上为我们提供了比较简洁的抽象和实现。同样的,由于Thrift在传输数据时,采用的是二进制,相对于在HTTP协议中使用的xml和json占用体积更小,在很多高并发、数据量级大的系统中更加有优势。我们通过定义一个以.thrift结尾的文件作为输入源,内容包含接口的定义,然后通过生成代码的方式,来构建不同语言的RPC客户端和服务端。
Thrift 的各个组件层级在 Thrift 的客户端和服务端交互中,各个组件都是比较灵活的,做到了充分的低耦合,所以我们可以基于不同的应用场景,选择不同的方式搭建或是语言实现。
由上图,可以看出,最上层是我们编写的Thrift代码,它是一种IDL(接口描述语言), 是用于描述的服务接口信息的。我们在这个文件中写好相关的注释,就可以用它来作为接口文档,提供给客户端使用了。同时,IDL文件,也是自动生成接口代码的输入源,定义出来的接口能够很灵活的支持扩展。第二层是使用Thrift编译工具生成的代码,主要用于结构化的数据解析,发送和接收通信协议层主要是定义数据传输的格式,对传输的数据进行序列化和反序列化, 从协议划分上来说,主要包含两个方面,一是文本,而是二进制,既然使用了Thrift,使用其二进制协议占多数,当然更是要结合实际的业务场景来分析考虑。
传输层负责直接从网络中读取和写入数据,它定义了具体的网络传输协议;比如说TCP/IP传输等。
Thrift 的数据结构Thrift 脚本可定义的数据类型包括以下几种类型:
图片来自 wangyangfu,其中,byte、i16、i32、i64分别表示:8/16/32/64位有符号整数。Thrift 和 Http 区别?其实 Thrift 的主要特点就是跨语言、能自动生成客户端。相对于 http 协议而言,算是比较小众。它是基于 socket,通过 TCP 协议实现,相比较无连接、无状态的 HTTP 协议的,每次打开、关闭连接会比较消耗性能 并且需要管理维护很多 IDL 文件。基于thrift实现高效的二进制传输 而 http 大部分是通过 json 来实现的,字节大小和序列化耗时都比 Thrift 要更消耗性能。总的来说,Thrift 更常见用于公司内部的系统服务之间调用,性能消耗比较低,保证服务质量,提高传输效率,而 http 主要用于对外的接口调用,浏览器、移动端、第三方接口等。Thrift 的安装使用Thrift的官网地址是:
http://thrift.apache.org
这里我使用的版本是 thrift-0.10.0.exe,下载地址:
http://archive.apache.org/dist/thrift/0.10.0/thrift-0.10.0.exe
将下载好的trift-0.10.0.exe 重命名为 thrift.exe 并且在控制面板--> Path环境变量中配置exe所在的目录 配置好后,命令行执行:thrift -version 应该会显示
表明安装成功。Thrift 的编译新建一个 maven 工程,在intf目录下新建一个 IUserInfo.thrift 文件,内容为:
struct User{1: i32 id2: string name}
service UserService{User getUser(1:i32 uid)}
cmd命令行进入这个文件所在目录,执行如下命令:
thrift -gen java IUserInfo.thrift
语法格式为:thrift --gen使用双面面命令即可将IDL文件编译成对应语言的接口文件。
执行完后,会生成两个Java类。当然idea开发工具也提供了Thrift的编译器支持,在插件仓库中搜索安装,配置相关的参数后,也能完成编译。
编写 Thrift 服务端
// 业务处理器 TProcessor processorr = new UserService.Processor(new UserServiceImpl());// 设置服务器 TServerSocket serverSocket = new TServerSocket(9999);// 传输协议为二进制 TBinaryProtocol.Factory protocolFactory = new TBinaryProtocol.Factory();// 使用单线程阻塞 I/O 模型 TServer.Args simpleArgs = new TServer.Args(serverSocket).processor(processorr).protocolFactory(protocolFactory); TServer server = new TSimpleServer(simpleArgs); System.out.println("开启侠梦的Thrift服务器,监听端口:9999"); server.serve();
编写 Thrift 客户端
// 设置调用的服务地址-端口 TTransport tTransport = new TSocket("localhost", 9999);// 使用二进制协议 TProtocol protocol = new TBinaryProtocol(tTransport);// 使用的接口 UserService.Client client = new UserService.Client(protocol);// 打开 Socket tTransport.open(); System.out.println(client.getUser(1)); tTransport.close();
依次执行Server 端 和Client 后,效果如下:
至此,我们就完成了第一个Thrift 程序的编写。pinpoint 中 为什么采用 Thrift 呢?通过使用二进制格式(thrift)可以提高编码速度,虽然它使用和调试要难一些。也有利于减少网络使用,因为生成的数据比较小。如果将一个长整型转换为固定长度的字符串, 数据大小一般是8个字节。然而,如果你用变长编码,数据大小可以是从1到10个字符,取决于给定数字的大小。为了减小数据大小,pinpoint 使用 Thrift 的CompactProtocol协议(压缩协议)来编码数据,因为变长字符串和记录数据可以为编码格式做优化。pinpoint agent通过基于跟踪的根方法的时间开始来转换其他的时间来减少数据大小。固定长度编码和可变长度编码的对比
为了得到关于三个不同方法(见上图)被调用时间的数据,不得不在6个不同的点上测量时间,用固定长度编码这需要48个字节(6 * 8)。以此同时,pinpoint agent 使用可变长度编码并根据对应的格式记录数据。然后在其他时间点通过和参考点比较来计算时间值(在vector中),根方法的起点被确认为参考点。这只需要占用少量的字节,因为vector使用小数字。图4中消耗了13个字节。如果执行方法花费了更多时间,即使使用可变长度编码也会增加字节数量。但是,依然比固定长度编码更有效率。总结先总结一下介绍的内容:
- 介绍了Thrift 的基本概念。
- Thrift 的协议层的作用
- Thrift 的数据结构
- Thrift 和 Http 区别?
- Thrift 的安装使用
- Thrift 的入门例子编写。
- Thrift 的编译和运行
- pinpoint什么采用 Thrift 的原因?
本篇文章介绍了 跨语言的RPC框架 Thrift的入门知识,起源于研究Pinpoint的源码,在这里想说的是:研究阅读某个框架的源码其实是很耗费精力的一件事,因为不同的人读同样的代码会有不同的感受,这取决于各自的认知和知识深度不同。但是我觉得思路应该都是一致的,那就是不应该局限在框架本身,而是站在创造者的角度,去思考,为什么最后造出了这样一个优秀的框架,它依赖的那些底层的硬件、或是软件。由点及面的将其剖析完整,希望能帮助到你。MySQL存储过程的动态行转列Java 应用性能调优的一些实践可视化界面在线生成JVM参数java内存溢出问题分析过程二(附MAT超全操作文档)使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一)一文让你理解什么是shallow heap及retained heap内存分析诊断系列-理解heap dump记一次服务器被当肉鸡挖矿的经历如何编写一个可复用的SpringBoot应用运维脚本高效率编写Dockerfile需要绕过的一些坑Mysql百万量级数据高效导入Redis多线程之CountDownLatch的用法及原理笔记我就知道你“在看”
server如何调用 thrift_一文带你了解 Thrift,一个可伸缩的跨语言 RPC 框架(pinpoint 源码分析系列)...相关推荐
- Appium Server源码分析之作为Bootstrap客户端
Appium Server拥有两个主要的功能: 它是个http服务器,它专门接收从客户端通过基于http的REST协议发送过来的命令 他是bootstrap客户端:它接收到客户端的命令后,需要想办法把 ...
- 【Dubbo源码阅读系列】之远程服务调用(上)
今天打算来讲一讲 Dubbo 服务远程调用.笔者在开始看 Dubbo 远程服务相关源码的时候,看的有点迷糊.后来慢慢明白 Dubbo 远程服务的调用的本质就是动态代理模式的一种实现.本地消费者无须知道 ...
- Docker源码分析(五):Docker Server的创建
http://www.infoq.com/cn/articles/docker-source-code-analysis-part5 1.Docker Server简介 Docker架构中,Docke ...
- 【投屏】Scrcpy源码分析四(最终章 - Server篇)
Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...
- Tomcat7.0源码分析——server.xml文件的加载与解析
前言 作为Java程序员,对于Tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载和解析进行分析. 加载过程分析 Bootst ...
- 你真的了解lambda吗?一文让你明白lambda用法与源码分析
本文作者: cmlanche 本文链接: http://www.cmlanche.com/2018/07/22/lambda用法与源码分析/ 转载来源:cmlanche.com 用法 示例:最普遍的一 ...
- FileZilla Server源码分析--大漠落日5节
之所以有本系列的分析,是因为两点: FileZilla 是目前非常火爆的开源ftp项目,整个项目采用C++代码编写,代码紧凑可读性高,值得学习(缺陷是注释太少). 网络上已有的对该源码的分析基于的版本 ...
- 转载-FileZilla Server源码分析(1)
FileZilla Server源码分析(1) 分类: VC 2012-03-27 17:32 2363人阅读 评论(0) 收藏 举报 serversocketftp服务器usersockets工作 ...
- FileZilla Server源码分析(1)
之所以有本系列的分析,是因为两点: FileZilla 是目前非常火爆的开源ftp项目,整个项目采用C++代码编写,代码紧凑可读性高,值得学习(缺陷是注释太少). 网络上已有的对该源码的分析基于的版本 ...
最新文章
- 继续给力,持续一个星期位列NO.1
- hdu1960 最小路径覆盖
- 数据结构一:链表(循环链表)
- mac上matlab2018a,求助,mac系统 点击配置就报错,matlab版本2018a
- 基于flask让图标显示在浏览器的标签中(例3-10)
- java uuid 效率_java uuid第一次性能
- import导入模块
- Python办公自动化|光速对比并提取两份Word/Excel中的不同元素
- 【OpenCV】OpenCV实战从入门到精通图像的载入、显示与输出
- J2EE事务并发控制策略总结
- php处理mysql的符号_MySQL数据入库时特殊字符处理
- perl发送天气预报
- dhl:搜狗五笔输入法
- 中国新材料产业十四五竞争格局及产销趋势研究报告2021年版
- 详解typora配置华为云图床
- python方差齐性检验_【Python】统计科学之方差齐性检验
- Java基础篇--多线程之第一个线程用来计算2~100000之间的素数的个数,第二个线程用来计算100000~200000之间的素数的个数
- 以太坊-EVM第3部分——动态数据类型的表示方法
- 13.56M读卡器开发详解二(RC522驱动程序)
- eflv2 android攻略,USM 1.5.2_ISO全能维护版(03pe+win8pe_x64全能,u+v2高端隐藏,EFI)