Thrift

要使用的时候首先应该先编辑一个thrift文件,其中包括结构体和服务的定义。

结构的定义

struct User{
    1:required string userId
    2:required i64 balance
    3:optinal string name
}

如果变量有默认值,可以直接写在定义文件里:

struct User {
    1: strubg uid
    2: i64  balance = 0
    3: map<i16,string> map
}
  1. 基本类型(括号内为对应的Java类型):

    • bool(boolean): 布尔类型(TRUE or FALSE)
    • byte(byte): 8位带符号整数
    • i16(short): 16位带符号整数
    • i32(int): 32位带符号整数
    • i64(long): 64位带符号整数
    • double(double): 64位浮点数
    • string(String): 采用UTF-8编码的字符串
  2. 除了上面提到的基本数据类型,Thrift还支持以下容器类型:

    • list(java.util.ArrayList)
    • set(java.util.HashSet)
    • map(java.util.HashMap)

服务的定义

include "helloworld.thrift"
namespace java com.core

service Base{
    string helloworld()
}

service Core{
    string transfer(1:string fromId,2:string toId,  3:i64 amount)
    int64 add(1:i64 number1,2:i64 number2)
}

在这个core.thrift文件里定义的Core这个service继承了Base这个service,其中namespace决定了生成的java文件将会放在哪个包内。

服务的实现

如果要单独生成某个thrift文件的指定语言版本代码,输入以下命令

thrift --gen <language> <Thrift filename>

如果要递归地将其include的thrift文件也生成,则使用如下命令

thrift -r --gen <language> <Thrift filename>

对于上面所示的文件,使用的命令为 thrift --gen java core.thrift
则会生成一个文件名为Core的文件,此文件中有一个为Iface的接口,实现此接口必须实现thrift文件里定义的方法。其他内容是为了thrift能正常调用的逻辑,这个文件不能进行修改。
在实际使用中,新建一个类名为CoreImpl实现Core.Iface,在这里我们将实现transfer和add两个方法的具体逻辑。这样就已经写完了thrift调用服务的准备工作,下面涉及到如何启动服务和调用服务。

服务的启动

传输通信协议

Thrift 可以让用户选择客户端与服务端之间传输通信协议的类别,在传输协议上总体划分为文本 (text) 和二进制 (binary) 传输协议,为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议为多数,有时还会使用基于文本类型的协议,这需要根据项目 / 产品中的实际需求。常用协议有以下几种:

  • TBinaryProtocol —— 二进制编码格式进行数据传输
  • TCompactProtocol —— 高效率的、密集的二进制编码格式进行数据传输
  • TJSONProtocol —— 使用 JSON 的数据编码协议进行数据传输
  • TSimpleJSONProtocol —— 只提供 JSON 只写的协议,适用于通过脚本语言解析

服务端和客户端必须使用同一种传输通信协议

传输层

常用的传输层有以下几种:

  • TSocket —— 使用阻塞式 I/O 进行传输,是最常见的模式,使用TServerSocket
  • TFramedTransport —— 使用非阻塞方式,按块的大小进行传输,类似于 Java 中的 NIO,使用TNonblockingServerTransport
  • TNonblockingTransport —— 使用非阻塞方式,用于构建异步客户端
服务端类型

常见的服务端类型有以下几种:

  • TSimpleServer —— 单线程服务器端使用标准的阻塞式 I/O
  • TThreadPoolServer —— 多线程服务器端使用标准的阻塞式 I/O
  • TNonblockingServer —— 多线程服务器端使用非阻塞式 I/O
Server与Client

下面是简单的使用TBinaryProtocol通信和使用Tsocket以及服务端类型为TThreadPoolServer的情况:
Core的Server

 public static void main(String[] args) { 
    try { 
        TServerSocket serverTransport = new TServerSocket(9999); //设置服务端口            
        Factory proFactory = new TBinaryProtocol.Factory();  //设置通信协议             
        TProcessor processor = new Core.Processor<Core.Iface>(CoreImpl); //关联处理器服务
        TThreadPoolServer.Args serverArgs = (new TThreadPoolServer.Args(serverTransport)).processor(processor);
        serverArgs.protocolFactory(proFactory);//填充启动参数
        TServer server = new TThreadPoolServer(serverArgs);
        server.serve(); 
    } catch (TTransportException e) { 
        e.printStackTrace(); 
    } 
} 

Core的Client

public static void main(String[] args) { 
    try { 
        TTransport transport = new TSocket("localhost", 9999); 
        transport.open(); 
        TProtocol protocol = new TBinaryProtocol(transport);//设置传输协议 
        Core.Client client = new Core.Client(protocol); 
        client.transfer("1","2",1); 
        transport.close(); 
    } catch (TTransportException e) { 
        e.printStackTrace(); 
    } catch (TException e) { 
        e.printStackTrace(); 
    } 
} 
非阻塞式异步

to be continue

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

推荐阅读更多精彩内容