天天看點

什麼是服務發現?

本文講的是<b>什麼是服務發現?</b>【編者的話】 将容器應用部署到叢集時,其服務位址,即IP和端口, 是由叢集系統動态配置設定的。那麼,當我們需要通路這個服務時,如何确定它的位址呢?這時,就需要服務發現(Service Discovery)了。本文将以Nginx的部署為例,介紹服務發現的原理與實踐。

什麼是服務發現?

其中,-d選項表示Nginx容器在背景運作,-p選項表示主機的8080端口映射為容器的80端口。

使用浏覽器服務Nginx

或者使用curl指令通路Nginx, 其傳回結果為html檔案。

Nginx的服務位址是192.168.59.1:8080,其中,192.168.59.1是運作Nginx容器的主機的IP,而8080是Nginx提供服務的端口。

可知,将容器應用部署到單個主機上時,服務的IP即為運作容器的主機IP,而服務的端口可以通過-p選項手動指定,這時服務位址相當于是靜态配置設定的,是以不存在服務發現的問題。然而,當我們将容器應用部署到多個節點的叢集時呢?

1. 不使用服務發現

Nginx定義(nginx1.json):

}

其中,instances為1,表示僅部署單個Nginx容器; hostPort為0,表示Nginx容器綁定的主機端口由Marathon随機配置設定。

部署Nginx:

這時,Nginx容器可能運作node2(192.168.59.2)上,也可能運作在node3(192.168.59.3)上,是以Nginx服務的IP是無法事先确定的。而Nginx容器綁定的主機端口由Marathon随機配置設定,也不确定。

當然,服務端口可以通過hostPort指定,但是這樣做并不合适,因為有可能會發生端口沖突。當叢集中運作了非常多不同的服務時,靜态配置設定端口是不現實的,也限制了叢集的靈活性與擴充性。

在Slave節點上使用docker ps指令可以擷取Nginx服務的IP與端口。

node2(192.168.59.2)

node3(192.168.59.3)

每次重新部署Nginx時,其IP和端口會發生變化,這就意味着每次都要手動去查詢服務位址,這很不友善,且無法将部署任務自動化。在容器叢集中,通常需要運作非常多不同的應用,這就意味着服務發現是容器叢集系統的必備功能。

通過使用Marathon LB可以配置服務的固定端口,而服務的IP就是運作Marathon LB的節點IP。Marathon LB會監聽Marathon的排程事件,擷取容器實際運作的IP與端口,然後更新Haproxy的配置檔案。是以,當重新部署Nginx時,我們仍然可以通過固定的IP與端口通路該服務。

Nginx定義(nginx2.json):

其中,nginx2.json隻有HAPROXY_GROUP與servicePort兩處修改。HAPROXY_GROUP為external,表示Nginx将使用分組為external的Marathon LB做服務發現。servicePort為10000,表示Nginx将使用Marathon LB節點的10000端口提供服務。

可知Haproxy中,niginx服務的前端(frontend)位址為: *:10000,而後端(backend)位址為: 192.168.59.2:31270。Haproxy負責将服務請求轉發到Nginx容器。

<a href="http://progrium.com/blog/2014/07/29/understanding-modern-service-discovery-with-docker/">Understanding Modern Service Discovery with Docker</a>

<a href="http://www.eurekao.com/build-paas-platform-base-on-docker/">基于Docker技術建構PaaS雲平台</a>

<a href="http://tech.youzan.com/haunt-youzan-service-discovery/">Youzan 服務發現概述</a>

==================================

作者介紹

原文釋出時間為:2016-09-07

本文作者:劉凱

本文來自雲栖社群合作夥伴Dockerone.io,了解相關資訊可以關注Dockerone.io。

原文标題:什麼是服務發現?

繼續閱讀