安装Thrift比较的烦,但是在Windows下官方编译了一个thrift.exe,下载安装就行了。
写 Thrift定义文件(.thrift file)
如果你之前有接触过这个东西的话,写定义文件非常的简单。但这里可以参考官方的教程快速开始。
示例定义文件(add.thrift)
1 | namespace java com.eviac.blog.samples.thrift.server // defines the namespace |
2 | |
3 | typedef i32 int //typedefs to get convenient names for your types |
4 | |
5 | service AdditionService { // defines the service to add two numbers |
6 | int add( 1 : int n1, 2 : int n2), //defines a method |
7 | } |
编译Thrift定义文件
下面的命令编译.thrift文件
1 | thrift --gen <language> <Thrift filename> |
对于我的例子来讲,命令是:
1 | thrift --gen java add.thrift |
在执行完代码后,在gen-java目录下你会发现构建RPC服务器和客户端有用的源代码。在我的例子中我将创建一个叫做AddtionService.java的java文件。
写一个 service handler
Service handler 类必须实现 AdditionService.Iface接口。
示例Service handler(AdditionServiceHandler.java)
01 | package com.eviac.blog.samples.thrift.server; |
02 | |
03 | import org.apache.thrift.TException; |
04 | |
05 | public class AdditionServiceHandler implements AdditionService.Iface { |
06 | |
07 | @Override |
08 | public int add( int n1, int n2) throws TException { |
09 | return n1 + n2; |
10 | } |
11 | |
12 | } |
写一个简单的服务器
下面的示例代码是一个简单的Thrift服务器。可以看到下面的代码中有一段是注释了的,可以去掉注释来启用多线程服务器。
示例服务器(MyServer.java)
01 | package com.eviac.blog.samples.thrift.server; |
02 | |
03 | import org.apache.thrift.transport.TServerSocket; |
04 | import org.apache.thrift.transport.TServerTransport; |
05 | import org.apache.thrift.server.TServer; |
06 | import org.apache.thrift.server.TServer.Args; |
07 | import org.apache.thrift.server.TSimpleServer; |
08 | |
09 | public class MyServer { |
10 | |
11 | public static void StartsimpleServer(AdditionService.Processor<AdditionServiceHandler> processor) { |
12 | try { |
13 | TServerTransport serverTransport = new TServerSocket( 9090 ); |
14 | TServer server = new TSimpleServer( |
15 | new Args(serverTransport).processor(processor)); |
16 | |
17 | // Use this for a multithreaded server |
18 | // TServer server = new TThreadPoolServer(new |
19 | // TThreadPoolServer.Args(serverTransport).processor(processor)); |
20 | |
21 | System.out.println( "Starting the simple server..." ); |
22 | server.serve(); |
23 | } catch (Exception e) { |
24 | e.printStackTrace(); |
25 | } |
26 | } |
27 | |
28 | public static void main(String[] args) { |
29 | StartsimpleServer( new AdditionService.Processor<AdditionServiceHandler>( new AdditionServiceHandler())); |
30 | } |
31 | |
32 | } |
写一个客户端
下面的例子是一个使用Java写的客户端短使用AdditionService的服务。
01 | package com.eviac.blog.samples.thrift.client; |
02 | |
03 | import org.apache.thrift.TException; |
04 | import org.apache.thrift.protocol.TBinaryProtocol; |
05 | import org.apache.thrift.protocol.TProtocol; |
06 | import org.apache.thrift.transport.TSocket; |
07 | import org.apache.thrift.transport.TTransport; |
08 | import org.apache.thrift.transport.TTransportException; |
09 | |
10 | public class AdditionClient { |
11 | |
12 | public static void main(String[] args) { |
13 | |
14 | try { |
15 | TTransport transport; |
16 | |
17 | transport = new TSocket( "localhost" , 9090 ); |
18 | transport.open(); |
19 | |
20 | TProtocol protocol = new TBinaryProtocol(transport); |
21 | AdditionService.Client client = new AdditionService.Client(protocol); |
22 | |
23 | System.out.println(client.add( 100 , 200 )); |
24 | |
25 | transport.close(); |
26 | } catch (TTransportException e) { |
27 | e.printStackTrace(); |
28 | } catch (TException x) { |
29 | x.printStackTrace(); |
30 | } |
31 | } |
32 | |
33 | } |
运行服务端代码(MyServer.java)将会看到下面的输出。
1 | Starting the simple server... |
然后运行客户端代码(AdditionClient.java),将会看到如下输出。
1 | 300 |