thrift安装和编写

一、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);
   }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355