基于Thrift搭建跨语言RPC服务

今天我们要分享的是Thrift这个框架,本来文章的题目叫《基于Thrift搭建微服务》,不过标题有点太大了,今天也没有太多时间讲解什么是微服务,什么是SOA架构以及他们的区别,所以今天我们不扯的这么大,就讲点实际的,如何使用Thrift实现跨语言服务呢?

基于Thrift搭建跨语言RPC服务我们公司之前前端是net,很多前端工程都是使用c#相关语言开发的,后来公司逐渐转向Java平台,但前端的net的项目都不能全部抛弃,该使用的还是要使用,这样就需要考虑对接的开发成本,后台是Java写的,而前端是php或者net的时候如何快速完成对接呢?我们可以使用基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等。其中所用到的数据传输方式包括 XML,JSON 等,然而 XML 相对体积太大,传输效率低,JSON 体积较小,新颖,但还不够完善。我们选择的是由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。废话不多说,我们从Helloworld讲起,使用thrift集成spring完成一个rpc的服务,跟着我的节奏一步步来。

1、搭建一个maven环境,引入相关jar包

基于Thrift搭建跨语言RPC服务

各个包结构解释:

(1)app:服务的启动程序,我们使用main函数启动。

(2)client:客户端测试程序,我们再次连接thrift服务。

(3)common.param:调用服务接口需要的参数放置位置。

(4)common.result:调用服务接口返回的数据放置位置。

(5)registe:服务启动后需要向服务中心注册接口,这样客户端才能发现接口。

(6)service:服务接口定义。

(7)service.impl:服务接口的实现类。

pom中需要依赖的jar比较多,这里不一一截图了,主要是包括spring相关的jar和thrift的jar,以及相关依赖的jar包:

基于Thrift搭建跨语言RPC服务

2、服务接口与实体定义

thrift为什么可以和其他语言无缝结合的原因,在于它定义了一套自己的 IDL,即语法规范,我们使用Thrift 的语法规范编写脚本文件,然后通过它提供的编译工具就可以生成多种语言对应的实现。现在我们首先定义我们的接口以及接口的参数和返回值的内容:

基于Thrift搭建跨语言RPC服务

三个thrift文件,分别代表参数,结果,和接口。我们分别来看。首先是TestParam.thrift:

基于Thrift搭建跨语言RPC服务

namespace为命名空间,文件编译完成后会将类文件放入对应的目录。struct是结构体的意思,UserParam为类名,其下有一个telphone的字符串属性字段。除此之外,thrift还支持多种数据结构,例如:短整型i16,整型i32,长整型i64 ,集合相关的list,map,set等。下面我们看TestResult.thrift

基于Thrift搭建跨语言RPC服务

返回对象我们定义了一个UserResultMsg对象,存在code和msg属性,以及具体的返回内容data,它是一个list,而具体的内容是UserResult这个类,包括long型的id,整数的年龄,字符串的姓名和电话等。最后我们看一下TestService.thrift如何定义:

基于Thrift搭建跨语言RPC服务

我们首先将参数文件,结果文件include(引入)到接口文件中,因为他们存在依赖关系,然后定义我们的service接口,包含一个方法:findUserList,意思是查询用户列表,参数包括字符串token,和UserParam。

3、编译脚本文件

我们通过thrift.exe这个工具帮助我们编译脚本文件,具体脚本内容如下:

基于Thrift搭建跨语言RPC服务

最后它将生成Java语言对应的接口以及实体类,我们看一下生成的相关类:

基于Thrift搭建跨语言RPC服务

由thrift编译生成类比较复杂,我们这里不做解释,我们就可以认为它是一个普通的java类即可。不过这里我们需要注意是,我们使用thrift就是使用它的这种RPC的功能,我们将生成的接口与相关类单独部署和启动,与客户端完全解耦,客户端需要通过rpc连接调用thrift服务,而不是通过依赖jar的方式调用。而创建RPC链接,需要依赖TestService.java中的相关类,例如:Client,通过构造Client对象,我们可以调用其定义的方法,Client是一个静态的内部类,具体的代码如下:

基于Thrift搭建跨语言RPC服务

在截图中我们可以看到类的构造方式,TestService中有Iface和AsyncIface,分别代表同步和异步。我们这里使用的是同步接口,而Client类是我们要想办法构造的类,通过client实例我们可以调用findUserList方法。这里我们先不说,之后再说。

4、注册thrift接口

当前,thrift已经帮助我们生成了我们的TestService服务接口,但我们需要将这些服务注册到服务中心,即我们需要将其加载中实例当中,我们看一下注册服务的核心代码是:

基于Thrift搭建跨语言RPC服务

代码中,我们需要先后获得TProcessor实例和TMultiplexedProcessor实例。不同的实现可以解决不同的问题,我们这里使用的是TProcessor是TMultiplexedProcessor,支持一个Server支持部署多个Service的情况,在Processor外面再加一层Map,消息名从“add”会变为“Caculator:add”,当然,这需要需要客户端发送时使用 TMultiplexedProtocol修饰原来的Protocol来实现。也就是说使用它我们可以在一个端口下部署多个服务接口(在thrift之前的版本里是不可以的)。

再接下来我们还需要创建TServer的实例,我们使用的是TThreadedSelectorServer实现类。它是最成熟,也是被业界所推崇的RPC服务模型。TThreadedSelectorServer是对以上NonblockingServer的扩充, 其分离了Accept和Read/Write的Selector线程, 同时引入Worker工作线程池. 它也是种Half-sync/Half-async的服务模型。

其实说实话,我也不太懂上述的概念,暂时先放在这,以后我们再来研究。创建TProcessor的代码如下:

基于Thrift搭建跨语言RPC服务

这里要强调的是,serviceImplClass这个map的参数都是我们配置在配置文件中,在构造Tprocessor的时候我们需要用到TestService这个类的TProcessor。创建完成后,调用server方法完成服务启动。服务启动时绑定8110端口,服务器地址为本机ip。

基于Thrift搭建跨语言RPC服务

5、客户端调用

客户端调用TestService的接口,首先要创建TestService.Iface的实现类:

基于Thrift搭建跨语言RPC服务

然后创建与服务器的链接,其实就是创建TestService类中的Client对象,因为创建client对象的同时,我们就已经开启了对服务器的连接,代码如下:

基于Thrift搭建跨语言RPC服务

在此之前,我们需要构造TrramedTransport实例,并开启:

基于Thrift搭建跨语言RPC服务

如此就完成了服务接口的注册和客户端调用。

其实,我们发现我们要做的工作很简单,就是去构造TestService中的TProcessor对象,以及对应的Client对象就可以完成。因为Thrift已经帮助我们将所有的实现封装在了此类中,因正因为如此,所以它帮助我们实现了和其他语言的无缝结合,快速对接。

6、启动服务

基于Thrift搭建跨语言RPC服务

使用ClassPathXmlApplicationContext构建spring容器,它会读取thrift-service帮助我们创建维护各种实例,以及执行ResigteServer类的start方法,在start方法中就帮助我们完成服务接口的注册。

基于Thrift搭建跨语言RPC服务

6、测试

执行测试类中findUserList方法

基于Thrift搭建跨语言RPC服务

得到查询结果。

总结:就实际开发的经验而言,thrift作为跨语言的rpc框架,我觉得还是不错的,整合zookeeper可以做一个分布式的rpc集群服务,只不过在生成相应语言的类时有些繁琐和麻烦,开发前统一定义好规范后,在开发时可以提高很多效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值