thrift初学

thrift早期由facebook内部团队开发,主要用于实现跨语言间的方法调用,属于远程方法调用的一中,后开源纳入apache中,成为了apache thrift项目。thrift允许定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。

thrift和http restful style在理解上很相似,即在接口定义层面,能达到顾名思义的效果。如下,为thrift服务定义配置文件:


demo.thrift文件

namespace java com.micmiu.thrift.demo

struct Work {

1: i32 num1 = 0,

2: i32 num2,

}

service  HelloWorldService {

string sayHello(1:string username),

i32 add(1:i32 num1, 2:i32 num2),

string fuck(1:Work work)

}


以上定义了一个接口,以及接口内的三个方法sayHello, add,fuck。接下来我们要做的事情是,创建一个实现该接口方法的服务实现类(在下文中我们称呼做实现类) 以及 调用该接口方法的调用类(在下文中我们称呼做调用类)。

鉴于要提现thrift的跨语言方法调用特性,这里我们选择使用python作为thrift的调用方,java作为thrift的实现方。步骤如下:

步骤1:

生成python 和 java的thrift接口定义代码文件。这里需要用到thrfit编译器(用于动态生成接口定义代码文件,下载地址:https://thrift.apache.org/download),进入到接口定义代码文件(demo.thrift)目录,执行以下命令:


thrift.exe  -r --gen java demo.thrift  #生成java源码,在当前目录生成gen-java目录,对应生成的服务定义接口类为:HelloWorldService.java

thrift.exe  -r --gen py demo.thrift  #生成python源码,在当前目录生成gen-py目录,对应申城的服务定义接口类为:HelloWorldService.py


步骤2:

编写服务的实现类,这里我们选择用java编辑服务实现类。如下:


HelloWorldImpl.java

package com.micmiu.thrift.demo;

import org.apache.thrift.TException;

public class HelloWorldImpl implements HelloWorldService.Iface {

public HelloWorldImpl() {

// TODO Auto-generated constructor stub

}

public String sayHello(String username) throws TException {

// TODO Auto-generated method stub

return "fuck you, sir [ " + username + "]";

}

public int add(int num1, int num2) throws TException {

// TODO Auto-generated method stub

return num1 + num2;

}

public String fuck(Work work) throws TException {

// TODO Auto-generated method stub

return "fuck num :" + work.num2;

}

}


从源码不难看出,该服务类实现了demo.thrift里定义的三方法,add , sayHello, fuck。编写完成后,我们来写个sever demo让服务端先在8090端口跑起来:


HelloServerDemo.java

package com.micmiu.thrift.demo;import org.apache.thrift.TProcessor;import org.apache.thrift.protocol.TBinaryProtocol;import org.apache.thrift.protocol.TCompactProtocol;import org.apache.thrift.protocol.TJSONProtocol;import org.apache.thrift.protocol.TSimpleJSONProtocol;import org.apache.thrift.server.TServer;import org.apache.thrift.server.TSimpleServer;import org.apache.thrift.transport.TServerSocket;/** * blog http://www.micmiu.com * * @author Michael * */public class HelloServerDemo {public static final int SERVER_PORT = 8090;public void startServer() {try {System.out.println("HelloWorld TSimpleServer start ....");TProcessor tprocessor = new HelloWorldService.Processor(

new HelloWorldImpl());

// HelloWorldService.Processor tprocessor =

// new HelloWorldService.Processor(

// new HelloWorldImpl());

// 简单的单线程服务模型,一般用于测试

TServerSocket serverTransport = new TServerSocket(SERVER_PORT);

TServer.Args tArgs = new TServer.Args(serverTransport);

tArgs.processor(tprocessor);

tArgs.protocolFactory(new TBinaryProtocol.Factory());

// tArgs.protocolFactory(new TCompactProtocol.Factory());

// tArgs.protocolFactory(new TJSONProtocol.Factory());

TServer server = new TSimpleServer(tArgs);

server.serve();

} catch (Exception e) {

System.out.println("Server start error!!!");

e.printStackTrace();

}

}

/**

* @param args

*/

public static void main(String[] args) {

HelloServerDemo server = new HelloServerDemo();

server.startServer();

}

}


通过命令行编译运行或者eclipse直接编译运行HelloServerDemo,让其处于运行状态,监听8090端口请求。

步骤3:

编写调用类,这里选择python做为调用类。如下:


pclient.py

#!/usr/bin/env python

#

# Licensed to the Apache Software Foundation (ASF) under one

# or more contributor license agreements. See the NOTICE file

# distributed with this work for additional information

# regarding copyright ownership. The ASF licenses this file

# to you under the Apache License, Version 2.0 (the

# "License"); you may not use this file except in compliance

# with the License. You may obtain a copy of the License at

#

#  http://www.apache.org/licenses/LICENSE-2.0

#

# Unless required by applicable law or agreed to in writing,

# software distributed under the License is distributed on an

# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

# KIND, either express or implied. See the License for the

# specific language governing permissions and limitations

# under the License.

#

import sys

import glob

sys.path.append('gen-py')

# sys.path.insert(0, glob.glob('../../lib/py/build/lib*')[0])

from demo import HelloWorldService

from demo.ttypes import Work

from thrift import Thrift

from thrift.transport import TSocket

from thrift.transport import TTransport

from thrift.protocol import TBinaryProtocol

def main():

# Make socket

transport = TSocket.TSocket('localhost', 8090)

# Buffering is critical. Raw sockets are very slow

transport = TTransport.TBufferedTransport(transport)

# Wrap in a protocol

protocol = TBinaryProtocol.TBinaryProtocol(transport)

# Create a client to use the protocol encoder

client = HelloWorldService.Client(protocol)

# Connect!

transport.open()

result = client.sayHello("xiaolizi")

print (result)

sum_ = client.add(1, 1)

print('1+1=%d' % sum_)

work = Work()

work.num1 = 1

work.num2 = 5

result1 = client.fuck(work)

print (result1)

# Close!

transport.close()

if __name__ == '__main__':

try:

main()

except Thrift.TException as tx:

print('%s' % tx.message)


运行,输出如下:

fuck you, sir [ xiaolizi]

1+1=2

fuck num :5


结束:

以上demo实现了python通过thrift协议调用远程java端服务,实现了我们上文提到的远程调用。当然,thrift的强大功能远远不仅于此,想要了解学习的话,可以去apache thrift官网上看看官方文档介绍,并动手实践一番。感谢各位阅读,小弟不胜笔力,文中若有错误、不当之处,欢迎指出,还请多多体谅, LOL~

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

推荐阅读更多精彩内容