场景

Thrift介绍以及Java中使用Thrift实现RPC示例:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108689413

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

但是这都是在Java项目中。

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

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

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

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

namespace java thrift.generatedtypedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string Stringstruct 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.generatedtypedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string Stringstruct 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文件的位置

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

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

pip install thrift

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

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 TCompactProtocoltry: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 = 50newPerson.married = Trueclient.savePerson(newPerson)transport.close()except Thrift.TException as tx:print(tx.message)

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

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

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

Java客户端调用Python服务端

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

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

# -*- coding:utf-8 -*-
__author__='公众号:霸道的程序猿'from py.thrift.generated import ttypesclass PersonServiceImpl:def getPersonByUsername(self,username):print('Python 服务端获取到客户端传来的参数:'+username)person = ttypes.Person()person.username = usernameperson.age = 50person.married = Truereturn  persondef 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 TServertry: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的客户端

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

示例代码下载

https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12869384

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

  1. 三、HDFS中的Java和Python API接口连接

    上次介绍了HDFS的简单操作,今天进入HDFS中的Java和Python的API操作,后面可能介绍Scala的相关的. 在讲Java API之前介绍一下使用的IDE--IntelliJ IDEA ,我 ...

  2. python mobile-hi.codemao.cn_使用thrift做c++,java和python的相互调用

    linux上安装thrift见 http://jinghong.iteye.com/blog/1102535 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点:代码侵入较强是其弱点. ...

  3. idea java代码格式化_intellij Idea中的Java代码格式化(链式方法调用)

    我对Intellij Idea 14.1.4中的 java代码格式有一个小问题. 我有一段由我手动格式化的代码,对我来说很好看: public class Test { private static ...

  4. java可以使用python的库函数_java调用python方法总结

    一.在java类中直接执行python语句 import org.python.util.PythonInterpreter; public class FirstJavaScript { publi ...

  5. 利用java实现简单的RPC服务调用

    一.前言 RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输 ...

  6. Java DB中的Java存储过程

    1 Java存储过程 这篇文章是关于Java DB中的Java存储过程的. Java DB是基于Java编程语言和SQL的关系数据库管理系统. 这是Apache软件基金会的开源Derby项目的Orac ...

  7. 远程过程调用失败_Java开发大型互联网RPC远程调用服务实现之问题处理方案

    引言 RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议 ...

  8. Thrift介绍以及Java中使用Thrift实现RPC示例

    场景 Thrift Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python,PHP, Ruby, Erlang,Perl ...

  9. thrift java长连接_利用thrift在c++、java和python之间相互调用

    转自:http://blog.csdn.net/andy_yf/article/details/7487384 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点:代码侵入较强是其弱点. ...

最新文章

  1. win7下面安装mongo步骤(开发环境为pycharm)
  2. Java源码详解零:HashMap介绍
  3. html贪吃蛇自动走,分享一个用html5实现的贪吃蛇特效代码
  4. 在ListBox中添加ToggleButton(有IsChecked属性)
  5. 可以节约很多代码的几个正则表达式
  6. 1002:输出第二个整数
  7. .NET 和 JAVA
  8. java模拟手机浏览web_PC上测试移动端网站和模拟手机浏览器
  9. 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)...
  10. 如何在windows下安装GIT
  11. 学python前端需要哪些基础知识_简析前端学习python3的基础
  12. DeepMind背后的人工智能:深度学习原理初探
  13. 使用ArcGIS生成栅格数据的等值线与数值标注
  14. 读书笔记之《价值》张磊
  15. 【xlsx-chart】Vue项目中导出Excel表格并带上图表
  16. JQuery对联广告
  17. 统一身份管理项目最佳实践
  18. 40款用于简洁网页设计的光滑英文字体【上】
  19. bottom sheets_Excel 2013中的SHEET和SHEETS函数
  20. 数据库设计之商品表分析1

热门文章

  1. 【String类、static、Arrays类、Math类】
  2. Nginx教程系列二:Linux安装nginx
  3. 开发html5的共享单车,HTML5 SVG 共享单车(小蓝车)动画
  4. vivo手机解锁工具_屏幕指纹优势凸显,vivo持续研发致力打造全屏指纹解锁
  5. java操作字符串的工具类StringUtil
  6. 银河麒麟v10更新异常问题
  7. win10 本地升级和系统覆盖更新教程
  8. 大师兄科研网vasp_【回顾】第三临床学院2020年新生科研交流会
  9. 廊坊学院报名计算机二级,2021上半年廊坊市计算机二级报名时间|网上报名入口【1月6日开通】...
  10. oracle 客户端访问数据库,ORACLE数据库客户端连接访问服务器