为了账号安全,请及时绑定邮箱和手机立即绑定

微服务进程间通信之Thrift

标签:
微服务

微服务进程间的通信可以是同步的消息调用,也可以是异步的.
异步的调用,我们一般使用消息队列
那么同步的调用中, 比较流行的解决方案是 REST和Thrift

下面介绍下thrift:

Apache Thrift 是一个编写跨语言RPC客户机和服务器的框架。Thrift为定义api提供了一个C风格的IDL。使用Thrift编译器生成客户端存根和服务器端框架。编译器为各种语言生成代码,包括c++、Java、Python、PHP、Ruby、Erlang和Node.js。

Thrift接口由一个或多个服务组成。服务定义类似于Java接口。它是一组强类型方法。Thrift方法可以返回一个(可能是空的)值,也可以定义为单向方法。返回值的方法实现交互的请求/响应样式。客户端等待响应并可能抛出异常。单向方法对应于交互的通知样式。服务器不发送响应。

Thrift支持各种消息格式:JSON、二进制和压缩二进制。二进制比JSON更有效,因为它的解码速度更快。而且,顾名思义,压缩的二进制是一种高效的空间格式。当然,JSON对人类和浏览器都很友好。Thrift还为您提供了多种传输协议的选择,包括原始TCP和HTTP。原始TCP可能比HTTP更有效。然而,HTTP是防火墙、浏览器和人类友好的。

下面是Thrift架构:

图片描述

Thrift便于不同语言间共享数据和调用, 目前已经支持28中程序设计语言.
Thrift是专门为支持跨客户机和服务器代码的非原子版本更改而设计的。我们可以升级服务器,同时仍然能够服务老客户端;或者让新客户端向旧服务器发出请求。

为了更形象地了解 Thrift, 下面是一个简单的Demo(这个Demo来自Thrift官网的Tutorial):

  1. 使用Thrift需要三步, 第一步就是定义thrift接口文件, 同时通过Thrift编译器来生成对应的代码.

例如, 生成Java代码:

thrift -r --gen java tutorial.thrift

将生成的代码导入Eclipse:

图片描述

  1. 编写Client代码

建立连接,直接调用:

try {
      TTransport transport;
      if (args[0].contains("simple")) {
        transport = new TSocket("localhost", 9090);
        transport.open();
      }
      else {
        /*
         * Similar to the server, you can use the parameters to setup client parameters or
         * use the default settings. On the client side, you will need a TrustStore which
         * contains the trusted certificate along with the public key. 
         * For this example it's a self-signed cert. 
         */
        TSSLTransportParameters params = new TSSLTransportParameters();
        params.setTrustStore("../../lib/java/test/.truststore", "thrift", "SunX509", "JKS");
        /*
         * Get a client transport instead of a server transport. The connection is opened on
         * invocation of the factory method, no need to specifically call open()
         */
        transport = TSSLTransportFactory.getClientSocket("localhost", 9091, 0, params);
      }

      TProtocol protocol = new  TBinaryProtocol(transport);
      Calculator.Client client = new Calculator.Client(protocol);

      perform(client);

      transport.close();
    } catch (TException x) {
      x.printStackTrace();
    } 
  1. 编写Server代码

设定一个监听的端口, 处理Client的请求.

try {
      TServerTransport serverTransport = new TServerSocket(9090);
      TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));

      // Use this for a multithreaded server
      // TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));

      System.out.println("Starting the simple server...");
      server.serve();
    } catch (Exception e) {
      e.printStackTrace();
    }
  1. 启动Server, 运行Client, 这样Client就可以RPC调用Server.

以上,Thrift, 很广泛的应用于微服务架构中,欢迎讨论!

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消