使用Thrift让Python和C#可以相互调用
在聊如何使用Thrift让Python和C#可以互相调用之前,我们先来看看下面的话题。
一、什么是微服务、微服务的特征、诞生的背景、优势和不足
微服务:使用一套小服务来开发单个应用的方式,每个服务运行在 独立的进程中,一般采用轻量级的通讯机制互联,并且他们可以通过自动化的方式部署。
微服务的特征:
1)单一职责 2)轻量级通讯 3)隔离性 4)有自己的数据 5)技术多样性
微服务诞生的背景:
1)互联网行业的快速发展 2)敏捷开发,精益方法深入人心 3)容器技术的成熟
优势:
1)独立性,各自开发自己的模块互不影响 2)敏捷性,能很快响应需求的变化 3)高效团队 4)技术栈灵活,可以使用多种语言进行混合开发。
不足:
1)额外的工作
拆分的太小,服务越多,服务之间的调用 就会过多,造成不必要的性能损耗。
拆分的太大,就会失去微服务的优势。
2)数据的一致性
单体架构可以通过事务很轻松的实现数据的一致性,但是微服务,他们都有自己的数据库,即使我们在拆分微服务是保证数据库的联表操作,尽量让它在同一个微服务内,但是也很保证没有这种意外的情况,一旦出现就会对我们的数据一致性造成影响。
3)沟通成本增加
二、微服务架构带来的问题
采用微服务架构会带来很多问题,在这里只讨论微服务之间是如何通讯的。
1)从通讯模式的角度考虑:
一对一还是一对多 ;同步还是异步

一对一的异步,这种模式下有两种场景:一个是我们给某个服务发送通知的时候,是一个一对一的异步,发送通知不需要等待响应;另一种是我们虽然给对方发送了一个请求,但是并不要求对方立即响应,而是最为一个回调的方式作为响应。
发布订阅:就是一个服务发布一个消息,有很多的订阅者会同时接到这个消息,接到这个消息,并不一定要立即响应。
发布异步响应:比如滴滴打车,我在叫一辆车的时候,系统会把消息发送给能接收到该消息的车主,然后来响应。
2)从通讯协议角度考虑:
基于http协议涉及rest API ; RPC; MQ
这里,只来聊聊RPC,市面上有很多RPC框架,比如:dubbo(阿里)、motan(新浪)、grpc(谷歌)、thrift(Facebook),这么多RPC框架,如何选择呢?可以参考下面的几个方面,来选择RPC框架--【I/O、线程调度模型、多语言支持、序列化方式、服务治理】,在这里我只演示Thrift的使用,因为我只了解Thrift,哈哈哈哈哈。

Thrift是2007年Facebook开发的2008年进入Apache开源项目,是一个跨语言的开发框架,它需要定义一个xxx.thrift的文件, 来生成各种语言的代码,生产之后我们的服务提供者和消费者,都需要把代码引进出,服务端把代码实现,消费者直接使用API的存根,直接调用。支持的语言也比较多,thrift是cs模式,通过客户端来生成不同语言的代码,从而实现了服务端和客户端不同语言的通讯,在传输的序列化上它也支持很多种,比如:二进制、压缩、json,xml等
在通讯的模式上,支持很多种,支持阻塞的IO,还有专门传输文件的传输方式,在线程模型上,它也支持 很多种,比如单线程、线程池、多线程非阻塞IO模式。
附一张对比图:

下面我们来看看,在Python和C#之间该如何使用。
三、代码演示
版本说明:
1)Python 3.6.3 Thrift-0.10.0
2)net core 2.1 Install-Package apache-thrift-netcore -Version=0.9.3.2
3)win7
首先到Thrift官网上下载:http://archive.apache.org/dist/thrift/0.9.3/


下载完毕之后,新建一个message.thrift文件:
namespace py message.api
namespace csharp message.api
service MessageService {
bool sendMobileMessage();
bool sendEmailMessage(); }
服务端:
然后在,改文件夹下,执行cmd,会生成对应的Python代码

打开gen-py的文件夹,显示如下:

然后,把生成的代码和文件,放到下面新建的Python项目中。
接着使用Pycharm,新建一个Python项目,如下所示:

在message文件夹下新建一个:
message-service.py的文件
安装:

代码:
from message.api import MessageService
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer # 重写生成 MessageService类中的两个方法
class MessageServiceHandler:
def sendMobileMessage(self):
print("sendMobileMessage")
return True def sendEmailMessage(self):
print("sendEmailMessage")
return True if __name__ == "__main__":
handler = MessageServiceHandler()
processor = MessageService.Processor(handler)
# 注意,这里的host要设置为:0.0.0.0,如果设置为127.0.0.1,客户端在访问时,报:目标计算积极拒绝
transport = TSocket.TServerSocket(host="0.0.0.0", port=8800)
# 传输方式 buffer
tfactory = TTransport.TBufferedTransportFactory()
# 传输的数据类型:二进制
pfactory = TBinaryProtocol.TBinaryProtocolFactory() server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
print("python thrift server start")
server.serve()
print("python thrift server exit")
客户端:

把 gen-csharp中的 MessageService类复制到该项目下,安装Thrift对应的.Net Core Nuget包
新建一个.Net Core 控制台程序:

代码:
static void Main(string[] args)
{
using (TSocket socket = new TSocket("localhost", ))
//一定要注意,客户端使用传输协议要和服务端的一致,否则会报错
using (TTransport transport = new TBufferedTransport(socket))
using (TProtocol protocol = new TBinaryProtocol(transport))
using (var client = new MessageService.Client(protocol))
{
transport.Open();
Console.WriteLine(client.sendEmailMessage()); ;
} Console.ReadKey();
}
最后,确保客户端和服务端代码都没有问题,先启动服务端代码,再启动客户端代码,结果如下:
服务端启动:

客户端启动:

结果:
客户端返回了:True
服务端打印的结果:

到此,C#和Python的相互访问就实验成功了,希望对你有帮助,谢谢。
最后,给大家提供一些Thrift的参考文章,因为这些前辈写的很好,希望对你有帮助。
https://www.cnblogs.com/mumuxinfei/category/597031.html
http://zheming.wang/blog/2014/08/28/94D1F945-40EC-45E4-ABAF-3B32DFFE4043/
注:本篇博客参考了杨中科老师的Thrift部分和刘果国老师Docker+k8s
作者:郭峥
出处:http://www.cnblogs.com/runningsmallguo/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
使用Thrift让Python和C#可以相互调用的更多相关文章
- Python实例浅谈之三Python与C/C++相互调用
一.问题 Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结. 二.Python调用C/C++ 1.Python调用C动态链接库 Python调用C库比较简单,不经过 ...
- Python与C/C++相互调用(python2 调c++那个试了ok)
一.问题 Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结. 二.Python调用C/C++ 1.Python调用C动态链接库 Python调用C库比较简单,不经过 ...
- Python与C/C++相互调用(转)
原文链接 作者 一.问题 Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结. 二.Python调用C/C++ 1.Python调用C动态链接库 Python调用C库 ...
- python不同package下相互调用
路径如: /path/dir1/a.py /path/dir2/b.py 调用举例如: 在/path/dir2/b.py中调用 a模块 import sys sys.path.append(" ...
- Python与C/C++相互调用
参考链接:https://www.cnblogs.com/yanzi-meng/p/8066944.html
- python调用C++之pybind11入门(相互调用)
python调用C/C++有不少的方法,如boost.python, swig, ctypes, pybind11等,这些方法有繁有简,而pybind11的优点是对C++ 11支持很好,API比较简单 ...
- python - 函数的相互调用 及 变量的作用域
# -*- coding:utf-8 -*- '''@project: jiaxy@author: Jimmy@file: study_函数的相互调用及变量的作用域.py@ide: PyCharm C ...
- python模块--如何相互调用自己写的模块
一.模块相互调用同级目录调用时的两种方法 import module print(module.add(3,8)) from module import add print(add(2,4)) 同级目 ...
- Python与Javascript相互调用超详细讲解(2022年1月最新)(三)基本原理Part 3 - 通过C/C++联通
目录 TL; DR python调javascript javascript调python 原理 基于Node.js的javascript调用python 从Node调用python函数 V8 嵌入P ...
随机推荐
- Mac上一条命令搭建web服务器
实际测试工作中偶尔会需要搭建Web服务器环境,由于Mac OS X自带了Apache和PHP环境,只需要简单的启动就可以. 开启Apache 开启Web服务器的方法有两种(默认启动端口号是80): 打 ...
- Hive之FAILED: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient异常
一.场景 Hive启动不报错,当使用show functions;或create table...时报:FAILED: SemanticException org.apache.hadoop.hive ...
- SQL中的ALL,ANY,SOME的用法
准备两个表: --T1(2,3)--T2(1,2,3,4) --ALL,ANY,SOME 的子查询-- >ALL 父查询中的结果集大于子查询中每一个结果集中的值,则为真SELECT * FROM ...
- JavaWeb 过滤器——验证登录 防止未登录进入界面
昨天刚刚完成老师布置的一个Web小项目,项目中用到了两个过滤器(编码过滤.登录过滤) 比如电商网页中有些不需要登录也能访问(首页.商品详细信息...),其他都需要过滤在会话作用域(session)中是 ...
- 大杀器:VS2017 查看或调试liunx代码(转载)
From:https://blog.csdn.net/mumufan05/article/details/80094637 上一篇简单介绍了vs2017新建一个linux的工程,本编将介绍一下如何管理 ...
- Vue2 学习笔记4
文中例子代码请参考github 父组件向子组件传值 组件实例定义方式,注意:一定要使用props属性来定义父组件传递过来的数据 <script> // 创建 Vue 实例,得到 ViewM ...
- wordpress安装后访问博客只显示文字的解决办法
按着网上的教程,买了腾讯云服务器,上面的镜像已经安装好WordPress了.但是发现并不像网上十分钟搭建个人站点等的写的那么简单.遇到了一些问题,下面来详细讲一讲. 首先是用ip地址不能直接访问服务器 ...
- (转)Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源
http://www.ityouknow.com/springboot/2018/05/03/spring-boot-commandLineRunner.html 在我们实际工作中,总会遇到这样需求, ...
- PHP 缓存技术(一)
移除光盘
- 为什么二流程序员都喜欢黑php?
为什么二流程序员都喜欢黑php? 为什么程序员都喜欢黑php?这个嘛!你骂一句php是垃圾试试,保准php程序员不揍扁你!这就好像自己的母校,纵然有很多不好的地方,但是只允许自己调侃,不允许外人骂半句 ...