使用Thrift实现跨语言RPC的调用

 更新时间:2023年10月07日 10:02:19   作者:爱音斯坦牛  
Thrift最大的优势就是可以实现跨语言RPC调用,尤其在一些大厂,微服务各模块之间使用不同的语言是很常见的,本文就将使用java作为服务端,用python作为客户端,实现不同语言之间的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连接mysql数据库代码实例程序

    Java连接mysql数据库代码实例程序

    这篇文章主要介绍了java连接mysql数据库代码实例程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • springboot整合springsecurity与mybatis-plus的简单实现

    springboot整合springsecurity与mybatis-plus的简单实现

    Spring Security基于Spring开发,项目中如果使用Spring作为基础,配合Spring Security做权限更加方便,而Shiro需要和Spring进行整合开发。因此作为spring全家桶中的Spring Security在java领域很常用
    2021-10-10
  • IDEA打包应用程序的教程图解

    IDEA打包应用程序的教程图解

    这篇文章主要介绍了IDEA打包应用程序的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Mybatis中的mapper是如何和XMl关联起来的

    Mybatis中的mapper是如何和XMl关联起来的

    这篇文章主要介绍了Mybatis中的mapper是如何和XMl关联起来的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 深入浅出探究Java多态的实现和应用

    深入浅出探究Java多态的实现和应用

    多态是实现面向对象的软件技术中必不可少的一个内容,所以这篇文章主要来和大家讲解一下Java多态的实现和应用,感兴趣的小伙伴可以了解一下
    2023-07-07
  • 深入研究spring boot集成kafka之spring-kafka底层原理

    深入研究spring boot集成kafka之spring-kafka底层原理

    这篇文章主要深入研究了spring boot集成kafka如何实现spring-kafka的底层原理分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • Jenkins自动化部署springboot代码实例

    Jenkins自动化部署springboot代码实例

    这篇文章主要介绍了Jenkins自动化部署springboot代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • SpringBoot整合Quartz实现动态配置的代码示例

    SpringBoot整合Quartz实现动态配置的代码示例

    这篇文章将介绍如何把Quartz定时任务做成接口,实现以下功能的动态配置添加任务,修改任务,暂停任务,恢复任务,删除任务,任务列表,任务详情,文章通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • springboot项目引入外部jar包的详细图文教程

    springboot项目引入外部jar包的详细图文教程

    在项目中有时候需要引入外部jar包,启动运行,下面这篇文章主要给大家介绍了关于springboot项目引入外部jar包的详细图文教程,需要的朋友可以参考下
    2023-09-09
  • Java 如何实现照片转化为回忆中的照片

    Java 如何实现照片转化为回忆中的照片

    本文主要介绍了可以对图片进行色彩处理的Java工具类,让图片变成回忆中的画面,主要将图片做黑白与褐色的处理。代码具有一定价值,感兴趣的童鞋可以关注一下
    2021-11-11

最新评论