Thrift(一):快速入门

什么是 Thrift?

  • Thrift 是 Facebook 开源的一款跨语言 RPC 框架,它通过 IDL(接口描述语言) 来定义 RPC 数据类型和接口,这些内容被写在以 .thrift 结尾的文件中,然后通过编译器来生成不同语言的代码,以满足跨语言的需要

Thrift 安装

Mac系统

  1. 使用 brew 快速安装
brew install thrift

Window 系统

  1. 下载 Thrift.exe:http://www.apache.org/dyn/closer.cgi?path=/thrift/0.11.0/thrift-0.11.0.exe
  2. 将下载的 exe 程序重命名为 thrift.exe,并放入一个文件夹(我这放入 D 盘 Thrift 文件夹下)
  3. 配置环境变量 Path,在最后加上 D:\Thrift;
  4. 执行命令查看是否安装成功
thrift -version

如何使用 IDL 描述接口

  • 在使用 Thrift 之前,需要提供一个 .thrift 文件,其内容是使用 IDL 描述的服务接口信息
struct User{
    1: i32 id
    2: string name
}

service UserService{
    User getUser(1:i32 uid)
}
  • 上面 user.thrift 定义了了一个数据类型 User 与业务接口 UserService。然后执行下面命令使用 Thrift 编译器生成 Java 文件
thrift -r -gen java user.thrift

可用数据类型

  • bool:布尔值,对应 Java 的 boolean
  • byte:8 位有符号整数,对应 Java 的 byte
  • i16:16 位有符号整数,对应 Java 的 short
  • i32:32 位有符号整数,对应 Java 的 int
  • i64:64 位有符号整数,对应 Java 的 long
  • double:64 位浮点数,对应 Java 的 double
  • string:文本或二进制字符串,对应 Java 的 String
  • struct:定义公共的对象,在 Java 中是一个 JavaBean
  • list:对应 Java 的 ArrayList
  • set:对应 Java 的 HashSet
  • map:对应 Java 的 HashMap
  • exception:对应 Java 的 Exception
  • service:service 类型可以被继承
  • enum:枚举类型

Thrift 网络栈

  • 下图为 Thrift 的网络栈,包含了 Transport、Protocol、Processor 层和 Server/Client 层
Thrift 网络栈

Transport

  • Transport 为底层网络数据读写传输数据的抽象层,Thrift 提供了如下几个常用的 Transport 实现:
    • TSocket:该 Transport 使用阻塞 Sockert 来收发数据
    • TFramedTransport:以帧形式发送数据,如果服务器使用 NIO 时就必须使用该 Transport
    • TMemoryTransp:使用内存 I/O,内部使用了 ByteArrayOutputStream
    • TZlibTransport: 使用 Zlib 压缩传输的数据,但 Java 中未实现

Protocol

  • Protocol 为数据传输协议层,即对传输后的数据序列化和反序列化,常用的协议有:
    • TBinaryProtocol:二进制格式
    • TCompactProtocol:压缩格式
    • TJSONProtocol:JSON 格式
    • TSimpleJSONProtocol:提供 JSON 只写协议,生成的文件很容易通过脚本语言解析
    • TDebugProtocoal:生成 Text 格式,常用语调试

Processor

  • Processor 层对象由 Thrift 根据用户 IDL 文件生成,我们通常不能指定,该层主要有两个功能:
    • 从 Protocol 层读取数据然后交给对应 Handler 处理
    • 将 Handler 处理的结果发送给 Protocol 层

Server

  • Thrift 提供的 Server 实现有:
    • TNonblockingServer:基于多线程,非阻塞 IO 的 Server 层实现,专用于处理大量并发请求
    • THsHaServer:半同步/半异步的服务器模型
    • TThreadPoolServer:基于多线程阻塞 IO 的 Server 层实现,它消耗的系统资源比 TNonblockingServer 高,但可以提供更高的吞吐量
    • TSimpleServer: 该实现主要是用于测试. 它只有一个线程,并且是阻塞 IO, 因此在同一时间只能处理一个连接

Thrift 快速入门

  • 以上面 user.thrift 为例,执行下面命令生成两个类 User、UserService ,将其拷贝到项目中(可能需要修改类中的包路径
thrift -r -gen java user.thrift
  • Maven 引入依赖
<dependency>
  <groupId>org.apache.thrift</groupId>
  <artifactId>libthrift</artifactId>
  <version>0.11.0</version>
</dependency>
  • 编写 UserService 业务实现类
public class UserServiceImpl implements UserService.Iface {
    @Override
    public User getUser(int uid) throws TException {
        User user = new User(uid,"ly");
        return user;
    }
}
  • 编写 Server
public class Server {
    public static void main(String[] args) throws Exception {
        // 业务处理器
        TProcessor processorr = new UserService.Processor<UserService.Iface>(new UserServiceImpl());
        // 设置服务器
        TServerSocket serverSocket = new TServerSocket(8181);
        // 传输协议为二进制
        TBinaryProtocol.Factory protocolFactory = new TBinaryProtocol.Factory();
        // 使用单线程阻塞 I/O 模型
        TServer.Args simpleArgs = new TServer.Args(serverSocket).processor(processorr).protocolFactory(protocolFactory);
        TServer server = new TSimpleServer(simpleArgs);
        System.out.println("开启Thrift服务器,监听端口:8181");
        server.serve();
    }
}
  • 编写 Client
public class Client {
    public static void main(String[] args) throws Exception {
        // 设置调用的服务地址-端口
        TTransport tTransport = new TSocket("localhost", 8181);
        // 使用二进制协议
        TProtocol protocol = new TBinaryProtocol(tTransport);
        // 使用的接口
        UserService.Client client = new UserService.Client(protocol);
        // 打开 Socket
        tTransport.open();
        System.out.println(client.getUser(123));
        tTransport.close();
    }
}
  • 测试:先运行 Server,在运行 Client 可看到下面输出
User(id:123, name:ly)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容