使用Thrift实现跨语言RPC调用

📋 个人简介

  • 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
  • 📝 个人主页:馆主阿牛🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 💬格言:迄今所有人生都大写着失败,但不妨碍我继续向前!🔥

目录

前言

前面我们在Thrift入门里面实现了Thrift实现RPC调用的简单案例,而Thrift最大的优势就是可以实现跨语言RPC调用,尤其在一些大厂,微服务各模块之间使用不同的语言是很常见的,有用java的,有go的,有python的,因此,选用Thrift实现RPC远程调用是很不错的选择,本节将在 RPC 框架之Thrift入门(一) 的案例基础上,使用java作为服务端,用python作为客户端,实现不同语言之间的RPC调用!

IDL代码

bash 复制代码
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的代码

bash 复制代码
thrift --gen java person.thrift
bash 复制代码
thrift --gen py person.thrift

代码

服务端与业务逻辑

服务端代码和业务逻辑就是 RPC 框架之Thrift入门(一) 的案例里面的

java 复制代码
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);
        }
    }
}
java 复制代码
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包:

bash 复制代码
pip install thrift

将生成的python代码拷贝到项目,然后编写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服务端模型!

相关推荐
nassi_33 分钟前
开发板网络配置
linux·网络·嵌入式硬件
ALex_zry1 小时前
论gRPC:基于 TCP/IP 的通用网络模式,以及基于 Unix Domain Sockets (UDS) 的同机进程间通信 (IPC) 模式
网络·tcp/ip·unix
数据与人工智能律师1 小时前
数据淘金时代的法治罗盘:合法收集、使用与变现数据的边界与智慧
大数据·网络·人工智能·云计算·区块链
柱子子子子2 小时前
【邪修】linux (ubuntu/fedora/arch/debian) wifi hard blocked解决方法-AX210
linux·网络·ubuntu·debian
wanderful_3 小时前
使用eNSP模拟器搭建网络拓扑结构(笔记2):从 0 到 1 掌握华为网络仿真
网络·智能路由器
QC七哥3 小时前
关于宽带网络下公网地址的理解
服务器·网络
—Qeyser3 小时前
Flutter网络请求Dio封装实战
网络·flutter·php·xcode·android-studio
馨谙4 小时前
OpenSSH 安全配置核心概念解析
linux·服务器·网络
烧冻鸡翅QAQ4 小时前
HTTP 1.0版本的webserver自主实现
网络·网络协议·http
开开心心就好4 小时前
Word转PDF工具,免费生成图片型文档
前端·网络·笔记·pdf·word·powerpoint·excel