天天看點

利用阿裡雲容器服務實作Docker微服務間的負載均衡和服務發現

然而這個是将服務暴漏到外網的,那麼服務間如何通過這種方式做到自動的服務發現和的負載均衡呢?容器服務引入了負載均衡的功能,隻需要使用<code>.local</code>結尾的域名,并在依賴的服務的<code>external_links</code>中增加這個域名, 依賴的服務便可以通過<code>.local</code>的域名通路到依賴的服務,并且能夠配合健康檢查做到自動的服務發現,例如:

然後通過如下的restclient服務的日志,我們可以看到restclient的curl的http的請求就被路由到不同的rest服務的容器上了,容器id分别是<code>053cb232fdfbcb5405ff791650a0746ab77f26cce74fea2320075c2af55c975f</code>和<code>b8c36abca525ac7fb02d2a9fcaba8d36641447a774ea956cd93068419f17ee3f</code>:

首先利用了docker 1.10之後支援在容器中做别名的方式,在依賴負載于<code>restserver.local</code>的服務的容器中<code>restserver.local</code>的域名解析到的是routing服務的位址,這樣可以實作http請求轉發到<code>routing</code>的容器,并帶上了<code>host</code>為<code>restserver.local</code>的請求頭。

然後routing會對配置了<code>aliyun.routing_port_xxx: restserver.local</code>的服務監聽它的容器的健康狀态并挂載到haproxy的後端,haproxy接收到帶有<code>restserver.local</code> host頭的http請求就能轉發到對應了容器了。

利用阿裡雲容器服務實作Docker微服務間的負載均衡和服務發現

相對于使用link或者hostname的基于dns的方式來說,首先不同用戶端對dns緩存的處理不一緻會導緻服務發現的延遲性,其次dns的方案也隻有round robin,對于微服務的場景是不夠用的;

而相對于其他的微服務服務發現的解決方案,提供了一個實作無關的服務發現和負載均衡機制,無需server端和client應用做任何修改即可使用;

并且服務生命周期解耦的,每個微服務可以采用一個docker-compose模闆獨立部署,更新。互相隻是通過一個虛拟域名實作動态綁定即可。