全面擁抱 Go 社群:北極星 PolarisMesh 全功能對接 gRPC-Go

2021-12-30 17:00:10

導語

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社群的支援。

展開閱讀全文