Docker Swarm :gRPC 基於 DNS 的負載均衡
背景
後端兩個服務 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_robin
和grpclb
。注意:如果解析程式返回的地址是均衡器地址,無論 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- gRPC的負載均衡RPC負載
- gRPC負載均衡(自定義負載均衡策略)RPC負載
- gRPC負載均衡(客戶端負載均衡)RPC負載客戶端
- golang grpc 負載均衡GolangRPC負載
- Kubernetes 中的 gRPC 負載均衡RPC負載
- 淺析基於雲的DNS管理與負載均衡技術DNS負載
- GRPC 負載均衡實現RPC負載
- 基於gRPC的註冊發現與負載均衡的原理和實戰RPC負載
- windows第七層負載均衡 基於IIS的ARR負載均衡詳解Windows負載
- 基於Docker + Consul + Nginx + Consul-template的服務負載均衡實現DockerNginx負載
- 基於 gRPC 的服務註冊與發現和負載均衡的原理與實戰RPC負載
- windows伺服器第四層負載均衡_基於NLB負載均衡詳解Windows伺服器負載
- nginx部署基於http負載均衡器NginxHTTP負載
- 在 kubernetes 環境中實現 gRPC 負載均衡RPC負載
- 基於開源Tars的動態負載均衡實踐負載
- 在 Linux 上用 DNS 實現簡單的負載均衡LinuxDNS負載
- 為什麼對gRPC做負載均衡會很棘手?RPC負載
- Docker Compose+nginx實現負載均衡DockerNginx負載
- 微服務架構 | 4.1 基於 Ribbon 的負載均衡詳解微服務架構負載
- docker初體驗:docker部署nginx負載均衡叢集DockerNginx負載
- 基於 CentOS 7 + Nginx + Tomcat 的負載均衡伺服器的搭建CentOSNginxTomcat負載伺服器
- 負載均衡負載
- docker下nginx反向代理和負載均衡配置DockerNginx負載
- nginx+consul做動態負載均衡(docker)Nginx負載Docker
- Docker compose 水平擴充套件 和負載均衡Docker套件負載
- 基於滴滴雲DC2+Nginx搭建負載均衡方案Nginx負載
- 【Docker】基於例項專案的叢集部署(六)資料庫負載均衡 | Haproxy分發機制 | 監控負載狀況Docker資料庫負載
- Spring RSocket:基於服務註冊發現的 RSocket 負載均衡Spring負載
- 透過Nginx實現gRPC服務的負載均衡 | gRPC雙向資料流的互動NginxRPC負載
- 基於MySQL Cluster + LVS + KeepAlived部署負載均衡高可用架構MySql負載架構
- IP負載均衡負載
- WebSocket負載均衡Web負載
- nginx負載均衡Nginx負載
- NGINX 負載均衡Nginx負載
- 【Nginx】負載均衡Nginx負載
- 負載均衡---ribbon負載
- LoadBalancer負載均衡負載
- LVS 負載均衡負載