thrift的安装和Java编写thrift

来源:互联网 发布:张纪中 知乎 编辑:程序博客网 时间:2024/05/16 07:30

一、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.serverstruct 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);   }}
原创粉丝点击