golang搭建thrift RPC服务实践

折腾了两天,终于调通了用golang搭建的thrift rpc服务,这个过程中遇到了很多问题,而且有些问题困扰了很久,欣喜之余,觉得一定要把这些过程记下来,对于自己来说是个备忘录,对于别人来说也是不错的参考。

环境的搭建

首先安装go,这个用yum安装,版本1.9.4。

我这里用的是thrift 0.10.0 , 不是最新的 0.11.0 , 这个两个非常的不兼容,一定要注意,thrift 0.11.0的server handler的函数实现时要加一个非常怪异的 context.Context参数,但是并不清楚这个参数在服务接口中有什么用处。

第一个问题是安装thrift 0.10.0 , thrift不能通过yum安装,也不能通过rpm包安装,只能手动编译;
首先下载thrift 0.10.0 地址 https://codeload.github.com/apache/thrift/zip/0.10.0
在服务器上解压后,进入到解压目录中
执行以下
./bootstrap.sh
./configure
make
make install
如果没有报错,恭喜你安装成功了。但是应该不会,因为缺少一些go的package,而且,因为墙的原因,下载会失败。

make过程中会有如下日志:

GOPATH=`pwd` /usr/bin/go get github.com/golang/mock/gomock
package golang.org/x/net/context: unrecognized import path "golang.org/x/net/context" (https fetch: Get https://golang.org/x/net/context?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
make[3]: *** [gopath] Error 1
make[3]: Leaving directory `/home/kaifa/congpeiqing/thrift-0.10.0/test/go'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/kaifa/congpeiqing/thrift-0.10.0/test'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/kaifa/congpeiqing/thrift-0.10.0'
make: *** [all] Error 2

后来经过尝试验证,这里面其实是缺了两个包,我们需要手动安装。

GOROOT目录一般在/usr/lib/golang,我们手动安装在这下面就可以了。在/usr/lib/golang/src(不了解为什么加了个src请先了解一下GOLANG)下面创建目录 github.com/golang/mock/gomock
下载 mock-master.zip 下载地址https://codeload.github.com/golang/mock/zip/master
下载net-master.zip 下载地址 https://codeload.github.com/golang/net/zip/master
将这两个文件放到服务器上。

unzip net-master.zip
mkdir -p /usr/lib/golang/src/golang.org/x/net/
cp -r net-master/* /usr/lib/golang/src/golang.org/x/net/
go install net

unzip mock-master.zip
mkdir -p /usr/lib/golang/src/github.com/golang/mock
cp -r mock-master/* /usr/lib/golang/src/github.com/golang/mock/
go install github.com/golang/mock/gomock
把这两个弄好之后再去刚才那个thrift目录下面执行make 和make install应该就没问题了。
验证一下
thrift –version
输出
Thrift version 0.10.0

还需要安装一下go的thrift包
这个就比较容易了,所需要的文件就在刚才的thrift-0.10.0目录下面,
进入这个目录
mkdir -p /usr/lib/golang/src/git.apache.org/thrift.git/lib/go/
cp -r lib/go/* /usr/lib/golang/src/git.apache.org/thrift.git/lib/go/
go install git.apache.org/thrift.git/lib/go/thrift
这样环境准备就OK了。

服务端程序

package main

import (
    "fmt"
    "test"
    "testhandler"
    "log"

    "git.apache.org/thrift.git/lib/go/thrift"
)

// 定义监听端口
const (
    HOST = "192.168.0.1"
    PORT = "9998"
)

func main() {
    handler := &testhandler.DaylightHandler{}
    // 处理器
    processor := test.NewTestServiceProcessor(handler)
    serverTransport, err := thrift.NewTServerSocket(HOST + ":" + PORT)
    if err != nil {
        log.Fatalln("Error:", err)
    }
    // 传输器
    transportFactory := thrift.NewTBufferedTransportFactory(10000000)
    // 传输协议
    protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()
    // 服务器
    server := thrift.NewTSimpleServer4(processor, serverTransport, transportFactory, protocolFactory)
    fmt.Println("Running at:", HOST+":"+PORT)
    // 启动服务
    server.Serve()
}

注意transportFactory := thrift.NewTBufferedTransportFactory(10000000)
这可能有不同的选项,大部分参考代码中给的都是transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())
客户端连接时候一定要与此对应。

客户端代码示例

先给python安装thrift包
pip install thrift==0.10.0

import sys
#sys.setdefaultencoding('utf8')

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol


try:
    transport = TSocket.TSocket('192.168.0.1', 9998)
    transport = TTransport.TBufferedTransport(transport)
    protocol = TBinaryProtocol.TBinaryProtocol(transport)
    client = Client(protocol)
    transport.open()
    print(client.process(req))
    transport.close()
except Thrift.TException as tx:
    print('time %s' % (tx.message))

这里的transport = TTransport.TBufferedTransport(transport)
对应于服务端的transportFactory := thrift.NewTBufferedTransportFactory(10000000)
如果服务端用的是transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())
客户端用这种方式是连不通的,服务端会报出下面的信息

2018/06/14 17:26:38 error processing request: Incorrect frame size (2147549185)
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。博主微信conggova。 https://blog.csdn.net/conggova/article/details/80696923
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭