美文网首页
thrift安装和编写

thrift安装和编写

作者: binbin1018 | 来源:发表于2017-12-02 16:07 被阅读0次

一、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);
   }
}

相关文章

网友评论

      本文标题:thrift安装和编写

      本文链接:https://www.haomeiwen.com/subject/ghmnbxtx.html