Netty框架入门学习--Thrift实现java和python的rpc调用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_33151213/article/details/91658288
前提

安装和配置好python,我安装的是2.7版本的
安装python - 廖雪峰的官方网站
pycharm-python开发工具
在这里插入图片描述

开始
1.安装python依赖

对于Java进行thrift的开发,我们是通过gradle来引入thrift的依赖库。现在我们用到python,也需要用到thrift对python支持的库。
我们直接去thrift官网下载 Apache Thrift v0.12.0,我当前下载的版本是0.12.0,是最新的版本。
下载完直接解压就可以了,在解压文件里面可以看到py目录里面就是python的相关依赖包了。
在这里插入图片描述

现在我们需要把thrift对python的依赖安装到我们的系统中
安装命令:

python setup.py install

首先我们要进入到刚刚解压的thrift的文件包的python文件的目录下,然后执行安装命令:python setup.py install
在这里插入图片描述
最后出现下面的提示,就表示安装成功了
在这里插入图片描述

2.thrift生成python代码

生成命令和Java是一样的,把命令中的Java改成py就可以了。如图,你们通过idea打开Terminal终端和我的是不一样的,我没用自带的终端,用的是cmder。

thrift --gen py src\thrift\data.thrift

在这里插入图片描述

执行完生成命令之后,就可以看到生成的python的代码
在这里插入图片描述

3.python客户端实现

我们通过pycharm创建一个python工程:pythrift。
接着我们需要把上一步生成的gen-py目录下的python代码全部复制到我们新创建的python工程下面。加粗样式

在项目中新建一个py_client.py文件,实现python客户端的代码.
py_client.py

# coding=utf-8
__author__ = 'hll'

# 引入thrift相关
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()

    # 调用getPersonByUsername
    person = client.getPersonByUsername(unicode('张三', "utf-8"))
    print person.username
    print person.age
    print person.married

    print '----------------'

    # 创建person对象
    newPerson = ttypes.Person();
    newPerson.username = unicode('李四', "utf-8")
    newPerson.age = 30
    newPerson.married = True

    # 调用savePerson
    client.savePerson(newPerson)

except Thrift.TException, tx:
    print '%s' % tx.message

python客户端写好之后,我们开始测试下。
服务端直接用上一篇Netty框架入门学习–Thrift的使用开发的服务端测试。
先开启服务端。再开启python客户端。
java服务端控制台:
在这里插入图片描述
python客户端控制台:
在这里插入图片描述

OK。可以成功的看到数据,java服务端和python客户端通过thrift成功的完成了rpc的通信。


4.python服务端实现

下面是实现Java客户端和python服务端的rpc通信。
python服务端代码:

python服务端业务逻辑类:PersonServiceHandler

# coding=utf-8
__author__ = 'hll'

from py.thrift.generated import ttypes
import sys

# 解决字符编码异常问题 UnicodeDecodeError: 'ascii' codec can't decode byte 0xef
# 也可以直接使用unicode('张三', "utf-8") 针对某个字符
reload(sys)
sys.setdefaultencoding('utf8')

class PersonServiceHandler:

    # 第一个方法
    def getPersonByUsername(self, username):
        print "get client param:" + username

        person = ttypes.Person()
        person.username = username
        person.age = 20
        person.married = False

        return person

    # 第二个方法
    def savePerson(self, person):
        print "get client param:"

        print person.username
        print person.age
        print person.married


服务端:py_server

# coding=utf-8
__author__ = 'hll'

from py.thrift.generated import PersonService
from PersonServiceHandler import PersonServiceHandler
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 = PersonServiceHandler();
    processor = PersonService.Processor(personServiceHandler)

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

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

except Thrift.TException, ex:
    print '%s' % ex.message

然后我们接着使用Netty框架入门学习–Thrift的使用这篇文章里面开发好的Java客户端。
注意一下:
在Java客户端的代码中连接的地址localhost
在这里插入图片描述
需要改成本机的IP地址,python的服务端也要改成本机IP,使用localhost,Java客户端会报连接异常错误
在这里插入图片描述
在这里插入图片描述

现在可以测试了。启动python服务端,再启动Java客户端
python服务端控制台:
在这里插入图片描述

Java客户端控制台:
在这里插入图片描述

可以看到,使用python作为服务端和Java作为客户端也实现了rpc的调用。

当然,上面的python服务端和客户端肯定也是可以的。就不测试了。

猜你喜欢

转载自blog.csdn.net/sinat_33151213/article/details/91658288