thrift使用入门
目前项目使用hessian来作为服务之间RPC调用的底层框架,组内人员说可以尝试使用thrift替换他,thrift性能更出色,且使用更方便。所以找了一些资料,为thrift做一个入门。
服务描述
thrift的服务描述使用IDL(服务描述语言),然后提供一个代码生成工具,将之转化成不同语言的源代码文件,服务端实现该接口,客户端通过该接口进行服务调用。
样例
-
接口描述语言
thrift自己定义了接口描述语言,如下,更多的参考 Thrift IDL,或者这篇文章namespace java com.tongyin.thrift.demo service HelloWorldServcie{ string sayHello(1:string username) }
-
使用官方提供的代码生成工具
首先官方去下载代码生成工具(提供了多个语言的版本),然后运行thrift -r --gen java demo.thrift
下面是生成的java版本的java接口文件,没有贴完,给了个大概
package com.szp.mvp.thrift.demo1; @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) @javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)", date = "2017-09-26") public class HelloWorldServcie { public interface Iface { public String sayHello(String username) throws org.apache.thrift.TException; }
-
服务端
服务器端要实现接口对应的方法//HelloWorldImpl.java public class HelloWorldImpl implements HelloWorldServcie.Iface { public String sayHello(String username)throws TException{ System.out.println("server:" + username); return "Hi, "+ username; } }
接口实现了,需要将该实现暴露出去,这里又涉及了很多Thrift的类,监听端口.这里需要研究下如何通过一个端口暴率多个服务类,不然对端口资源太浪费。
public class HelloServerDemo { public static final int SERVER_PORT=7911; public void startServer(){ try{ System.out.println("Thrift TThreadPoolServer start..."); TProcessor tprocessor = new HelloWorldServcie.Processor<HelloWorldServcie.Iface>(new HelloWorldImpl()); TServerSocket serverTransport = new TServerSocket(SERVER_PORT); TThreadPoolServer.Args ttpsArgs = new TThreadPoolServer.Args(serverTransport); ttpsArgs.processor(tprocessor); ttpsArgs.protocolFactory(new TBinaryProtocol.Factory()); TServer server = new TThreadPoolServer(ttpsArgs); server.serve(); }catch (Exception e){ System.out.println("Server start error!!!"); e.printStackTrace(); } } public static void main(String[] args){ HelloServerDemo server = new HelloServerDemo(); server.startServer(); } }
-
客户端
客户端引入接口,使用thrift生成代理,来访问远程服务对象。public class HelloClientDemo { public static final String SERVER_IP="127.0.0.1"; public static final int SERVER_PORT=7911; public static final int TIMEOUT=30000; public void startClient(String userName){ TTransport transport = null; try{ transport = new TSocket(SERVER_IP,SERVER_PORT,TIMEOUT); TProtocol protocol = new TBinaryProtocol(transport); HelloWorldServcie.Client client = new HelloWorldServcie.Client(protocol); transport.open();; String result = client.sayHello(userName); System.out.println("Thrify client result = " + result); }catch(TTransportException e){ e.printStackTrace(); }catch(TException e1){ e1.printStackTrace(); }finally{ if(null !=transport){ transport.close(); } } } public static void main(String[] args){ HelloClientDemo client = new HelloClientDemo(); client.startClient("Linda"); } }
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。