一、Thrift的安装(MAC)
1、安装Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
注意
关于最新版mac(OSX High Sierra 10.13 )/usr/local权限问题,请看如何关掉SIP。
- 安装好后运行:brew update
2、安装thrift:
brew install thrift
3、验证安装:
thrift -version
二、编写Thrift文件并编译:
namespace java com.example.server
struct User
{
1: required i16 uid = -1;
2: required string name;
3: required i16 age;
4: required double height;
5: optional string address;
6: optional list<string> friends;
}
service UserManager
{
void addUser(1: User user);
User getUser(1: i16 uid);
void removeUser(1: i16 uid);
}
编译Thrift文件:
thrift -gen java UserManager.thrift
产生的Java文件如下:User.java就是我们定义的User结构体产生的JavaBean,UserManager.java就是我们定义的服务产生的接口代码。
三、Java代码实现
1、导入maven依赖
<dependencies>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.10.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
注:
如果发生错误:
Failed to load class "org.slf4j.impl.StaticLoggerBinder".
请查看是否引入slf4j-nop依赖
2、服务端代码
package com.example.test;
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TNonblockingServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFastFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;
import server.UserManager;
import server.UserManagerImpl;
public class Server
{
private static final Logger logger = LoggerFactory.getLogger(Server.class);
public static void main(String args[])
{
UserManagerImpl userManager = new UserManagerImpl(16);//创建一个Server端的service对象
try
{
TNonblockingServerSocket serverSocket = new TNonblockingServerSocket(1234);//创建socket
TProcessor processor = new UserManager.Processor<UserManager.Iface>(userManager);//创建Processor
TNonblockingServer.Args tArgs = new TNonblockingServer.Args(serverSocket);//创建Server端参数对象
tArgs.processor(processor);//添加Processor
tArgs.transportFactory(new TFastFramedTransport.Factory());//添加传输类型,这里是按Frame读取数据
tArgs.protocolFactory(new TBinaryProtocol.Factory());//添加协议类型(不是网络协议),表示以何种方式读取和发送数据
TServer server = new TNonblockingServer(tArgs);//创建一个服务端(非阻塞服务端)
logger.info("Server listening on port 1234 ...");
server.serve();//启动服务端
}catch(TTransportException e)
{
e.printStackTrace();
}
}
}
3、客户端代码
package com.example.test;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import server.User;
import server.UserManager;
import java.util.ArrayList;
import java.util.List;
public class Client
{
private static Logger logger = LoggerFactory.getLogger(Client.class);
public static void main(String args[]) throws TException
{
TSocket socket = new TSocket("localhost", 1234, 500);//创建socket
TTransport transport = new TFatstFramedTransport(socket);//创建transport,与服务端保持一致
TProtocol protocol = new TBinaryProtocol(transport);//创建数据解析协议,与服务端保持一致
UserManager.Client client = new UserManager.Client(protocol);//创建客户端
socket.open();//打开连接
//测试代码
List<String> friends = new ArrayList<String>();
friends.add("Tom");
friends.add("Alice");
client.addUser(new User((short)1,"Jack", (short)12, 123.1, "BeiJing", friends));
User user = client.getUser((short)1);
logger.info(user.toString());
}
}
4、实现类
package com.example.thriftdemo.server;
import org.apache.thrift.TException;
import java.util.HashMap;
import java.util.Map;
public class UserManagerImpl implements UserManager.Iface
{
private Map<Short, User> userMap;
public UserManagerImpl(int size)
{
if(size < 0)
size = 16;
userMap = new HashMap<Short, User>(size);
}
@Override
public void addUser(User user) throws TException
{
userMap.put(user.getUid(), user);
}
@Override
public User getUser(short uid) throws TException
{
return userMap.get(uid);
}
@Override
public void removeUser(short uid) throws TException
{
userMap.remove(uid);
}
}