crackcell's dustbin home projects
首页 > Go使用Thrift笔记 > 正文

Go使用Thrift笔记

1 设置环境

  1. 安装Thrift编译器
    sudo apt install thrift-compiler -y
    
  2. 安装Thrift Go的依赖包
    go get git.apache.org/thrift.git/lib/go/thrift
    

2 Thrift组件

2.1 协议

协议 描述
TBinaryProtocol 二进制格式
TCompactProtocol 压缩格式
TJSONProtocol JSON格式
TSimpleJSONProtocol 提供JSON只写协议, 生成的文件很容易通过脚本语言解析
TDebugProtocol 使用易懂的可读的文本格式,以便于debug

2.2 数据传输方式

传输方式 描述
TSocket 阻塞式socket
TFramedTransport 以frame为单位进行传输,非阻塞式服务中使用
TFileTransport 以文件形式进行传输
TMemoryTransport 将内存用于I/O. java实现时内部实际使用了简单的ByteArrayOutputStream
TZlibTransport 方式联合使用。当前无java实现

2.3 服务模型

服务模型 描述
TSimpleServer 简单的单线程服务模型,常用于测试
TThreadPoolServer 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)

3 示例

  1. 编写接口定义文件,例,nusadua.thrift
    namespace go nusadua.shepherd.rpc
    
    exception ShepherdException {
        1: i32 status,
        2: string message
    }
    
    service ShepherdService {
        void setNodes(1:list<string> nodes) throws (1:ShepherdException ex),
        list<string> getNodesByFeature(1:list<list<i64>> key) throws (1:ShepherdException ex)
    }
    
  2. 使用thrift产生go代码
    $ thrift -r --out ../ --gen go ./nusadua.thrift
    
    • 生成的代码中:
      • parameter_service-remote:自动生成例子,可以不用
      • constants.go、parameter_service.go、ttypes.go:协议库
  3. 编写服务代码
    package shepherd
    
    import (
        "github.com/crackcell/nusadua/shepherd/rpc"
        "git.apache.org/thrift.git/lib/go/thrift"
        "fmt"
    )
    
    type Rpc struct {
        host string
        port int
        server *thrift.TSimpleServer
        stop chan bool
    }
    
    func NewRpc() *Rpc {
        return &Rpc{
            stop: make(chan bool),
        }
    }
    
    func (this *Rpc) Start(addr string, port int) (err error) {
        transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())
        protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()
        serverTransport, err := thrift.NewTServerSocket(fmt.Sprintf("%s:%d", this.host, this.port))
        if err != nil {
            return err
        }
    
        processorFactory := thrift.NewTProcessorFactory(rpc.NewShepherdServiceProcessor(this))
    
        this.server = thrift.NewTSimpleServerFactory4(processorFactory, serverTransport, transportFactory, protocolFactory)
        go func() {
            this.server.Serve()
            this.stop <- true
        }()
        return nil
    }
    
    func (this *Rpc) Stop() error {
        return this.server.Stop()
    }
    
    func (this *Rpc) Wait() {
        <- this.stop
    }
    
    func (this *Rpc) SetNodes(nodes []string) (ex *rpc.ShepherdException, err error) {
        return nil, nil
    }
    
    func (this *Rpc) GetNodesByFeature(key [][]int64) (r []string, ex *rpc.ShepherdException, err error) {
        return []string{}, nil, nil
    }
    

Date: Wed May 3 12:11:57 2017

Author: Menglong TAN

Created: 2017-05-08 Mon 14:49

Emacs 24.5.1 (Org mode 8.2.10)

Validate

Modified theme and code from Tom Preston-Werner.