golang简单使用Thrift

Posted by 聪少 on 2018-05-14

最近在研究jeager源码,发现内部通信协议使用的是thrift,我没分清是自动生成thrift的代码!逮着生成的thrift代码看了半天!!!!所以学习了一下thrift的简单使用!

简介

thrift的全名叫做Apache thrift,是一款软件开发RPC框架,可以很高效地实现跨语言的RPC服务。thrift最初生于Facebook,并茁壮成长,在2007年由Facebook正式开源出来,2008年由Apache软件基金会开始负责项目孵化直至今日。

安装

mac下安装
Install Boost

thrift代码生成

mkdir thrift
cd thrift
touch hello.thrift

将下面信息写入文件

1
2
3
4
5
6
7
8
9
namespace go hello  // hello 为生成的包名
struct Hello { // 通信使用的结构体
1: string request
2: string response
}

service HelloService{
Hello CallBack(1:Hello request), // 回调函数
}

命令行执行下面的指令,成功的话会在当前目录生成hello文件夹

thrift --out . --gen go hello.thrift

如果是java的话把go换成java就好了。
好了,到这里thrift源码就生成完毕了,下面来实现服务端和客户端代码就能happy的玩耍了。

服务端源码

touch server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package main

import (
"fmt"
"log"
"strings"
"thrift/hello"

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

type HelloService struct{}

// CallBack 客户端远程回调函数
func (hs *HelloService) CallBack(request *hello.Hello) (*hello.Hello, error) {
var response hello.Hello
log.Println("客户端请求信息: ", strings.ToUpper(request.Request))
response.Response = "服务端响应"
return &response, nil
}

const (
HOST = "localhost"
PORT = "8080"
)

func main() {
// 下面都是套路,服务端主要实现HelloService这个结构的接口就可以了,业务处理都是放到你定义的接口中处理的。
// 套路 start
handler := &HelloService{}
processor := hello.NewHelloServiceProcessor(handler)
serverTransport, err := thrift.NewTServerSocket(HOST + ":" + PORT)
if err != nil {
log.Fatalln("Error:", err)
}
transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())
protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()

server := thrift.NewTSimpleServer4(processor, serverTransport, transportFactory, protocolFactory)
// 套路 end
fmt.Println("服务端启动:", HOST+":"+PORT)
// 服务启动
server.Serve()
}

客户端源码

touch client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package main

import (
"fmt"
"log"
"net"
"thrift/hello"

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

const (
HOST = "localhost"
PORT = "8080"
)

func main() {

// 套路 start
tSocket, err := thrift.NewTSocket(net.JoinHostPort(HOST, PORT))
if err != nil {
log.Fatalln("tSocket error:", err)
}
transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())
transport := transportFactory.GetTransport(tSocket)
protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()

client := hello.NewHelloServiceClientFactory(transport, protocolFactory)

if err := transport.Open(); err != nil {
log.Fatalln("Error opening:", HOST+":"+PORT)
}
defer transport.Close()

// 套路 end
request := hello.Hello{
Request: "我是客户端",
}
response, err := client.CallBack(&request)
if err != nil {
log.Println(err)
}
fmt.Println("服务端响应信息: ", response.Response)
}
1
2
go run server.go
go run client.go

服务端结果:

服务端启动: localhost:8080
2018/05/14 11:11:41 客户端请求信息:  我是客户端

客户端结果:

go run client.go
服务端响应信息:  服务端响应

其实很简单!复制粘贴就好了!

OK! See you!