使用Thrift实现跨语言RPC的调用
前言
前面我们在Thrift入门里面实现了Thrift实现RPC调用的简单案例,而Thrift最大的优势就是可以实现跨语言RPC调用,尤其在一些大厂,微服务各模块之间使用不同的语言是很常见的,有用java的,有go的,有python的,因此,选用Thrift实现RPC远程调用是很不错的选择,本节将在RPC 框架之Thrift入门(一)的案例基础上,使用java作为服务端,用python作为客户端,实现不同语言之间的RPC调用!
IDL代码
namespace java com.aniu.service namespace py thrift_demo struct Person { // 定义 Person 结构体 1: required string name; // 姓名,必选字段 2: required i32 age; // 年龄,必选字段 3: optional string sex; // 性别,可选字段 } service PersonService { // 定义 PersonService 服务接口 Person getByName(1: string name); // 根据姓名获取 Person 信息 bool save(1: Person person); // 保存 Person 信息 }
分别使用以下代码生成java和python的代码
thrift --gen java person.thrift
thrift --gen py person.thrift
代码
服务端与业务逻辑
服务端代码和业务逻辑就是RPC 框架之Thrift入门(一)的案例里面的
package com.aniu.server; 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 com.aniu.service.PersonService; import com.aniu.service.impl.PersonServiceImpl; public class Server { public static void main(String[] args) { try{ // 创建一个新的 Thrift 服务端套接字,监听在端口 9000 上 TServerSocket socket = new TServerSocket(9000); // 创建一个 PersonService 的 Processor。Processor 是 Thrift 中用于处理请求的接口,它需要一个实现了 PersonService 接口的对象作为参数。 PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl()); // 创建一个二进制协议工厂对象。Thrift 支持多种协议,如 TBinaryProtocol、TCompactProtocol、TJSONProtocol 等,这里选择的是二进制协议。 TBinaryProtocol.Factory factory = new TBinaryProtocol.Factory(); // 创建一个 TSimpleServer 的参数对象 args1,并将之前创建的套接字、Processor 和协议工厂设置为其属性。 TServer.Args args1 = new TSimpleServer.Args(socket); args1.processor(processor); args1.protocolFactory(factory); // 使用之前设置好的参数创建 TSimpleServer 对象 TSimpleServer tSimpleServer = new TSimpleServer(args1); // 开始执行 TSimpleServer,开始监听并处理客户端的请求。 tSimpleServer.serve(); }catch (Exception e){ System.out.println(e); } } }
package com.aniu.service.impl; import com.aniu.service.Person; import com.aniu.service.PersonService; import org.apache.thrift.TException; public class PersonServiceImpl implements PersonService.Iface { @Override public Person getByName(String name) throws TException { return new Person(name,18); } @Override public boolean save(Person person) throws TException { return false; } }
客户端
接下来我们就用python编写Thrift客户端来实现RPC调用 java服务端首先安装thrift包:
pip install thrift
将生成的python代码拷贝到项目,然后编写python客户端!
from thrift.transport import TSocket from thrift.transport import TTransport from thrift.protocol import TBinaryProtocol from thrift_demo import PersonService # 创建Thrift服务端的地址和端口 host = 'localhost' port = 9000 # 创建Thrift传输层和协议层 t_socket = TSocket.TSocket(host, port) transport = TTransport.TBufferedTransport(t_socket) protocol = TBinaryProtocol.TBinaryProtocol(transport) # 创建Thrift客户端 client = PersonService.Client(protocol) # 打开Thrift传输层连接 transport.open() # 调用Thrift客户端提供的接口 try: # 调用getName方法 person = client.getByName("aniu") print(person) except Exception as e: print('Error:', str(e)) # 关闭Thrift传输层连接 transport.close()
首先启动java服务端,然后启动python客户端,可以看到调用成功!
结语
对于thrift的基本案例就写完了,这些案例使用的thrift服务端模型都是TSimpleServer,同时只支持一个socket连接,用于我们这些小案例测试,后续总结springboot整合thrift的代码,我们使用其他thrift服务端模型!
到此这篇关于使用Thrift实现跨语言RPC的调用的文章就介绍到这了,更多相关Thrift跨语言RPC调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
java数组排序示例(冒泡排序、快速排序、希尔排序、选择排序)
java中在运用数组进行排序功能时,一般有四种方法:快速排序法、冒泡法、选择排序法、插入排序法(希尔排序(Shell Sort)是插入排序的一种),下面是一些示例,需要的朋友可以参考下2014-03-03SpringBoot项目集成Swagger和swagger-bootstrap-ui及常用注解解读
这篇文章主要介绍了SpringBoot项目集成Swagger和swagger-bootstrap-ui及常用注解解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-03-03java8 LocalDate LocalDateTime等时间类用法实例分析
这篇文章主要介绍了java8 LocalDate LocalDateTime等时间类用法,结合具体实例形式分析了LocalDate、LocalTime、LocalDateTime等日期时间相关类的功能与具体使用技巧,需要的朋友可以参考下2017-04-04
最新评论