導語
PolarisMesh 是騰訊開源的百萬級服務發現和治理中心,積累了騰訊從虛擬機器器到容器時代的分散式服務治理經驗。作為分散式和微服務架構中的核心元件,PolarisMesh 提供服務定址、流量排程、故障容錯和存取控制等一系列能力,在K8s 和虛擬機器器環境中可以無差別使用,支援主流的開發模式,相容grpc、spring cloud和servicemesh等開源生態,幫助使用者快速構建擴充套件性強、可用性高的業務架構,實現從傳統架構到雲原生架構的轉型。
作者簡介
單家駿
騰訊雲高級研發工程師
騰訊北極星(PolarisMesh)開源專案、彈性微服務引擎TSE核心研發,10+年從業經驗,從事雲端計算及中介軟體 7 年有餘。熱愛開源、崇尚技術,希望能夠使用技術使軟體的應用變得簡單、高效和美好。
全面擁抱Go社群
PolarisMesh以服務註冊中心為基礎,提供了服務註冊發現,健康檢查等能力;同時擴充套件了服務治理控制面,支援了流量排程(動態路由、負載均衡)、熔斷降級、存取控制(限流)等功能。
在使用者端接入上,PolarisMesh提供了多語言Proxyless(Go,Java,C++)以及Sidecar(envoy,Java agent)的接入方式,供不同形態的應用進行接入。同時,PolarisMesh也提供了生態元件,以提升已使用了生態框架的應用的接入效率,下文主要介紹的是Go語言相關的生態元件(gRPC-Go)的使用及實現。
什麼是gRPC-Go
在Go語言社群,發展最成熟,使用最廣泛的RPC框架就是gRPC-Go(https://github.com/grpc/grpc-go)。
gRPC是一個高效能的二進位制RPC框架,通過統一定義的RPC服務描述,配合多語言的SDK,可以輕鬆實現跨語言的RPC呼叫。
gRPC-Go是gRPC框架的Go語言的實現,核心層提供在RPC呼叫過程中的定址,訊息編解碼,網路收發、連線管理,故障重試等功能,並且可以通過外掛的方式,擴充套件服務發現、負載均衡、鑑權以及鏈路跟蹤等服務治理的高階能力:
然而,假如將gRPC作為一個服務架構使用的話,以當前的能力,部分服務治理相關的場景還是滿足不了。比如:
-
就近路由場景:使用者希望應用可以進行就近存取,以降低鏈路時延,同時在區域故障的時候,可以進行跨區的容災切換
-
故障熔斷場景 : 在節點出現down機時,能對故障節點進行及時剔除以避免雪崩效應
-
優雅下線場景 : 為了保服務呼叫成功率不受節點裁撤影響,節點在裁撤前,需要先進行流量的剔除,再進行裁撤下線
-
流量限制場景 : 在應用進行行銷活動時,為了保障活動的進場流量在預估範圍之內,需要將異常流量通過全域性方式進行限制。
為解決上述這些服務治理相關的場景訴求,需要將PolarisMesh的能力與gRPC進行整合,是的gRPC能真正成為一個全功能的服務架構。
PolarisMesh對接gRPC-Go
1. 實現方式
PolarisMesh通過外掛擴充套件的方式,將go語言使用者端(polaris-go)與gRPC-Go進行整合,整合後的整體架構如下圖所示:
-
通過擴充套件resolver外掛,提供基於PolarisMesh進行服務發現的能力
-
通過擴充套件balancer外掛,提供動態路由和故障熔斷的能力
-
通過擴充套件serverInterceptor外掛,在被調方提供服務註冊、健康檢查、優雅下線的能力。
擴充套件後gRPC-Go服務呼叫和核心流程如下:
-
主調方,藍色為gRPC核心流程,綠色為PolarisMesh擴充套件的流程。
-
被調方,藍色為gRPC核心流程,綠色為PolarisMesh擴充套件的流程。
2. 如何使用
(1)主調方使用方式
需要指定"polaris://EchoServerGRPC/"以明確使用PolarisMesh進行服務發現
import (
"google.golang.org/grpc"
polaris "github.com/polarismesh/grpc-go-polaris"
)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
conn, err := grpc.DialContext(ctx, "polaris://EchoServerGRPC/", grpc.WithInsecure(),
grpc.WithDefaultServiceConfig(polaris.LoadBalanceConfig))
if err != nil {
log.Fatal(err)
}
defer conn.Close()
//使用conn正常進行gRPC使用者端方法呼叫
echoClient := pb.NewEchoServerClient(conn)
echoClient.Echo(ctx, &pb.EchoRequest{Value: value})
(2)被調方使用方式
需要使用polaris.NewServer以明確使用PolarisMesh作為服務註冊中心
import (
"google.golang.org/grpc"
polaris "github.com/polarismesh/grpc-go-polaris"
)
srv := grpc.NewServer()
pb.RegisterEchoServerServer(srv, &EchoService{})
address := fmt.Sprintf("0.0.0.0:%d", listenPort)
listen, err := net.Listen("tcp", address)
if err != nil {
log.Fatalf("Failed to addr %s: %v", address, err)
}
// 執行北極星的註冊命令
pSrv, err := polaris.Register(srv, listen, polaris.WithServerApplication("EchoServerGRPC"))
if nil != err {
log.Fatal(err)
}
go func() {
c := make(chan os.Signal)
signal.Notify(c)
s := <-c
log.Printf("receive quit signal: %v", s)
// 執行北極星的反註冊命令
pSrv.Deregister()
srv.GracefulStop()
}()
err = srv.Serve(listen)
if nil != err {
log.Printf("listen err: %v", err)
}
(3)使用樣例
快速入門樣例請參考:
https://github.com/polarismesh/grpc-go-polaris/tree/main/examples/quickstart
PolarisMesh對接其他開源框架
除了gRPC-Go以外,PolarisMesh還對接了其他的開源框架,助力這些框架能獲取到全功能的服務治理能力,以下為已完成對接的框架以及範例:
-
grpc-go:
https://github.com/polarismesh/grpc-go-polaris -
dubbo-go:
https://github.com/apache/dubbo-go/tree/master/registry/polaris -
go-zero:
https://github.com/zeromicro/zero-contrib/tree/main/zrpc/registry/polaris -
GoFrame:
https://github.com/gogf/polaris -
grpc-java-polaris:
https://github.com/polarismesh/grpc-java-polaris -
spring-cloud-tencent:
https://github.com/Tencent/spring-cloud-tencent
本月社群概況
Feature:
【polaris-php】已支援 PHP-7.x 版本
【grpc-java-polaris】已完成grpc-java整合北極星的服務註冊、發現能力
【polaris-lua】支援lua接入北極星
【polaris】XSDServer支援下發熔斷設定
【polaris】新增服務範例變更事件外掛,預設以紀錄檔檔案形式輸出
Bugfix:
【polaris】修復使用boltdb外掛時的髒資料問題
【polaris】修復namespace刪除無法清理cache導致的記憶體漏失問題
【polaris】修復容器環境下,GOMAXPROCS不正確的問題
【polaris-java】修復server連結切換不生效導致範例被下線問題
寫在最後
後續PolarisMesh也會在社群建設的過程中,進一步擁抱對接業界主流的開發框架,對接的明細以及計劃在該issue上會持續進行更新:
https://github.com/polarismesh/polaris/issues/163
同時也歡迎大家一起參與檔案的建設,或者在社群中分享使用北極星的感受以及實踐經驗,檔案建設明細以及計劃會在該issue上持續進行更新:
https://github.com/polarismesh/polaris/issues/188
如果大家有興趣加入共建的話,歡迎在issue上進行回覆,感謝大家對PolarisMesh社群的支援。