TarsGoGo 語(yǔ)言實(shí)現(xiàn)的高性能微服務(wù)框架
TarsGo 是一個(gè) Go 語(yǔ)言實(shí)現(xiàn)的高性能微服務(wù)框架,也是微服務(wù)框架 Tars 的 Go 語(yǔ)言實(shí)現(xiàn)版本。
多語(yǔ)言支持是 Tars 的一大優(yōu)勢(shì),在此之前 Tars 已經(jīng)推出了 C++、Java、PHP、NodeJS 版本。Go 語(yǔ)言的協(xié)程并發(fā)機(jī)制使它非常適用于大規(guī)模高并發(fā)后端服務(wù)器程序開發(fā),同時(shí)隨著容器化技術(shù)的飛速發(fā)展,諸如 Docker、Kubernetes 與 Etcd 等項(xiàng)目興起,使得 Go 語(yǔ)言越來越流行,并成為云原生的首選語(yǔ)言。Tars 的 Go 語(yǔ)言版本也因此應(yīng)運(yùn)而生,此次 Tars-Go 的推出,在大環(huán)境整體逐漸走向云原生的當(dāng)下,意義非凡。
TarGo 架構(gòu)
Tars-Go 整體架構(gòu)主要可以分為三個(gè)部分,如下圖所示:
-
左邊是 tars2go 工具,tars2go 基于巴科斯范式(BNF),這是一種描述程序語(yǔ)言結(jié)構(gòu)的形式化方法,用來對(duì) Tars 文件進(jìn)行語(yǔ)法和詞法分析,生成相應(yīng)的代碼,供客戶端和服務(wù)端使用。同時(shí)它提供 Tars 協(xié)議二進(jìn)制流的編解碼功能,將二進(jìn)制包轉(zhuǎn)成相應(yīng)的 Go 數(shù)據(jù)結(jié)構(gòu)。
-
右邊部分是 package tars,它包含了 Client 和 Server 兩部分的功能:
-
Client 由 Servantproxy、Communicator、ObjProxy、adapterproxy 等邏輯結(jié)構(gòu)組成,這些邏輯結(jié)構(gòu)用來管理 servant,obj 對(duì)應(yīng)到的服務(wù)端節(jié)點(diǎn)的 ip 端口,和 C++ 的邏輯保持一致。底層使用 net.Conn 來建立具體的連接,并用 SendQueue chan 來控制并發(fā)數(shù)量。Client 還包含一些 Goroutine,用來做特性監(jiān)控和 stat 監(jiān)控上報(bào)。
-
Server 使用 package net 的 listener 來管理 TCP 和 UDP 連接,使用多個(gè) Goroutine 進(jìn)行 accept,并將 accept 之后的 net.Conn 經(jīng)過 SendQueue chan 交給后端的 Handler 進(jìn)行處理。Handler 由一堆 woker Goroutine 組成,每個(gè) Goroutine 基于 net.Conn 進(jìn)行收發(fā)包、Tars 協(xié)議解碼,并經(jīng)過 dispatcher(由 tars2go 生成) 來調(diào)用用戶的代碼實(shí)現(xiàn),然后將結(jié)果編碼成二進(jìn)制流返回給 Client。Server 也包含一些 Goroutine 實(shí)現(xiàn)遠(yuǎn)程日志異步上報(bào)等功能,防止同步調(diào)用阻塞請(qǐng)求。
-
TarsGo 編程示例
Tars 協(xié)議是一個(gè)二進(jìn)制協(xié)議,它是與語(yǔ)言無關(guān)的 IDL 語(yǔ)言,由工具自動(dòng)生成服務(wù)端和客戶端代碼,下邊是一個(gè) Tars 協(xié)議的示例:
struct LoginInfo {
0 require string sid;
1 require string code;
}
struct ProfileInfo {
0 require string nick;
1 require int level;
}
interface TestServant {
int test(int qq, LoginInfo li, out ProfileInfo pi);
}