前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >thrift 的基本介绍与使用

thrift 的基本介绍与使用

作者头像
用户3147702
发布2022-06-27 13:41:16
1.8K0
发布2022-06-27 13:41:16
举报
文章被收录于专栏:小脑斧科技博客

1. thrift 介绍

thrift 是一个 apache 公司开源的一款 RPC 框架,让不同语言构建的服务可以做到远程调用无缝对接。 thrift 服务分为服务提供方(server 端)和服务请求方(client 端)

通过 idl 文件做到 server 与 client 的解耦。

代码语言:javascript
复制
service DemoService {
    string say();
}

上面就是一个最简单的 idl 文件,他表示服务名为:DemoService 的服务中提供了一个名为 say 的方法,这个方法无参数传入,返回 string 类型。

thrift idl 的详细介绍见本文第四部分。

2. 使用方式1 – thrift -gen

2.1. 安装 thrift 环境

1. 安装 thrift 生成工具。

  • windows 下载 thrift.exe – http://archive.apache.org/dist/thrift/0.9.1/thrift-0.9.1.exe
  • centos 执行 yum install thrift
  • 通过源码编译安装 – https://github.com/apache/thrift

2. 安装 thrift python 包。 执行:

pip install thrift

2.2. 生成代码文件

执行:

thrift -r -gen py demoservice.thrift

demoservice 就是存储我们上述所说的 DemoService 的文件,如果要生成其他语言的代码,则将 py 换成对应的目标语言,如 java、cpp、php 等。

2.3. server 代码

代码语言:javascript
复制
# coding: utf-8
"""
thrift_client.py
"""

from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer

from genthrift.service import DemoService


class DemoServiceHandler:
    def say(self):
        return "hello world"


handler = DemoServiceHandler()
processor = DemoService.Processor(handler)
transport = TSocket.TServerSocket(port=9090)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()

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

print("Starting thrift server in python...")
server.serve()
print("done!")

上面的代码实现了 DemoService 的 server 端,返回 hello world 字符串,核心代码是 DemoServiceHandler 的实现。

执行脚本,打印出了: Starting thrift server in python…

2.4. client 代码

代码语言:javascript
复制
from thrift import Thrift
from thrift.protocol import TBinaryProtocol
from thrift.transport import TSocket, TTransport

from genthrift.service import DemoService


if __name__ == '__main__':
    try:
        transport = TSocket.TSocket(port=9090)
        transport = TTransport.TBufferedTransport(transport)
        protocol = TBinaryProtocol.TBinaryProtocol(transport)
        client = DemoService.Client(protocol)
        transport.open()

        str = "client - say: " + client.say()
        print(str)
        transport.close()

    except Thrift.TException as ex:
        print("%s" % (ex.message))

代码实现了对 server 的调用,执行脚本,打印出了: client - say: hello world。

3. 使用方式2 – thriftpy2

thriftpy2 是饿了么开源的 thrift 协议纯 python 实现,具有与原生 thrift 完全相同的特性,但编写和调用方法更为简单,且不需要生成额外的代码文件。

3.1. 环境搭建

执行:

pip install thriftpy2

3.2. server 端代码

代码语言:javascript
复制
import thriftpy2

demo_thrift = thriftpy2.load("demoservice.thrift", module_name="demo_thrift")

from thriftpy2.rpc import make_server


class DemoServiceHandler(object):
    def say(self):
        return "hello world"


server = make_server(demo_thrift.DemoService, DemoServiceHandler(), '0.0.0.0', 9090)
server.serve()
3.3 client 端代码
import thriftpy2
demo_thrift = thriftpy2.load("demoservice.thrift", module_name="demo_thrift")

from thriftpy2.rpc import make_client

client = make_client(demo_thrift.DemoService, '127.0.0.1', 9090)
print(client.say())

执行 client 端代码,打印出了: hello world。

4. idl 介绍

4.1. 基本类型

  • bool: 布尔值 (true or false), one byte
  • byte: 有符号字节
  • i16: 16位有符号整型
  • i32: 32位有符号整型
  • i64: 64位有符号整型
  • double: 64位浮点型
  • string: 包括文本类型和二进制字符串
  • void: 方法无返回值,可以定义返回类型为 void

4.2. 容器类型

  • list<t1>: 元素类型为t1的有序表,容许元素重复
  • set<t1>:元素类型为t1的无序表,不容许元素重复
  • map<t1, t2>: 键类型为t1,值类型为t2的kv对,键不容许重复

4.3. 枚举类型

枚举可以指定每个元素的值,也可以不指定,默认从 0 开始递增。

代码语言:javascript
复制
enum TweetType {
    TWEET,
   RETWEET = 2,
    DM = 0xa,
   REPLY
}

4.4. 结构体

thrift 要求每个域都必须有一个唯一的正整数标识符,结构体可以包含其它结构体,可以指定默认值。

代码语言:javascript
复制
struct Location {
    1: required double latitude = 1.0;
    2: required double longitude;
}

4.5. 常量

代码语言:javascript
复制
const i32 INT_CONST = 1234;

4.6. 其他

  • namespace – 用于指定不同语言生成的目录结构 namespace cpp project namespace java com.example.project namespace php project
  • include – 用于引用其他 idl 文件 include "tweet.thrift"

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小脑斧科技博客 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. thrift 介绍
  • 2. 使用方式1 – thrift -gen
    • 2.1. 安装 thrift 环境
      • 2.2. 生成代码文件
        • 2.3. server 代码
          • 2.4. client 代码
          • 3. 使用方式2 – thriftpy2
            • 3.1. 环境搭建
              • 3.2. server 端代码
              • 4. idl 介绍
                • 4.1. 基本类型
                  • 4.2. 容器类型
                    • 4.3. 枚举类型
                      • 4.4. 结构体
                        • 4.5. 常量
                          • 4.6. 其他
                          相关产品与服务
                          容器服务
                          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档