參考:https://mp.weixin.qq.com/s/aO8ybUiu5htqcoGAwxwc5Q?utm_source=tuicool&utm_medium=referral
1、Go的goroutine並發機制使Go非常適合用於大規模高並發后端服務程序的開發 2、tars是個開源的微服務平台,包含了一個高性能的rpc框架和服務管理平台 tarsweb:監視服務節點的運行時狀態,以及發布,部署,啟動或停止服務器 tarsregistry:Registry 是微服務集群的管理和控制節點,提供服務注冊和發現等功能。 tarspatch:Tarspatch提供發布管理服務。Tarsweb使用它向服務器發布指定版本的服務 tarsconfig:Tarsconfig作為配置中心。它管理所有服務器的服務配置文件 tarslog:Tarslog提供遠程日志服務。來自服務器的日志將發送到tarslog。Tarslog存儲這些日志以供進一步使用 tarsstat:來自服務器的Tarsstat統計信息,例如工作負載,響應時間,超時請求比率。Monitor服務使用這些信息來發現異常服務器並發出警告 tartproperty:除了來自tarsstat的統計信息之外,用戶還可以為服務器定義與業務相關的屬性,例如內存使用情況,隊列大小,緩存命中率。Monitor服務使用這些信息來發現異常服務器並發出警告 tarsnotify:從服務器Tarsnotify統計異常信息,如db failure,發現異常服務器並發出警告 Tarsnode管理服務器。它可以停止,啟動,發布和監控它們。同時,它接受來自服務器的心跳 3、容錯(排除名稱服務、客戶端屏蔽) 4、(過載保護)為避免因突發請求或機器故障導致系統過載,tars在框架中處理此方案。為了提高系統吞吐量,服務器使用請求隊列異步處理請求。服務器監視隊列的長度。如果長度超過閾值,則服務器拒絕新請求。如果請求長時間保留在隊列中,服務器也會丟棄請求
5、調用方式主要以 RPC 為主,支持同步、異步和單向調用幾種方式。在服務治理方面除了支持服務注冊、發現等業界常說的能力之外,還提供面對海量訪問的一些其它治理能力,如 Set 模型、自動區域感知、過載保護等,語言上除了此次新支持的 Golang,目前已經支持了 C++、Java、NodeJS 與 PHP
6、服務節點是 Tars 運行的原子單元,可以是一個容器也可以是一個虛機或物理機,一個業務服務通過部署多個服務節點來解決容量和容錯問題。服務節點上包括一個 node 管理服務和一個或多個業務服務,node 服務對本節點的服務進行統一管理,提供啟停、監控服務節點等功能,同時接收業務服務節點上報過來的心跳,上報給 Registry 作為服務發現的數據來源
7、(基礎服務集群)基礎服務集群是為解決微服務治理而設計的一系列服務,服務節點數量不定,為了自身的容錯容災,一般也要求在多個服務器上進行部署,具體的節點數量與業務規模有關,比如,如果業務規模大需要打較多的日志,就需要部署更多的日志服務節點。基礎服務主要包括監控統計、配置中心、日志聚合、認證鑒權和分布式調用鏈等。Tars 具有非常完善的服務治理能力
8、(屏蔽故障)屏蔽故障節點,Client 根據調用被調服務的異常情況判斷是否有故障來更快地進行故障屏蔽。具體策略是,當 Client 調用某個服務器出現調用連續超時超過設置閾值,或者調用的超時比率超過一定百分比閾值,Client 就會對此服務器節點進行屏蔽,讓流量分發到正常的節點上去。對屏蔽的服務器節點,每隔一定時間進行重連,如果正常,則進行正常的流量分發
服務端啟動
./HelloServer --config=config.conf
package main import ( "fmt" "github.com/TarsCloud/TarsGo/tars" "TestApp" ) //tars.Communicator should only init once and be global var comm *tars.Communicator func main() { comm = tars.NewCommunicator() obj := "TestApp.TestServer.HelloObj@tcp -h 127.0.0.1 -p 10015 -t 60000" app := new(TestApp.Hello) comm.StringToProxy(obj, app) var req string="Hello Wold" var res string ret, err := app.TestHello(req, &out) if err != nil { fmt.Println(err) return } fmt.Println(ret, out)
}
說明:
/*
- TestApp包是由tars2go工具使用tars協議文件生成的.
- comm: Communicator用於與服務端進行通信,它應該只初始化一次並且是全局的.
- obj: 對象名稱,用於指定服務端的ip和端口。通常在"@"符號之前我們只需要對象名稱.
- app: 與tars文件中的接口關聯的應用程序。 在本例中它是TestApp.Hello.
- StringToProxy: StringToProxy方法用於綁定對象名稱和應用程序,如果不這樣做,通信器將不知道誰與應用程序通信 .
- req, res: 在tars文件中定義的輸入和輸出參數,用於在TestHello方法中.
- app.TestHello用於調用tars文件中定義的方法,並返回ret和err.
*/
------------------------------------------------------------------------------------------------------------------------
HTTP調用,tars無關,沒有用到遠程rpc
1、創建工程,生成HTTP服務(沒有生成http的,直接復用tars的)
2、修改makefile,去掉"CONFIG := client"
3、將GoWebServer.go簡化
4、實現GoWebImp.go
5、進入$GOPATH/src/amc/GoWebServer,make生成相應的執行文件,啟動
6、HTTP服務測試
------------------------------------------------------------------------------------------------------------------------
TARS原生rpc調用:
1、創建工程,生成TARS服務
sh $GORATH/src/github.com/TarsCloud/TarsGo/tars/tools/create_tars_server.sh TestApp HelloGo SayHello
2、按需編寫TARS協議
3、使用tars2go進行協議識別
$GORATH/bin/tars2go SayHello.tars
4、調整SayHelloImp.go
5、調整HelloGo.go
6、make,生成可執行服務端代碼
7、實現client.go代碼
root@cvm-172_16_30_19:/usr/local/gopath/src/TestApp/HelloGo/client # cat client.go package main import ( "fmt" "github.com/TarsCloud/TarsGo/tars" "TestApp" ) //只需初始化一次,全局的 var comm *tars.Communicator func main() { comm = tars.NewCommunicator() obj := "TestApp.HelloGo.SayHelloObj@tcp -h 127.0.0.1 -p 10015 -t 60000" app := new(TestApp.SayHello) /* // if your service has been registered at tars registry comm = tars.NewCommunicator() obj := "TestApp.HelloGo.SayHelloObj" // tarsregistry service at 192.168.1.1:17890 comm.SetProperty("locator", "tars.tarsregistry.QueryObj@tcp -h 192.168.1.1 -p 17890") */ comm.StringToProxy(obj, app) reqStr := "tars" var resp string ret, err := app.EchoHello(reqStr, &resp) if err != nil { fmt.Println(err) return } fmt.Println("ret: ", ret, "resp: ", resp) }
8、啟動,驗證通過