原创

Thrift入门实践

简介

Thrift是由facebook研发,用于各服务之间RPC的一个跨语言通信框架。C/S架构

Thrift IDL

为了能够把不同的语言连接在一起,就必须要有一种“中间语言”,来关联客户端和服务端的两种不同语言。

这种规范语言就是IDL(Interface Description Language),接口定义语言。

具体的语法、定义参考下文,基本是C风格

生成代码

在编写好IDL之后,使用thrift的命令就可以生成对应语言的框架。

e.g IDL文件:HelloWorld.thrift

namespace py thrift_test.hello

enum RequestType {
   SAY_HELLO,   //问好
   QUERY_TIME,  //询问时间
}

struct Request {
   1: required RequestType type;  // 请求的类型,必选
   2: required string name;       // 发起请求的人的名字,必选
   3: optional i32 age;           // 发起请求的人的年龄,可选
}

exception RequestException {
   1: required i32 code;
   2: optional string reason;
}

// 服务名
service HelloWordService {
   string doAction(1: Request request) throws (1:RequestException qe); // 可能抛出异常。
}

执行命令生成对应的代码框架。执行成功后将在同级目录下产生一个文件夹,内部构如下:

gen-py
├── __init__.py
└── thrift_test
    ├── __init__.py
    └── hello
        ├── HelloWordService-remote
        ├── HelloWordService.py
        ├── __init__.py
        ├── constants.py
        └── ttypes.py

其中里包含了在IDL里定义好的各种数据类型对应封装的Python类,包含了所有定义的常量,则定义对应Service的完整描述,包括接口定义(),Client的调用桩等。

编写实现

对应语言的框架生成好之后,需要做的就是编写具体的实现了,以python为例,就是要实现对应里的方法,作为handler和其他各种组件组合,从而生成服务端代码。

以下是具体的例子

编写

# -*- coding: utf-8 -*-

import datetime

from thrift_test.hello import ttypes
from thrift_test.hello import HelloWordService
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer

__HOST = 'localhost'
__PORT = 9577


class HelloWordHandler(object):
    def doAction(self, request):
        ret_msg = ''
        if request.type == ttypes.RequestType.SAY_HELLO:
            ret_msg = 'Hello %s, we received your msg' % request.name
        elif request.type == ttypes.RequestType.QUERY_TIME:
            ret_msg = "current_time: " + str(datetime.datetime.now())
        print 'get request: %s' % request
        return ret_msg


handler = HelloWordHandler()
processor = HelloWordService.Processor(handler)
transport = TSocket.TServerSocket(__HOST, __PORT)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()

server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)

print "starting server..."

server.serve()

print "done"

编写

# -*- coding: utf-8 -*-

import datetime

from thrift_test.hello import ttypes
from thrift_test.hello import HelloWordService
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer

__HOST = 'localhost'
__PORT = 9577


class HelloWordHandler(object):
    def doAction(self, request):
        ret_msg = ''
        if request.type == ttypes.RequestType.SAY_HELLO:
            ret_msg = 'Hello %s, we received your msg' % request.name
        elif request.type == ttypes.RequestType.QUERY_TIME:
            print "type query"
            ret_msg = "current_time: " + str(datetime.datetime.now())
        print 'get request: %s' % request
        return ret_msg


handler = HelloWordHandler()
processor = HelloWordService.Processor(handler)
transport = TSocket.TServerSocket(__HOST, __PORT)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()

server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)

print "starting server..."

server.serve()

print "done"

liuminghao@n8-160-227:~/repos/thrift_test/demo$ cat client.py 
# -*- coding:utf-8
from thrift_test.hello import HelloWordService
from thrift_test.hello.ttypes import Request,RequestType
from thrift import Thrift
from thrift.transport import TSocket, TTransport
from thrift.protocol import TBinaryProtocol

try:
    transport = TSocket.TSocket('localhost',9577)
    transport = TTransport.TBufferedTransport(transport)
    protocol = TBinaryProtocol.TBinaryProtocol(transport)
    client = HelloWordService.Client(protocol)
    transport.open()

    req = Request(RequestType.SAY_HELLO,"mark",12)

    print "request 1"

    msg = client.doAction(req)

    print "server msg 1: " + msg 

    req = Request(RequestType.QUERY_TIME,"marky")

    print "request 2"

    msg = client.doAction(req)

    print "server msg 2: " + msg 

    transport.close()

except Thrift.TException as e:
    print "exception: " + e.message 

先运行再执行,结果如下:

request 1
server msg 1: Hello mark, we received your msg
request 2
server msg 2: current_time: 2018-01-15 15:14:40.800472

如上即为一个ThriftRPC的基本使用示范。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 图片相似检测:三行代码实现

    检查两个图片的相似度,一个简单而快速的算法:感知哈希算法(Perceptual Hash),通过某种提取特征的方式为每个图片计算一个指纹(哈希),这样对比两个图...

    Marky Lumin
  • 事务与一致性:刚性or柔性?

    在高并发场景下,分布式储存和处理已经是常用手段。但分布式的结构势必会带来“不一致”的麻烦问题,而事务正是解决这一问题而引入的一种概念和方案。我们常把它当做并发操...

    Marky Lumin
  • 使用Docker三剑客部署集群

    DOCKER技术在推出后掀起了一阵容器化技术的热潮,容器化使得服务的部署变得极其简易,这为微服务和分布式计算提供了很大的便利。

    Marky Lumin
  • 大数据进阶之Spark运行流程

    在大数据的诸多技术框架当中,Spark发展至今,已经得到了广泛的认可。Hadoop与Spark可以说是企业级数据平台的主流选择,基于不同的应用场景,来搭建符合需...

    成都加米谷大数据
  • CUDA&OpenCL编程7个技巧及ArrayFire如何帮助您

    · 向量化代码Vectorized Code: 加速器执行向量化代码性能会很好因为计算自然地映射到硬件的运算内核上。ArrayFire函数本质上是量化的,因此...

    GPUS Lady
  • YARN & Mesos,论集群资源管理所面临的挑战

    在国内,大部分的Spark用户都是由Hadoop过渡而来,因此YARN也成了大多Spark应用的底层资源调度保障。而随着Spark应用的逐渐加深,各种问题也随之...

    CSDN技术头条
  • 聊聊rocketmq的maxReconsumeTimes

    rocketmq-client-4.5.2-sources.jar!/org/apache/rocketmq/client/consumer/DefaultMQ...

    codecraft
  • 今日 Paper | 重建结构和去噪GAN;循环视觉嵌入;随机优化方法;小冰乐队等

    论文名称:JRMOT: A Real-Time 3D Multi-Object Tracker and a New Large-Scale Dataset

    AI科技评论
  • YARN & Mesos,论集群资源管理所面临的挑战

    在国内,大部分的Spark用户都是由Hadoop过渡而来,因此YARN也成了大多Spark应用的底层资源调度保障。而随着Spark应用的逐渐加深,各种问题也随之...

    Albert陈凯
  • python接口测试之urllib2的应用(十五)

    在接口测试中或者说在网络爬虫中,urllib2库是必须要掌握的一个库,当然还有优秀的requests库,今天重点来说urllib2库在接口测试中...

    无涯WuYa

扫码关注云+社区

领取腾讯云代金券