Service 之間如何通訊?- 天天5分鐘玩轉 Docker 容器技術(101)

微服務架構的應用由若干 service 組成。好比有運行 httpd 的 web 前端,有提供緩存的 memcached,有存放數據的 mysql,每一層都是 swarm 的一個 service,每一個 service 運行了若干容器。在這樣的架構中,service 之間是必然要通訊的。html

服務發現前端

一種實現方法是將全部 service 都 publish 出去,而後經過 routing mesh 訪問。但明顯的缺點是把 memcached 和 mysql 也暴露到外網,增長了安全隱患。mysql

若是不 publish,那麼 swarm 就要提供一種機制,可以:web

  1. 讓 service 經過簡單的方法訪問到其餘 service。sql

  2. 當 service 副本的 IP 發生變化時,不會影響訪問該 service 的其餘 service。docker

  3. 當 service 的副本數發生變化時,不會影響訪問該 service 的其餘 service。緩存

這其實就是服務發現(service discovery)。Docker Swarm 原生就提供了這項功能,經過服務發現,service 的使用者不須要知道 service 運行在哪裏,IP 是多少,有多少個副本,就能與 service 通訊。下面咱們開始實踐。安全

建立 overlay 網絡網絡

要使用服務發現,須要相互通訊的 service 必須屬於同一個 overlay 網絡,因此咱們先得建立一個新的 overlay 網絡。架構

docker network create --driver overlay myapp_net

499.png

直接使用 ingress 行不行?

很遺憾,目前 ingress 沒有提供服務發現,必須建立本身的 overlay 網絡。

部署 service 到 overlay

部署一個 web 服務,並將其掛載到新建立的 overlay 網絡。

docker service create --name my_web --replicas=3 --network myapp_net httpd

500.png


部署一個 util 服務用於測試,掛載到同一個 overlay 網絡。

docker service create --name util --network myapp_net busybox sleep 10000000

501.png

 

sleep 10000000 的做用是保持 busybox 容器處於運行的狀態,咱們纔可以進入到容器中訪問 service my_web

驗證

經過 docker service ps util 確認 util 所在的節點爲 swarm-worker1。

502.png

 

登陸到 swarm-worker1,在容器 util.1 中 ping 服務 my_web

503.png

 

能夠看到 my_web 的 IP 爲 10.0.0.2,這是哪一個副本的 IP 呢?

其實哪一個副本的 IP 都不是。10.0.0.2 是 my_web service 的 VIP(Virtual IP),swarm 會將對 VIP 的訪問負載均衡到每個副本。

咱們能夠執行下面的命令查看每一個副本的 IP。

docker exec util.1.bpon0vvbgve6lz3fp08sgana6 nslookup tasks.my_web

504.png

10.0.0.310.0.0.410.0.0.5 纔是各個副本本身的 IP。不過對於服務的使用者(這裏是 util.1),根本不須要知道 my_web副本的 IP,也不須要知道 my_web 的 VIP,只需直接用 service 的名字 my_web 就能訪問服務。

Service 的訪問就討論到這裏,下一節咱們學習 Rolling Update。

書籍:

1.《天天5分鐘玩轉Docker容器技術》
https://item.jd.com/16936307278.html

2.《天天5分鐘玩轉OpenStack》
https://item.jd.com/12086376.html

相關文章
相關標籤/搜索