• 使用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 信息
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    分别使用以下代码生成java和python的代码

    thrift --gen java person.thrift
    
    • 1
    thrift --gen py person.thrift
    
    • 1

    在这里插入图片描述

    代码

    服务端与业务逻辑

    服务端代码和业务逻辑就是 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);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    客户端

    接下来我们就用python编写Thrift客户端来实现RPC调用 java服务端
    首先安装thrift包:

    pip install thrift
    
    • 1

    将生成的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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    首先启动java服务端,然后启动python客户端,可以看到调用成功!
    在这里插入图片描述

    结语

    对于thrift的基本案例就写完了,这些案例使用的thrift服务端模型都是TSimpleServer,同时只支持一个socket连接,用于我们这些小案例测试,后续总结springboot整合thrift的代码,我们使用其他thrift服务端模型!

  • 相关阅读:
    校招社招,职业性格测评已日渐成为主流
    Efficient Decision-based Black-box Adversarial Attacks on Face Recognition
    FinGPT:开源金融大型语言模型
    K8S(2)RC、RS和Deployment
    Day63 处理机调度的概念和层次
    基于智能算法的无人机路径规划研究(Matlab代码实现)
    从无栈协程到 C++异步框架
    Java特性和优势、Java三大版本、JDK/JRE/JVM
    【Java】21天学习挑战赛
    Flutter配置Android SDK路径
  • 原文地址:https://blog.csdn.net/qq_57421630/article/details/133587909