閱讀522 返回首頁    go 微信


集群內服務間路由和負載均衡__服務發現和負載均衡_用戶指南_容器服務-阿裏雲

在容器服務上可以通過 acsrouting 將基於域名的 HTTP 服務暴露出去,而且能夠配合健康檢查自動的負載均衡和服務發現,當其中一個容器出現問題之後,routing 會自動將健康檢查失敗的容器從後端摘除,所以能做到自動的服務發現。

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

實現原理

  1. 利用了 Docker 1.10 之後支持在容器中做別名的方式,在依賴負載於 restserver.local 的服務的容器中 restserver.local 的域名解析到的是 routing 服務的地址,這樣可以將 HTTP 請求轉發到 routing 的容器,並帶上 HOSTrestserver.local 的請求頭。

  2. routing 會對配置了 aliyun.routing_port_xxx: restserver.local 的服務監聽其容器的健康狀態並掛載到 HAProxy 的後端,HAProxy 接收到帶有 restserver.local HOST 頭的 HTTP 請求就能轉發到對應了容器了。

圖

優勢

  • 相對於使用 link 或者 hostname 的基於 DNS 的方式,首先不同客戶端對 DNS 緩存的處理不一致會導致服務發現的延遲性,其次 DNS 的方案也隻有 round robin,對於微服務的場景是不夠用的。
  • 而相對於其他的微服務服務發現的解決方案,提供了一個實現無關的服務發現和負載均衡機製,無需 server 端和 client 應用做任何修改即可使用。
  • 服務生命周期是解耦的,每個微服務可以采用一個 docker-compose 模板獨立部署,更新。相互之間隻是通過一個虛擬域名實現動態綁定即可。

編排實例

  1. restserver: # 模擬 rest 服務
  2. image: nginx
  3. labels:
  4. aliyun.routing.port_80: restserver.local # 使用 local 的域名,隻有集群內的容器可以訪問這個域名
  5. aliyun.scale: "2" # 擴展出兩個實例,模擬負載均衡
  6. aliyun.probe.url: "https://container:80" # 定義容器的健康檢查策略是 http,端口是 80
  7. aliyun.probe.initial_delay_seconds: "2" # 健康檢查在容器起來之後兩秒之後再檢查
  8. aliyun.probe.timeout_seconds: "2" # 健康檢查超時時間,如果兩秒還沒返回認為不健康
  9. restclient: # 模擬 rest 服務消費者
  10. image: registry.aliyuncs.com/acs-sample/alpine:3.3
  11. command: "sh -c 'apk update; apk add curl; while true; do curl --head restserver.local; sleep 1; done'" #訪問 rest 服務,測試負載均衡
  12. tty: true
  13. external_links:
  14. - "restserver.local" #指定 link 的服務的域名

然後,通過如下的 restclient 服務的日誌,您可以看到 restclient 的 curl 的 http 請求被路由到不同的 rest 服務的容器上了,容器 ID 分別為 053cb232fdfbcb5405ff791650a0746ab77f26cce74fea2320075c2af55c975fb8c36abca525ac7fb02d2a9fcaba8d36641447a774ea956cd93068419f17ee3f

  1. internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066803626Z Server: nginx/1.11.1
  2. internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066814507Z Date: Fri, 01 Jul 2016 06:43:49 GMT
  3. internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066821392Z Content-Type: text/html
  4. internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066829291Z Content-Length: 612
  5. internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066835259Z Last-Modified: Tue, 31 May 2016 14:40:22 GMT
  6. internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066841201Z ETag: "574da256-264"
  7. internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066847245Z Accept-Ranges: bytes
  8. internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066853137Z Set-Cookie: CONTAINERID=053cb232fdfbcb5405ff791650a0746ab77f26cce74fea2320075c2af55c975f; path=/
  9. internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.080502413Z HTTP/1.1 200 OK
  10. internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082548154Z Server: nginx/1.11.1
  11. internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082559109Z Date: Fri, 01 Jul 2016 06:43:50 GMT
  12. internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082589299Z Content-Type: text/html
  13. internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082596541Z Content-Length: 612
  14. internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082602580Z Last-Modified: Tue, 31 May 2016 14:40:22 GMT
  15. internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082608807Z ETag: "574da256-264"
  16. internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082614780Z Accept-Ranges: bytes
  17. internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082621152Z Set-Cookie: CONTAINERID=b8c36abca525ac7fb02d2a9fcaba8d36641447a774ea956cd93068419f17ee3f; path=/

最後更新:2016-12-13 13:56:17

  上一篇:go 簡單路由-HTTP 協議變為 HTTPS 協議__服務發現和負載均衡_用戶指南_容器服務-阿裏雲
  下一篇:go 負載均衡路由__服務發現和負載均衡_用戶指南_容器服務-阿裏雲