zoukankan      html  css  js  c++  java
  • 使用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", 8800))
           //一定要注意,客户端使用传输协议要和服务端的一致,否则会报错
    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/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

  • 相关阅读:
    git简单使用
    简单Spring和mybatis整合配置文件
    ASP.NET程序开发范例宝典
    C# DataSet和DataTable详解
    AOP
    匿名内部类
    数据库事务
    mybatis
    线程池
    单例模式
  • 原文地址:https://www.cnblogs.com/runningsmallguo/p/9226079.html
Copyright © 2011-2022 走看看