咱們先來看一下服務發現經常使用的框架有哪些:html
- zookeeper
- eureka
- etcd
- consul
這裏就不挨個來介紹它們了,本文中主要以consul爲主,若是你在大量接觸或使用微服務的話,你可能會碰到一個問題?當你建立的服務數量愈來愈多時,這些服務之間的通訊便越難管理,並且維護代價會愈來愈高。consul能夠給你答案,咱們一塊兒來了解一下consul:node
Consul是一個分佈式,高度可用且支持多數據中心的服務發現,配置和編排工具。 Consul支持大規模部署,配置和維護面向服務的體系結構。 欲瞭解更多官方信息,請參閱:linux
在現實中,咱們一直渴望着追求提供高質量、高可用的服務架構體系,同時減小沒必要要的部署和維護代價,減小容錯率。面對如此高的要求,能夠有兩種架構方案:nginx
本文中咱們主要來介紹 Docker+Consul+Nginx方案,此方案更加高效、快捷,而且維護代價和容錯率更低,分佈式支持力度更強,以下圖所示:c++
使用Docker將Consul、Consul Template、Registrator和Nginx組裝成一個值得信任且可擴展的服務框架,這套架構讓你在這個框架中添加和移除服務,不須要重寫任何配置,也不須要重啓任何服務,一切都能正常運行,工做流程很簡單:git
docker節點 ---------> consul ---------> nginx.confgithub
Docker+Consul+Nginx雖然看起來是三個組件的運用,但卻證實是一個有機的總體。它們互相聯繫、互相做用,徹底知足咱們對高可用、高效服務架構方案的需求,是Docker生態圈中最理想的組合之一,具備如下優點:web
本文所用的環境均按1.1中的架構圖來部署,nginx用1臺服務器、consul用1臺服務器、docker host用2臺服務器,共用4臺服務器來部署,固然若是你的服務器緊張,用3臺也同樣,減小1臺docker host就行:算法
服務器IP | 服務器名 | 角色 |
---|---|---|
172.18.18.32 | nginx | 運行nginx服務、consul-template守護進程 |
172.18.18.33 | consul | 運行consul服務 |
172.18.18.34 | docker01 | 運行registrator容器、運行nginx容器(映射端口8一、82) |
172.18.18.35 | docker02 | 運行registrator容器、運行nginx容器(映射端口8三、84) |
在nginx服務器上操做docker
一、下載並解壓nginx:
你能夠用docker的方案運行nginx、也能夠用源碼包編譯安裝nginx。在本文中nginx用源碼包的方式安裝
[root@nginx /]# cd /usr/src/ [root@nginx src /]# tar -zxvf nginx-1.12.1.tar.gz
二、編譯安裝nginx:
[root@nginx src]# yum -y install gcc gcc-c++ make openssl-devel pcre-devel [root@nginx src]# cd nginx-1.12.1/ [root@nginx nginx-1.12.1]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_realip_module --with-pcre --with-http_ssl_module [root@nginx nginx-1.12.1]# make -j 2 [root@nginx nginx-1.12.1]# make install
安裝consul-template很是簡單,下載二進制包便可使用
一、下載consul-template
下載地址:https://releases.hashicorp.com/consul-template/0.19.3/consul-template_0.19.3_linux_amd64.zip
[root@nginx ]# wget https://releases.hashicorp.com/consul-template/0.19.3/consul-template_0.19.3_linux_amd64.zip
二、解壓並安裝到/usr/bin目錄
[root@nginx ]# unzip consul-template_0.19.3_linux_amd64.zip [root@nginx ]# mv consul-template /usr/bin/
在consul服務器上操做
有兩種方式安裝consul(容器、二進制包),在本文中選使用二制包的方式。
一、下載consul二進制包
下載地址 https://www.consul.io/downloads.html
二、解壓、安裝
[root@consul ~]#unzip consul_0.9.2_linux_amd64.zip [root@consul ~]#mv consul /usr/bin/
三、部署consul
[root@consul ~]#consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=172.18.18.33 -client=0.0.0.0 -node=server01
參數說明:
agent:運行一個consul代理。
-server :切換代理到服務器模式。
-bootstrap :將服務器設置爲引導模式。
-ui:啓用內置的靜態web UI服務器。
-data-dir:路徑到數據目錄存儲代理狀態。
-bind:設置集羣通訊的綁定地址。
-client:設置用於綁定客戶端訪問的地址。這包括RPC、DNS、HTTP和HTTPS(若是配置)。
-node:此節點的名稱。 在集羣中必須是惟一的,若是你運行第2臺consul,能夠寫server0二、server03等。
consul啓動後它會在前臺顯示,若是你想讓它在後臺運行,能夠加上nohup &來運行它:
[root@consul ~]#nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=172.18.18.33 -client=0.0.0.0 -node=server01 &
四、查看consul啓動後的狀況:
啓動consul後默認會監聽5個端口:
8300: replication、leader farwarding的端口
8301: lan cossip的端口
8302: wan gossip的端口
8500: web ui界面的端口
8600: 使用dns協議查看節點信息的端口
可參考下圖查看端口的意思:
[root@consul ~]#consul members [root@consul ~]#consul info |grep leader [root@consul ~]#consul catalog services
# 集羣server成員 [root@consul ~]#curl 127.0.0.1:8500/v1/status/peers # 集羣Raft leader [root@consul ~]#curl 127.0.0.1:8500/v1/status/leader # 註冊的全部服務 [root@consul ~]#curl 127.0.0.1:8500/v1/catalog/services # 服務信息 [root@consul ~]#curl 127.0.0.1:8500/v1/catalog/services/nginx # 集羣節點詳細信息 [root@consul ~]#curl 127.0.0.1:8500/v1/catalog/nodes
通常咱們經過 http://consul服務器:8500 web界面來訪問查看:
從上圖能夠看到,consul 界面有5個菜單項(SERVICES、NODES、KEY/VALUE、ACL、DC1)。在SERVICES中,目前由於沒有任何服務加入進來,只顯示了consul它本身的服務狀態。
咱們在來看下NODES,從圖中很好理解, 在server01這臺節點上有個consul :8300的服務:
接下來,咱們去nginx服務器上配置一下nginx模板,並在兩臺docker主機上運行registrator服務進行測試。
在nginx服務器上操做
在步驟3中nginx已經安裝好了,這一步只是配置nginx,大概配置的思路爲:
[root@nginx /]#mkdir /usr/local/nginx/consul/ [root@nginx /]#cd /usr/local/nginx/consul/ [root@nginx consul]#vim nginx.ctmpl upstream http_backend { {{range service "nginx"}} server {{ .Address }}:{{ .Port }}; {{ end }} } server { listen 8000; server_name localhost; location / { proxy_pass http://http_backend; } }
nginx.ctmpl模板中的內容就是兩段意思,熟悉nginx的朋友一看也能明白:第1 定義nginx upstream一個簡單模板,第2 定義一個server,監聽8000端口,反向代理到upstream。
[root@nginx consul]# vim /usr/local/nginx/conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } #添加這一行 include /usr/local/nginx/consul/*.conf; }
添加好了在重載nginx服務:
[root@nginx consul]# /usr/local/nginx/sbin/nginx -s reload
一、啓動consul-template
[root@nginx consul]#consul-template --consul-addr 172.18.18.33:8500 --template "./nginx.ctmpl:vhost.conf" --log-level=info 2018/03/14 08:08:06.933447 [INFO] consul-template v0.19.3 (ebf2d3d) 2018/03/14 08:08:06.933459 [INFO] (runner) creating new runner (dry: false, once: false) 2018/03/14 08:08:06.933779 [INFO] (runner) creating watcher 2018/03/14 08:08:06.933858 [INFO] (runner) starting 2018/03/14 08:08:06.933873 [INFO] (runner) initiating run 2018/03/14 08:08:06.935387 [INFO] (runner) initiating run 注意:它這個日誌是一直在前臺輸出,經過ctrl+c中止consul-template進程。
參數說明:
--consul-addr:指定consul服務的ip和端口;
./nginx.ctmpl:這是用nginx.ctmpl這個模板來啓動進程,這是寫的相對路徑,也能夠寫絕對路徑;
vhost.conf:nginx.ctmpl模板生成後的文件名,這也能夠寫絕對路徑,若是不寫絕對路徑,這個文件就在當前目錄生成(/usr/local/nginx/consul/)
二、驗證consul-template
因爲consul-template在前臺運行,因此咱們在打開一個nginx終端驗證。
#查看下進程 [root@nginx ~]# ps -ef | grep consul-template root 22954 22794 0 16:08 pts/0 00:00:00 consul-template --consul-addr 172.18.18.33:8500 --template ./nginx.ctmpl:vhost.conf --log-level=info #查看下consul目錄下的文件 [root@nginx ~]# cd /usr/local/nginx/consul/ [root@nginx consul]# ls nginx.ctmpl vhost.conf
在consul目錄下,是否是發現多了一個文件vhost.conf,就是剛纔啓動consul-template進程時生成的。
在來查看下vhost.conf的內容,目前upstraem配置爲空,尚未docker主機加入進來:
[root@nginx consul]# cat vhost.conf upstream http_backend { } server { listen 8000; server_name localhost; location / { proxy_pass http://http_backend; } }
接下來去配置下docker主機。
在docker01和docker02上操做
先來講一下在docker服務器上操做的大概思路:
安裝過程省略,可參考筆者這篇文章進行安裝 《docker環境安裝(Ubuntu、Centos)》
分別在docker 01 和docker 02 上都建立:
[root@docker01 /]# docker run -d --name registrator --network=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest --ip 172.18.18.34 consul://172.18.18.33:8500 [root@docker02 /]# docker run -d --name registrator --network=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest --ip 172.18.18.35 consul://172.18.18.33:8500
參數說明:
--network:把運行的docker容器設定爲host網絡模式;
-v /var/run/docker.sock:把宿主機的Docker守護進程(Docker daemon)默認監聽的Unix域套接字掛載到容器中;
--ip : 剛纔把network指定了host模式,因此咱們指定下IP爲宿主機的IP;
consul:j最後這個選項是配置consul服務器的IP和端口。
### 6.3 啓動nginx容器
一、先在docker01上啓動第1臺nginx,也就是端口爲81的容器:
[root@docker01 /]#docker run -itd --name nginx_81 -p 81:80 nginx
進入容器修改index.html:
[root@docker01 /]# docker exec -it nginx_81 bash root@272533504ab0:/# cd /usr/share/nginx/html/ root@272533504ab0:/usr/share/nginx/html# echo "docker01:81" > index.html
在去nginx服務器上驗證下vhost.conf,從下面能夠看到docker01的nginx 81註冊進來了:
[root@nginx consul]# cat vhost.conf upstream http_backend { server 172.18.18.34:81; } server { listen 8000; server_name localhost; location / { proxy_pass http://http_backend; } }
而後訪問一下nginx服務器的IP地址,http://172.18.18.32:8000 ,從下圖能夠看出是能夠訪問的:
二、在docker01上啓動第2臺nginx,也就是端口爲82的容器,並修改好index.html:
[root@docker01 /]# docker run -itd --name nginx_82 -p 82:80 nginx [root@docker /]# docker exec -it nginx_82 bash root@b66febfa0753:/# cd /usr/share/nginx/html/ root@b66febfa0753:/usr/share/nginx/html# echo "docker01:82" > index.html
在去nginx服務器上驗證下vhost.conf,從下面能夠看到docker01的nginx 82也註冊進來了:
接着,咱們訪問下consul服務的web界面,http://172.18.18.33:8500 ,從下圖能夠看出,在SERVICE中是否是發現多了個nginx 服務:
而後,在看看NODES,從下圖能夠看出,剛纔建立的兩個nginx容器(8一、82)都註冊到了server01這臺consul服務器,若是咱們的consul是集羣環境的話,能夠分別註冊到server02或server03中:
三、把docker02服務器上的nginx容器83和84也建立了
建立nginx:83
[root@docker02 /]# docker run -itd --name nginx_83 -p 83:80 nginx [root@docker02 /]# docker exec -it nginx_83 bash root@5c21ba694829:/# cd /usr/share/nginx/html/ root@5c21ba694829:/usr/share/nginx/html# echo "docker02:83" > index.html
建立nginx:84
[root@docker02 /]# docker run -itd --name nginx_84 -p 84:80 nginx [root@docker02 /]#docker exec -it nginx_84 bash root@0f9d72ff453b:/# cd /usr/share/nginx/html/ root@0f9d72ff453b:/usr/share/nginx/html# echo "docker02:84" > index.html
四、去nginx服務器上驗證vhost.conf:
從上圖能夠看出,docker02服務器上的83和84也自動註冊進來了。
五、在來看看consul服務器上的web界面:
從上圖能夠看出,SERVICE中的nginx已經有了4個,而且還多了些其它的服務,這些服務是我docker02上跑的其它應用容器,也都會自動註冊進來。
六、訪問nginx服務器作最後的驗證,http://172.18.18.32:8000 ,記得用f5刷新驗證:
F5刷新一下頁面:
在刷新一下,是否是訪問到了docker02這臺主機了:
到此,自動註冊服務的過程就完成了,想到詳細瞭解consul的朋友能夠參考官方文檔:
consul 官方下載:https://www.consul.io/downloads.html
consul官方集羣安裝:https://www.consul.io/intro/getting-started/join.html
consul github :https://github.com/hashicorp/consul
consul官方鏡像: https://hub.docker.com/_/consul/
喜歡個人文章,請點擊最上方右角處的《關注》支持一下!