Docker Swarm :gRPC 基於 DNS 的負載均衡

flynike發表於2021-09-09

圖片描述

背景

後端兩個服務 ServiceA、ServiceB,ServiceA 透過 gRPC 遠端呼叫 ServiceB。在 Docker Swarm 叢集下每個服務部署多個副本,假設部署兩個副本,即 ServiceA 的例項為 A1 和 A2,ServiceB 的例項為 B1 和 B2。Swarm 叢集內部透過 Overlay 網路實現容器間通訊,ServiceA 訪問 ServiceB 透過服務名稱來連線,即 A1 呼叫 ServiceB 時,會隨機呼叫到 B1 或者 B2;同理,A2 也是如此。

上述流程,看似合理且正常,然而實際效果是:假設 A1 連通 B1,A2 連通 B1,那麼 ServiceA 的請求會一直被 B1 接收並處理,直至 TCP 連線超時,或者 B1 服務終止。gRPC 的核心概念中有 Channel ,描述 Client 與 Server 之間的連線,即 A1 與 B1 建立連線之後, Channel 會被複用。

面對這種負載不均衡的場景,我們希望 ServiceA 的每個請求能被均衡到 ServiceB 的每個例項去處理。

GRPC 負載均衡

官方資料

圖片描述

工作流程

  • 1、Client 請求解析 server name,獲取一個或多個實際 IP 地址,例如 ServiceB 解析為 10.0.0.10、10.0.0.11

  • 2、Client 例項化負載均衡策略,可選策略為 round_robingrpclb。注意:如果解析程式返回的地址是均衡器地址,無論 Client 配置什麼負載均衡策略,都將使用 grpclb 策略。否則,會使用 Client 配置的負載均衡策略。如果未配置,則 Client 將預設選用第一個可用伺服器地址的策略

  • 3、負載均衡衡策略為每個伺服器地址建立一個子通道

  • 4、對於每個 RPC 請求,負載均衡策略決定應將 RPC 請求傳送到哪個子通道(即哪個伺服器)

針對上述場景,在 Swarm 叢集中,我們應該選擇 dnsrr 模式,並且 gRPC 客戶端配置負載均衡策略為 round_robin(輪訓)即可。

配置 Load Balance Policy

不同語言配置方式不同,以下列舉常用語言:

grpc-java 配置

ManagedChannel channel = ManagedChannelBuilder.forAddress(server.getHost(), server.getPort())
                                              .defaultLoadBalancingPolicy("round_robin")
                                              .usePlaintext().build();

其他語言

有待完善。。。

配置 Docker Swarm dnsrr

Docker Swarm 預設的模式是 vip,使用 dnsrr 只需將 endpoint_mode  設定為 dnsrr 即可,相關資料:

示例:

version: '3.7'services:
  server:
    image: "server:latest"
    stop_grace_period: 20s
    networks:
      - idp_network
    deploy:
      replicas: 2
      endpoint_mode: dnsrr
networks:
  idp_network:
    external: true

Spring Boot gRPC Load Balance 案例

1、獲取案例原始碼

git clone 

2、Install 相關包

3、構建相關映象

  • server:

  • client:

4、初始化 Swarm 叢集

docker swarm init

5、新增 Overlay 網路

docker network create -d overlay --attachable idp_network

6、部署 gRPC server 和 client

docker stack deploy -c stack.yml grpc

stack.yml 檔案所在路徑下執行

7、檢視 server 端日誌

docker service logs -f grpc_server

8、持續透過 client 傳送請求,並觀察日誌資訊

curl 

圖片描述

日誌輸出

從日誌中可以看出,server 能均衡處理 client 的請求。



作者:Anoyi
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2618/viewspace-2821211/,如需轉載,請註明出處,否則將追究法律責任。

相關文章