关键词:
Thrift
公司的一些平台服务框架底层封装了thrift提供服务,最近项目不是很紧,于是研究了一下,刚刚入门,理解得不深,写这篇博文来整理一下思路.
什么是thrift?
简单来说,是Facebook公布的一款开源跨语言的RPC框架.
那么问题来了.
什么是RPC框架?
RPC全称为Remote Procedure Call,意为远程过程调用.
假设有两台服务器A,B.A服务器上部署着一个应用a,B服务器上部署着一个应用b,现在a希望能够调用b应用的某个函数(方法),但是二者不在同一个进程内,不能直接调用,就需要通过网络传输,在AB服务器之间建一条网络传输通道,a把参数传过去,b接收到参数调用自己的方法,得到结果,再通过网络传回给a,简单讲就是A通过网络来调用B的过程.这个过程要涉及的东西很多,比如多线程,Socket,序列化反序列化,网络I/O,很复杂,于是牛掰的程序员把这些封装起来做成一套框架,供大家使用,就是RPC框架.
thrift的跨语言特型
thrift通过一个中间语言IDL(接口定义语言)来定义RPC的数据类型和接口,这些内容写在以.thrift结尾的文件中,然后通过特殊的编译器来生成不同语言的代码,以满足不同需要的开发者,比如java开发者,就可以生成java代码,c++开发者可以生成c++代码,生成的代码中不但包含目标语言的接口定义,方法,数据类型,还包含有RPC协议层和传输层的实现代码.
thrift的协议栈结构
thrift是一种c/s的架构体系.在最上层是用户自行实现的业务逻辑代码.第二层是由thrift编译器自动生成的代码,主要用于结构化数据的解析,发送和接收。TServer主要任务是高效的接受客户端请求,并将请求转发给Processor处理。Processor负责对客户端的请求做出响应,包括RPC请求转发,调用参数解析和用户逻辑调用,返回值写回等处理。从TProtocol以下部分是thirft的传输协议和底层I/O通信。TProtocol是用于数据类型解析的,将结构化数据转化为字节流给TTransport进行传输。TTransport是与底层数据传输密切相关的传输层,负责以字节流方式接收和发送消息体,不关注是什么数据类型。底层IO负责实际的数据传输,包括socket、文件和压缩数据流等。
MAC OS下thrift的下载与安装
我的电脑是mac,第一次安装也碰到了一些问题,所以有必要记录一下.
首先,在官网下载安装包http://thrift.apache.org/download 目前官网是0.10.0版本.下载完之后解压到想要安装的目录.
进入根目录:
step1:cd thrift-0.10.0 step2:./configure step3:make step4:make install
安装的时候,第二步出现了问题,提示:
Bison version 2.5 or higher must be installed on the system!
原因是Bison版本过低,mac默认安装的版本是2.3,因此需要安装最新版的Bison,命令行输入:brew install bison安装最新版bison,如果你的命令行反馈:Command not found,很可能是因为你没装homebrew,命令行输入:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
等待安装完homebrew就可以安装bison了,最新版本3.0.4安装完以后,执行第二步,发现依然提示上面那个警告,原因是因为它读取的仍然是默认的bison,于是找到系统安装的bison目录,我的mac是
/Library/Developer/CommandLineTools/usr/bin/bison,解决方法也比较简单,可以先将这个目录下的bison名字改一下,再将最新版的bison复制进来,于是,在bin目录下,执行命令:
sudo mv bison bison111
sudo cp /usr/local/opt/bison/bin/bison /Library/Developer/CommandLineTools/usr/bin/
现在,再按照上面的步骤进行下去,就可以正确安装thrift了.
进入thrift大门的第一个java小实例
1,创建一个服务Hello,创建文件Hello.thrift,代码如下:
namespace java service.demo service Hello{ string helloString(1:string para) }
这里定义了一个名为helloString的方法,入参和返回值都是一个string类型的参数.
2,终端进入Hello.thrift所在目录,执行命令:
thrift -r -gen java Hello.thrift
发现在当前目录下多了一个gen-java的目录,里面的有一个Hello.java的文件.这个java文件包含Hello服务的接口定义Hello.Iface,以及服务调用的底层通信细节,包括客户端的调用逻辑Hello.Client以及服务端的处理逻辑Hello.Processor,
3,创建一个Maven管理的Java项目,pom.xml中添加相关的依赖,并将Hello.java文件复制到项目中:
<dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.10.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> </dependency>
4,创建HelloServiceImpl实现Hello.Iface接口:
package service.demo; import org.apache.thrift.TException; /** * @author yogo.wang * @date 2017/02/21-下午2:13. */ public class HelloServiceImpl implements Hello.Iface { public String helloString(String para) throws TException { return "result:"+para; } }
5,创建服务端实现代码HelloServiceServer,把HelloServiceImpl作为一个具体的处理器传递给Thrift服务器:
package service.demo; import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TSimpleServer; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TTransportException; /** * @author yogo.wang * @date 2017/02/21-下午2:15. */ public class HelloServiceServer { /** * 启动thrift服务器 * @param args */ public static void main(String[] args) { try { System.out.println("服务端开启...."); TProcessor tprocessor = new Hello.Processor<Hello.Iface>(new HelloServiceImpl()); // 简单的单线程服务模型 TServerSocket serverTransport = new TServerSocket(9898); TServer.Args tArgs = new TServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.protocolFactory(new TBinaryProtocol.Factory()); TServer server = new TSimpleServer(tArgs); server.serve(); }catch (TTransportException e) { e.printStackTrace(); } } }
6,创建客户端实现代码HelloServiceClient,调用Hello.client访问服务端的逻辑实现:
package service.demo; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; /** * @author yogo.wang * @date 2017/02/21-下午2:35. */ public class HelloServiceClient { public static void main(String[] args) { System.out.println("客户端启动...."); TTransport transport = null; try { transport = new TSocket("localhost", 9898, 30000); // 协议要和服务端一致 TProtocol protocol = new TBinaryProtocol(transport); Hello.Client client = new Hello.Client(protocol); transport.open(); String result = client.helloString("哈哈"); System.out.println(result); } catch (TTransportException e) { e.printStackTrace(); } catch (TException e) { e.printStackTrace(); } finally { if (null != transport) { transport.close(); } } } }
全部工作完成后,下面来测试一下,先执行服务端main方法,在执行客户端main方法,会在客户端控制台打印出:result:哈哈.
相关博文:
参考文章:
thrift快速入门
Thrift简单示例2017-01-1916:47:57首先通过先面两个示例简单感受一下Thrift(RPC)服务端与客户端之间的通信......RPC学习----Thrift快速入门和Java简单示例Thrift入门及Java实例演示Thrift是什么?Thrift源于大名鼎鼎的facebook之手,在2007年facebo... 查看详情
thrift关键字
在编译thrift文件的时候发现报了如下的错误Cannotusereservedlanguagekeyword:"class"后来查了一下,发现class是thrift的关键字之一,变量起名的时候不能和关键字重复thrift的全部关键字可以查看thrift的源码https://github.com/apache/thrift/blob/master/comp... 查看详情
thrift安装
下载thrift版本:thrift-0.10.0解压并安装tar-zxfthrift-0.10.0.tar.gzcdthrift-0.10.0/./configuresudomakesudomakeinstall验证: thrift-version 查看详情
thrift官方安装手册(译)
本篇是Thrift官网安装文档的翻译,原地址点击这里。Thrift之前是不支持Windows的。但是似乎0.9版本以后已经支持Window了。介绍了Thrift安装的环境要求以及在centos,Debian/Ubuntu,OSX和Windows下的安装过程。并提出了一些安装过程中可能遇... 查看详情
thrift基础知识
1. 架构图Thrift包含一个完整的堆栈结构用于构建客户端和服务器端。下图描绘了Thrift的整体架构。图1.架构图如图所示,图中黄色部分是用户实现的业务逻辑,褐色部分是根据Thrift定义的服务接口描述文件生成的客户端和服... 查看详情
thrift基础教程安装篇
1、Thrift简单介绍Thrift是一款由Fackbook开发的可伸缩、跨语言的服务开发框架,该框架已经开源而且增加的Apache项目。Thrift主要功能是:通过自己定义的Interface Definition Language(IDL)。能够创建基于RPC的client和服务端的服务代... 查看详情
thrift框架-安装
1.前言今天接触了使用PRC【远程过程调用协议】的Thrift框架 ,留下随笔心得,这是安装篇2.下载去apache官网下载Thrift脚本编译程序,window则下载一个exe文件,然后将文件的路径设置在系统环境变量path即可Thrift下载地址: &... 查看详情
thrift开发笔记(代码片段)
thrift开发笔记(4种由易到难的匹配系统)准备工作创建项目文件夹thrift_project业务逻辑图游戏节点,创建game文件夹;匹配系统节点,创建match_system文件夹;thrift相关文件,创建thrift文件夹thrift简单语法介绍使用Thrift开... 查看详情
thrift开发笔记(代码片段)
thrift开发笔记(4种由易到难的匹配系统)准备工作创建项目文件夹thrift_project业务逻辑图游戏节点,创建game文件夹;匹配系统节点,创建match_system文件夹;thrift相关文件,创建thrift文件夹thrift简单语法介绍使用Thrift开... 查看详情
Thrift RPC 从 c# 中的 thrift 客户端失败到在 HBase 服务器上旋转的 thrift 服务器
】ThriftRPC从c#中的thrift客户端失败到在HBase服务器上旋转的thrift服务器【英文标题】:ThriftRPCfailingfromathriftclientinc#toathriftserverspinnedoverHBaseserver【发布时间】:2014-01-0612:42:36【问题描述】:我正在做一个项目,我正在尝试从C#客户... 查看详情
跟我学thrift4:由浅入深thrift文件
参考技术A我们以顾客下单买车为例子,来深入了解下Thrift的一些细节1.自定义标识符VS自动标识符2.OptionalVSRequiredVSDefault3.struct的组合(struct不支持继承)首先是Thrift文件定义如下:namespacejavacom.whp.demo.thrift.optionalstructCar1:requiredi32... 查看详情
thrift说明(代码片段)
thrift链接:https://www.cnblogs.com/sxrtb/p/12209455.html一总体介绍 thrift中主要文件包括.thrift文件(其中包括访问的接口、接口中的相关字段和异常处理等),服务器端实现.thrift文件中的接口文件(可以处理相关异常),服务器根据thrift... 查看详情
调用thrift出现nohandlerscouldbefoundforlogger"thrift.transport.tsocket"
1.问题使用thrift版本为0.10,在0.8没有这个问题其中ncTAgent是代码中封装的thrift接口的结构,在thrift服务端没有启动的时候,应该拋错为连接不到。但是拋错的堆栈输出之前,还有一句日志异常错误。这是不期望出现的>>>from... 查看详情
thrift安装(代码片段)
安装thrift-0.9.2步骤如下:1.下载#wgethttp://archive.apache.org/dist/thrift/0.9.2/thrift-0.9.2.tar.gz2.安装依赖#yum-yinstallautomakelibtoolflexbisonpkgconfiggcc-c++boost-devellibevent-develzlib-develpython-develrub 查看详情
thrift入门
从官网介绍看应该是个RPC框架,通过thrift定义接口,根据thrift文件生成各种语言的代码,c++,python,java....这里工作主要用到java。从晚上抄了个乘法的例子1.pom依赖<dependency><groupId>org.apache.thrift</groupId><artifactId>libth... 查看详情
Thrift 库:TServerEventHandler 的使用
】Thrift库:TServerEventHandler的使用【英文标题】:ThriftLibrary:UsageofTServerEventHandler【发布时间】:2014-10-1310:49:13【问题描述】:我是Thrift新手,我想知道是否有任何方法可以知道/区分传入Thrift服务器和前往Thrift客户端(RPC响应)的... 查看详情
thirft简单使用
安装Thrift到thrift官网下载thrift.exehttp://thrift.apache.org/download 将thrift-0.10.0.exe复制到C:ProgramFiles hrift并改名为thrift.exe 配置环境变量 打开dos窗口输入thrift-version查看thrift安装版本,出现下图,则成功& 查看详情
thrift设计与实现
文章简介从Thrift的C++源代码中看,thrift的设计思想,讨论跨语言优质RPC解决方案。 Thrift的诞生背景Thrift的诞生时间大概断定为2007年左右,随着Facebook网站流量的增加和站点功能的日益丰富,已经远远超出了原有LAMP架构的处... 查看详情