首页 > 编程语言 >Thrift中实现Java与Python的RPC互相调用

Thrift中实现Java与Python的RPC互相调用

时间:2023-03-23 11:02:56浏览次数:31  
标签:Java Python py person RPC import thrift


在上面讲了在Java中使用Thrift实现远程过程调用。实现了在客户端调用服务端的方法。

但是这都是在Java项目中。

Thrift的强大之处并不止于此,如果想实现在两个不同的语言的服务端可客户端中实现RPC,

比如在Java客户端中调用Python服务端的方法或者在Python客户端中调用Java服务端的方法。

注:

关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

前面在使用Thrift生成Java代码时的thrift文件为

namespace java thrift.generated

typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String

struct Person {
    1:optional String username,
    2:optional int age,
    3:optional boolean married
}

exception DataException {
    1:optional String message,
    2:optional String callback,
    3:optional String date
}

service PersonService {
    Person getPersonByUsername(1:required String username) throws (1:DataException dataException),
    void savePerson(1:required Person person) throws(1:DataException dataException)
}

为了能生成代码,添加一个py的namespace

namespace py py.thrift.generated

添加之后的完成代码

namespace java thrift.generated
namespace py py.thrift.generated

typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String

struct Person {
    1:optional String username,
    2:optional int age,
    3:optional boolean married
}

exception DataException {
    1:optional String message,
    2:optional String callback,
    3:optional String date
}

service PersonService {
    Person getPersonByUsername(1:required String username) throws (1:DataException dataException),
    void savePerson(1:required Person person) throws(1:DataException dataException)
}

之前已经将thrift的编译器添加进环境变量,所以在IDEA中的Ternimal中使用其生成Python代码

thrift --gen py src/thrift/MyData.thrift

后面跟的是thrift文件的位置

 

Thrift中实现Java与Python的RPC互相调用_服务端

此时会在项目根目录下生成gen-py目录,里面就是生成的python代码

新建Python项目PyThrift,这里使用PyCharm再打开Ternimal,使用pip安装thrift

pip install thrift

然后将上面生成的python代码的gen-py下面的py目录和__init_.py复制到Pycharm中的Python项目中

 

Thrift中实现Java与Python的RPC互相调用_服务端_02

Python客户端请求Java服务端

在Python项目中新建py_client.py

# -*- coding:utf-8 -*-
__author__='公众号:霸道的程序猿'

from py.thrift.generated import PersonService
from py.thrift.generated import ttypes
from thrift import Thrift
from thrift.transport import TSocket
from thrift. transport import TTransport
from thrift. protocol import TCompactProtocol

try:
    tSocket = TSocket.TSocket('localhost',8899)
    tSocket.setTimeout(600)
    transport = TTransport.TFramedTransport(tSocket)
    protocol = TCompactProtocol.TCompactProtocol(transport)
    client = PersonService.Client(protocol)

    transport.open()

    person = client.getPersonByUsername("公众号:霸道的程序猿")

    print (person.username)
    print (person.age)
    print(person.married)

    print('--------------------')

    newPerson = ttypes.Person()
    newPerson.username('公众号:霸道的程序猿')
    newPerson.age = 50
    newPerson.married = True

    client.savePerson(newPerson)

    transport.close()

except Thrift.TException as tx:
    print(tx.message)

注意这里的Python客户端所使用的通信层和传输层的协议要和上面博客中Java客户端使用的一致。

然后运行Java中的服务端,以及Python中的客户端

 

Thrift中实现Java与Python的RPC互相调用_Thrift_03

可以看到Python的客户端调用了Java服务端的两个方法成功。

Java客户端调用Python服务端

在Python项目中新建PersonServiceImpl.py作用与之前Java服务端的实现类相同都是实现

thrift中struct中定义的接口方法。

# -*- coding:utf-8 -*-
__author__='公众号:霸道的程序猿'

from py.thrift.generated import ttypes

class PersonServiceImpl:
    def getPersonByUsername(self,username):
        print('Python 服务端获取到客户端传来的参数:'+username)

        person = ttypes.Person()
        person.username = username
        person.age = 50
        person.married = True
        return  person
    def savePerson(self,person):
        print('Python 服务端获取客户端的参数:')

        print(person.username)
        print(person.age)
        print(person.married)

然后再新建服务端py_server.py

# -*- coding:utf-8 -*-
__author__='公众号:霸道的程序猿'

from py.thrift.generated import PersonService
from PersonServiceImpl import PersonServiceImpl
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import  TCompactProtocol
from thrift.server import TServer

try:
    personServiceHandler = PersonServiceImpl()
    processor = PersonService.Processor(personServiceHandler)

    serverSocket = TSocket.TServerSocket(host='127.0.0.1',port=8899)
    transportFactory = TTransport.TFramedTransportFactory()
    protocolFactory = TCompactProtocol.TCompactProtocolFactory()

    server = TServer.TSimpleServer(processor,serverSocket,transportFactory,protocolFactory)
    server.serve()

except Thrift.TException as ex:
    print(ex.message)

注意这里的TServerSocket中的参数不仅要有端口还要有port,并且这里的host如果设置localhost的话

会提示拒绝连接,所以这使用的是127.0.0.1

运行Python的服务端,然后再运行Java的客户端

 

Thrift中实现Java与Python的RPC互相调用_服务端_04

在Java客户端中调用Python服务端的方法成功。


 

标签:Java,Python,py,person,RPC,import,thrift
From: https://blog.51cto.com/BADAOLIUMANGQZ/6144514

相关文章

  • ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化
    场景ProtoBuf简介protocolbuffers是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。ProtocolBuffers是一种灵活,高效,自动化机......
  • Netty中集成Protobuf实现Java对象数据传递
    在上面两篇博客基础上,对于Socket搭建服务端和客户端进行通信以及在Java中Protobuf的使用已经有了初步的理解。那么怎样使用Netty进行服务端和客户端的通信时使用protobuf进......
  • 2023爬虫学习笔记 -- Python链接Mysql数据库
    一、Mysql数据库开启外连接1.登进MySQLmysql-uroot-p2.输入以下语句,进入mysql库:usemysql3.更新域属性,’%'表示允许外部访问:updateusersethost='%'whereuser=......
  • python中的类和对象
    python类定义python类的定义:使用class关键字定义一个类,并且类名的首字母要大写当创建的类型不能用简单类型表示时就需要创建类类把需要的变量和函数组合在一起,即为“......
  • Python小练习:绘制散点图并添加基线
    Python小练习:绘制散点图并添加基线作者:凯鲁嘎吉-博客园 http://www.cnblogs.com/kailugaji/1. plot_scatter_test.py1#-*-coding:utf-8-*-2#Author:凯鲁......
  • java正则
    正则常见用法(例子来源:hutool文档):Stringcontent="ZZZaaabbbccc中文1234";Patternpattern=Pattern.compile(regex,Pattern.DOTALL);Matchermatcher=pattern.m......
  • #Java程序设计实践
    Java程序设计实践Java训练集1~3总结与心得训练集链接前言:本次训练集1~3主要考察了对java基础语法的掌握,内容包括基础程序的设计,类设计,编程规则的掌握等等,学习的重点在......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-从0到1快速入门python代码解释应用——官网推
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载......
  • Python 和 Podman
    Python和Podman 1.Windows10上安装Python开始在Windows上使用Python(初学者)2.使用pipPython的MicrosoftStore安装包括pip(标准包管理器)。通过pip......
  • Python抓取数据如何设置爬虫ip
    在写爬虫爬取github数据的时候,国内的ip不是非常稳定,在测试的时候容易down掉,因此需要设置爬虫ip。本片就如何在Python爬虫中设置爬虫ip展开介绍。也可以爬取外网爬虫编写需求......