安装thrift
mac
brew install thrift
安装完成检查
thrift –version
新建maven项目
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <dependencies> <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.11.0</version> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.apache.thrift</groupId> <artifactId>thrift-maven-plugin</artifactId> <version>0.10.0</version> <configuration> <thriftExecutable>/usr/local/bin/thrift</thriftExecutable> <thriftSourceRoot>src/main/resources</thriftSourceRoot> </configuration> <executions> <execution> <id>thrift-sources</id> <phase>generate-sources</phase> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
|
定义服务
新建文件 src/main/resources/service.thrift
1 2 3 4
| namespace java com.acupt.thritf.service service HelloService{ string hello(1:string name) }
|
构建
使用maven插件根据.proto文件生成Java代码,插件已在pom.xml中配置,只需执行命令:
mvn install
构建完成后可以在target中找到生成的Java代码,用这些代码可以实现thrift远程调用。
target/generated-sources/thrift/com/acupt/thritf/service/HelloService.java
如果在项目中无法直接引用上面的类,IDEA右键thrift文件夹 -> Mark Directory as -> Generated Sources Root
现在就可以在项目中引用了
代码
3个类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package com.acupt.thrift;
import com.acupt.thritf.service.HelloService; import org.apache.thrift.TException;
public class HelloServiceImpl implements HelloService.Iface {
@Override public String hello(String name) throws TException { return "hello," + name; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| package com.acupt.thrift;
import com.acupt.thritf.service.HelloService; import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TSimpleServer; import org.apache.thrift.transport.TServerSocket;
public class MyServer { public static void main(String args[]) { try { TProcessor tprocessor = new HelloService.Processor<HelloService.Iface>(new HelloServiceImpl()); TServerSocket serverTransport = new TServerSocket(50005); TServer.Args tArgs = new TServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.protocolFactory(new TBinaryProtocol.Factory()); TServer server = new TSimpleServer(tArgs); System.out.println("server starting"); new Thread(() -> { try { System.out.println("server wait stop"); Thread.sleep(30000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("server stopping"); server.stop(); System.out.println("server stop"); }).start(); server.serve(); System.out.println("server finish"); } catch (Exception e) { e.printStackTrace(); } }
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| package com.acupt.thrift;
import com.acupt.thritf.service.HelloService; 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 MyClient {
public static void main(String[] args) { TTransport transport = null; try { transport = new TSocket("localhost", 50005); TProtocol protocol = new TBinaryProtocol(transport); HelloService.Client client = new HelloService.Client(protocol); transport.open(); String result = client.hello("tom"); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } finally { if (null != transport) { transport.close(); } } }
}
|
先启动MyServer,成功启动后再启动MyClient。
和grpc用法差不多,gRPC-Java 示例