RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务;
本地过程调用:如果需要将本地student对象的age+1,可以实现一个addAge()方法,将student对象传入,对年龄进行更新之后返回即可,本地方法调用的函数体通过函数指针来指定。
远程过程调用:上述操作的过程中,如果addAge()这个方法在服务端,执行函数的函数体在远程机器上,如何告诉机器需要调用这个方法呢?
目前主流的RCP框架有:
基于Go的服务治理的rpc框架、客户端支持跨语言 | |
Google 出品的跨语言rpc框架,很弱的(实验性的)负载均衡, 测试使用的是grpc-go | |
Go标准库的rpc, 不支持跨语言(jsonrpc支持json rpc 1.0) | |
跨语言的rpc框架,facebook贡献 |
从社区活跃度、跨语言考虑,我们选择Thrift。
Thrift是Facebook于2007年开发的跨语言的rpc服框架,提供多语言的编译功能,并提供多种服务器工作模式;用户通过Thrift的IDL(接口定义语言)来描述接口函数及数据类型,然后通过Thrift的编译环境生成各种语言类型的接口文件,用户可以根据自己的需要采用不同的语言开发客户端代码和服务器端代码。
Thrift提供跨语言的服务框架,这种跨语言主要体现在它对多种语言的编译功能的支持,用户只需要使用IDL描述好接口函数,只需要一条简单的命令,Thrift就能够把按照IDL格式描述的接口文件翻译成各种语言版本。
1、编写.thrift脚本(IDL文件,一个脚本对应一个业务通道)
脚本内容:
1、定义请求入参实体类
2、定义响应出参实体类
3、服务端方法接口类
2、编译thrift脚本
将.thrift脚本放在和thrift-0.13.0.exe编译器同一个目录
执行命令:thrift-0.13.0.exe -r --gen java sample.thrift
该命令会自动生成java代码 (gen-java目录)
支持多种语言,如python等
thrift-0.13.0.exe -r --gen py sample.thrift
3、将生成好的java代码放到业务工程,
编写接口实现impl类、服务端Server、客户端Client代码即可
4、java集成
添加pom依赖:
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.13.0</version>
</dependency>