微服务进程间的通信可以是同步的消息调用,也可以是异步的.
异步的调用,我们一般使用消息队列
那么同步的调用中, 比较流行的解决方案是 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):
- 使用Thrift需要三步, 第一步就是定义thrift接口文件, 同时通过Thrift编译器来生成对应的代码.
例如, 生成Java代码:
thrift -r --gen java tutorial.thrift
将生成的代码导入Eclipse:
- 编写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();
}
- 编写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();
}
- 启动Server, 运行Client, 这样Client就可以RPC调用Server.
以上,Thrift, 很广泛的应用于微服务架构中,欢迎讨论!