前言
在微服务盛行的互联网时代,各家都在构建自己的微服务体系,而这其中RPC框架也是其中比较重要的部分,笔者之前一直接触使用的是 Dubbo 框架,对Thrift 完全不了解,也是在研究学习的过程中,不断的记录才有了这篇博客。
参考博文: https://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/#ibm-pcon
Thrift 是一个跨语言的服务开发框架,采用接口描述语言定义并创建服务,所包含的代码生成引擎可以在多种语言中,其传输数据采用二进制格式,相对于xml与Json传输体积更小,对于高并发,大数据量和多语言更有优势。
学习课程之前先来个Hello World
主要包含:1. Thrift接口定义文件 2. Java 实现类 3.服务端代码示例 4. 客户端代码示例
本文使用Thrift 版本
Thrift version 0.9.3
<dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.9.3</version> </dependency>
namespace java com.example.demo.thrift service Hello { string sayHello(1:string name) }
thrift -gen java Hello.thrift
package com.example.demo.thrift.impl; import com.example.demo.thrift.Hello; import org.apache.thrift.TException; public class HelloThriftImpl implements Hello.Iface { @Override public String sayHello(String name) throws TException { System.out.println(name); return "success"; } }
package com.example.demo.thrift.server; import com.example.demo.thrift.Hello; import com.example.demo.thrift.impl.HelloThriftImpl; import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadPoolServer; import org.apache.thrift.transport.TServerSocket; public class HelloThriftServer { private static int port = 8888; public static void main(String[] args) { try { //设置服务端的端口 TServerSocket serverTransport = new TServerSocket(port); // 设置协议工厂为 TBinaryProtocol.Factory TBinaryProtocol.Factory proFactory = new TBinaryProtocol.Factory(); // 关联处理器与 Hello 服务的实现 TProcessor processor = new Hello.Processor(new HelloThriftImpl()); TThreadPoolServer.Args args1 = new TThreadPoolServer.Args(serverTransport); args1.inputProtocolFactory(proFactory); args1.processor(processor); TServer server = new TThreadPoolServer(args1); System.out.println("Start server on port " + port); server.serve(); } catch (Exception e) { e.printStackTrace(); } } }
package com.example.demo.thrift.client; import com.example.demo.thrift.Hello; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; public class HelloThriftClient { private static int port = 8888; public static void main(String[] args) { try { // 设置调用的服务地址为本地,端口为 8888 TTransport transport = new TSocket("localhost", port); transport.open(); // 设置传输协议为 TBinaryProtocol TProtocol protocol = new TBinaryProtocol(transport); Hello.Client client = new Hello.Client(protocol); // 调用服务的 helloVoid 方法 String helloRtn = client.sayHello("hello world"); System.out.println(helloRtn); transport.close(); } catch (Exception e) { e.printStackTrace(); } } }
先启动Server