分享
  1. 首页
  2. 文章

golang 网络框架之 thrift

hatlonely · · 4260 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

thrift 最初是 facebook 开发使用的 rpc 通信框架,后来贡献给了 apache 基金会,出来得比较早,几乎支持所有的后端语言,使用非常广泛,是不可不知的一个网络框架

grpc 一样,需要先定义通信协议,然后实现自己业务逻辑,下面还是通过一个简单示例(之前的echo程序)说明 thrift 的用法,下面示例使用的完整代码在下列地址:
实现文件:https://github.com/hatlonely/...
协议文件:https://github.com/hatlonely/...

简单 echo 服务

获取 thrift

go get git.apache.org/thrift.git/lib/go

定义协议文件

namespace go echo
struct EchoReq {
 1: string msg;
}
struct EchoRes {
 1: string msg;
}
service Echo {
 EchoRes echo(1: EchoReq req);
}

执行 thrift -r --gen go echo.thrift 命令会生成 gen-go 文件夹,这个过程其实是将上面的协议翻译成 golang 代码

这个命令依赖于 thrift 工具,可以通过下面命令获取

Mac

brew install thrift

Linux

wget http://www-us.apache.org/dist/thrift/0.11.0/thrift-0.11.0.tar.gz
tar -xzvf thrift-0.11.0.tar.gz
cd thrift-0.11.0
./configure
make -j8
[sudo] make install 

实现服务端

type EchoServerImp struct {
}
func (e *EchoServerImp) Echo(ctx context.Context, req *echo.EchoReq) (*echo.EchoRes, error) {
 fmt.Printf("message from client: %v\n", req.GetMsg())
 res := &echo.EchoRes{
 Msg: req.GetMsg(),
 }
 return res, nil
}
func main() {
 transport, err := thrift.NewTServerSocket(":3000")
 if err != nil {
 panic(err)
 }
 processor := echo.NewEchoProcessor(&EchoServerImp{})
 server := thrift.NewTSimpleServer4(
 processor,
 transport,
 thrift.NewTBufferedTransportFactory(8192),
 thrift.NewTCompactProtocolFactory(),
 )
 if err := server.Serve(); err != nil {
 panic(err)
 }
}

这个过程和 grpc 类似,不同的地方在于,thrift 支持更多的服务器类型,支持不同的协议打包方式,方便用户选择,这里的 compact 协议是一种压缩的协议,使用比较多

实现客户端

func main() {
 var transport thrift.TTransport
 var err error
 transport, err = thrift.NewTSocket("localhost:3000")
 if err != nil {
 fmt.Errorf("NewTSocket failed. err: [%v]\n", err)
 return
 }
 transport, err = thrift.NewTBufferedTransportFactory(8192).GetTransport(transport)
 if err != nil {
 fmt.Errorf("NewTransport failed. err: [%v]\n", err)
 return
 }
 defer transport.Close()
 if err := transport.Open(); err != nil {
 fmt.Errorf("Transport.Open failed. err: [%v]\n", err)
 return
 }
 protocolFactory := thrift.NewTCompactProtocolFactory()
 iprot := protocolFactory.GetProtocol(transport)
 oprot := protocolFactory.GetProtocol(transport)
 client := echo.NewEchoClient(thrift.NewTStandardClient(iprot, oprot))
 var res *echo.EchoRes
 res, err = client.Echo(context.Background(), &echo.EchoReq{
 Msg: strings.Join(os.Args[1:], " "),
 })
 if err != nil {
 fmt.Errorf("client echo failed. err: [%v]", err)
 return
 }
 fmt.Printf("message from server: %v", res.GetMsg())
}

这个 client 相对复杂一些,需要和 server 端设置一致的打包方式,如果不一致会出现通信失败,这一点需要特别注意一下

参考链接

转载请注明出处
本文链接:http://hatlonely.github.io/20...

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:hatlonely

查看原文:golang 网络框架之 thrift

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
4260 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏