入职美团了,用了N年的Windows换成mac. 有些不一样的技术也要学一下,美团这面用的RPC框架为Thrift, 以前用的RPC都是dubbo、springboot.
这篇文章主要是介绍一下thrift、 搭建一下mac下的thrift环境, 以及一个最简单的thrift dome.
thrift 简介
thrift是Facebook开发的一种跨语言、可伸缩的PRC框架。 现在已经开源并加入Apahce项目。
和dubbo相比,dubbo是一个综合的SOA解决方案,而thrift仅仅是一个RPC调用框架, thrift的开发难度高于dubbo, 但是性能上也优于dubbo. 且thrift是跨语言的,可以支持目前基本所有的主流语言, 而dubbo 主要的应用场景还是java。
thrift安装
brew install thrift
thrift helloworld
安装thrift并不是一个RPC调用的环境,而是一个工具,用于生产PRC接口代码。
首先定义个一个接口文件: helloworld.thrift
namespace java service.dome
service HelloWorldInterface{
string sayHello(1:string param)
}
执行命令:
thrift -gen java helloworld.thrift
不报错的情况下会生成一个文件夹. gen-java/service/dome
里面会有一个接口文件HelloWorldInterface.java. 这个就是我们需要的java接口文件。
新建一个maven工程,引入jar包
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.12.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
其中注意的是 org.apache.thrift 的版本号要和你安装的thrift的版本号一致。
thrift -version
新建包service.dome, 拷贝HelloWorldInterface.java到该包下,@override可能会报错,全部删除就可以。
新建实现类:HelloServiceImpl.java
package service.demo;
import org.apache.thrift.TException;
public class HelloServiceImpl implements HelloWorldInterface.Iface {
public String sayHello(String para) throws TException {
return "hello " + para;
}
}
创建服务端HelloServiceServer.java
package service.demo;
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;
import org.apache.thrift.transport.TTransportException;
public class HelloServiceServer {
public static void main(String[] args) {
try {
System.out.println("服务端开启....");
TProcessor tprocessor = new HelloWorldInterface.Processor<HelloWorldInterface.Iface>(new HelloServiceImpl());
// 简单的单线程服务模型
TServerSocket serverTransport = new TServerSocket(9898);
TServer.Args tArgs = new TServer.Args(serverTransport);
tArgs.processor(tprocessor);
tArgs.protocolFactory(new TBinaryProtocol.Factory());
TServer server = new TSimpleServer(tArgs);
server.serve();
}catch (TTransportException e) {
e.printStackTrace();
}
}
}
创建客户端HelloServiceClient.java
package service.demo;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
public class HelloServiceClient {
public static void main(String[] args) {
System.out.println("客户端启动....");
TTransport transport = null;
try {
transport = new TSocket("localhost", 9898, 30000);
// 协议要和服务端一致
TProtocol protocol = new TBinaryProtocol(transport);
HelloWorldInterface.Client client = new HelloWorldInterface.Client(protocol);
transport.open();
String result = client.sayHello("world");
System.out.println(result);
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
} finally {
if (null != transport) {
transport.close();
}
}
}
}
启动服务端, 然后启动客户端,会输出 hello world。 至此全部完成。