0%

thrift使用记录

一、概念介绍

二、golang实现

1. 生成golang的文件

  • thrift文件
1
2
3
4
5
6
7
8
namespace go a.b.c

service C {
void startNetworkDiagnosis(1: string url, 2: string traceid);
void startResourceDiagnosis(1: string url, 2: string traceid);
void startResourceDiagnosisWithItems(1: string url, 2: string traceid, 3: list<string> items);
bool IsRpcStatusNormal();
}
  • 生成go文件
1
thrift --gen go xxx.thrift

2. 客户端

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
45
46
47
48
49
50
51
52
53
54
55
56
57
package main

import (
"aTrustRpcClient/gen-go/sdptrusttunnelservice"
"encoding/json"
"fmt"
"net/http"
"time"

"context"

"github.com/apache/thrift/lib/go/thrift"
)

var defaultCtx = context.Background()

func tunnelRpcHandler(reqJson string, w http.ResponseWriter, r *http.Request) {
startTime := currentTimeMillis()

// 新建一个默认配置,后续需要用到
cfg := &thrift.TConfiguration{}
var transport thrift.TTransport
// 新建socket对对应端口建立连接
transport = thrift.NewTSocketConf("localhost:"+fmt.Sprint(tunnelRpcPort), cfg)
// 根据端口建立一个buffered传输层
transport = thrift.NewTBufferedTransport(transport, 10240)
// 基于传输层建立二进制协议
iprot := thrift.NewTBinaryProtocolConf(transport, cfg)
// 这一步是发送使用多路复用
oprot := thrift.NewTMultiplexedProtocol(iprot, "SdpTrustTunnelService")

// 开始建立连接
if err := transport.Open(); err != nil {
http.Error(w, err.Error(), 500)
return
}
defer transport.Close()

// 基于协议和传输层新建客户端
client := sdptrusttunnelservice.NewSdpTrustTunnelServiceClientProtocol(transport, iprot, oprot)
// 调用接口获得返回值
res, err := client.GetModuleStatus(defaultCtx, rpcReqData.ModuleName)
if err != nil {
http.Error(w, err.Error(), 500)
return
}

endTime := currentTimeMillis()
fmt.Println("Program exit. time->", endTime, startTime, (endTime - startTime))
w.Header().Set("Content-Type", "application/json")
fmt.Fprintf(w, "%s", res)
}

// 转换成毫秒
func currentTimeMillis() int64 {
return time.Now().UnixNano() / 1000000
}

小技巧和踩坑记