golang简单使用Thrift

Mon May 14, 2018

900 Words|Read in about 2 Min
Tags: rpc   thrift   other   golang  

最近在研究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

将下面信息写入文件

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
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
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)
}

go run server.go
go run client.go

服务端结果:

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

客户端结果:

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

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

OK! See you!

See Also

Mon May 14, 2018

900 Words|Read in about 2 Min
Tags: rpc   thrift   other   golang