近年微服務架構在互聯網應用領域中越來越火,引入微服務主要解決了單體應用多個模塊的緊耦合、沒法擴展和運維困難等問題。微服務架構就是按照功能粒度將業務模塊進行垂直拆分,對單體應用自己進行服務化和組件化,每一個組件單獨部署爲小應用(從DB到UI)。微服務與微服務之間經過Service API進行交互,同時爲了支持水平擴展、性能提高和服務可用性,單個服務容許同時部署一個或者多個服務實例。在運行時,每一個實例一般是一個雲虛擬機或者Docker容器。本篇文章就能夠完美的解決這一問題!html
關於docker這裏就很少介紹了,畢竟已經火遍大街小巷了,主要了解一下Consul、Registrator、Consul-tpmplate。node
consul:是一個服務網格解決方案,它是一個一個分佈式的、高可用的系統,並且開發使用都很簡單、方便、它主要提供了一個功能齊全的控制平臺,主要特色:服務發現、健康檢查、鍵值存儲、安全服務通訊、多數據中心;linux
Registrator:負責收集docker host上容器的信息,併發送給consul;nginx
Consul-tpmplate:根據編輯好的模板生成新的nginx配置文件,並負責從新加載nginx配置文件;web
博文大綱:
1、環境準備
2、docker01部署consul服務
3、docker02及docker03主機上以容器的方式運行consul服務
4、docker02及docker03主機上以容器的方式運行registrator服務
5、docker01部署Nginx服務,提供反向代理
6、在docker01安裝consul-template命令工具,並編寫模板
7、驗證服務的實時發現功能docker
組件之間的工做流程圖:bootstrap
docker01主機採用二進制的方式進行安裝!方法以下:vim
[root@docker01 ~]# wget https://releases.hashicorp.com/consul/1.6.2/consul_1.6.2_linux_amd64.zip [root@docker01 ~]# unzip consul_1.6.2_linux_amd64.zip [root@docker01 ~]# mv consul /usr/local/bin/ [root@docker01 ~]# chmod +x /usr/local/bin/consul //下載這個軟件包獲取consul這個命令 [root@docker01 ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consule-data -bind=192.168.1.1 -client=0.0.0.0 -node=master & [1] 2618 [root@docker01 ~]# nohup: 忽略輸入並把輸出追加到"nohup.out" [root@docker01 ~]# //執行完命令後,需按兩次回車鍵,根據提示信息能夠看出將命令輸出的信息保存到了一個名爲nohup.out的文件(當前目錄下)中。 //執行上述命令後,consul服務就放到後臺運行了,並返回其PID號,能夠經過「jobs -l」命令進行查看
上述命令的相關參數解釋:瀏覽器
* -server:添加一個服務; * -bootstrap:加入這個選項時,通常都在server單節點的時候使用,自選舉爲leader(領導); * -ui:開啓內部的web頁面; * -data-dir:(key/volume)數據存放目錄; * -bind:指定開啓服務的IP; * -client:指定能夠訪問的客戶端(指定加入的從節點); * -node:指定集羣內通訊使用的名稱(若是不指定,默認以主機名命名);
consul開啓的相應端口:安全
* 8300:集羣節點; * 8301:集羣內部訪問的端口; * 8302:跨數據中心之間的通訊; * 8500:提供web ui界面; * 8600:使用DNS協議查看節點信息; //由於放到後臺了,因此這些端口信息都看不到,若是不放到後臺的話會佔用前臺終端,使前臺終端沒法正常工做!
附加兩條查詢命令:
[root@docker01 ~]# consul info //查看consul的詳細信息 …………………… leader_addr = 192.168.1.1:8300 //主要就是查看consul集羣主節點是誰 ………………………… [root@docker01 ~]# consul members //查看consul羣集中的成員信息
docker02的配置以下:
[root@docker02 ~]# docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600 -p 8600:8600/udp --restart always progrium/consul -join 192.168.1.1 -advertise 192.168.1.2 -client 0.0.0.0 -node=node01 //-join:指定加入的羣集主節點 //-advertise:聲明本機的Ip地址 //-node:羣集中的名稱
docker03的配置以下:
[root@docker03 ~]# docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600 -p 8600:8600/udp --restart always progrium/consul -join 192.168.1.1 -advertise 192.168.1.3 -client 0.0.0.0 -node=node02
注意:雖然docker01上的consul服務是二進制包安裝的,docker02和docker03採用容器的方式部署,只是爲了儘量的展現部署方式而已!
在docker01進行查看:
[root@docker01 ~]# consul members //查看consul羣集信息 Node Address Status Type Build Protocol DC Segment master 192.168.1.1:8301 alive server 1.6.2 2 dc1 <all> node01 192.168.1.2:8301 alive client 0.5.2 2 dc1 <default> node02 192.168.1.3:8301 alive client 0.5.2 2 dc1 <default>
瀏覽器訪問測試:
docker02的配置以下:
[root@docker02 ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart always gliderlabs/registrator consul://192.168.1.2:8500 //將收集的容器信息發送給本機的8500端口來顯示
瀏覽器測試訪問:
docker03的配置以下:
[root@docker03 ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart always gliderlabs/registrator consul://192.168.1.3:8500 //將收集的容器信息發送給本機的8500端口來顯示
瀏覽器測試訪問:
[root@docker01 ~]# yum -y install pcre pcre-devel openssl openssl-devel zlib zlib-devel [root@docker01 ~]# wget http://nginx.org/download/nginx-1.17.7.tar.gz [root@docker01 ~]# useradd -M -s /sbin/nologin nginx [root@docker01 ~]# tar zxf nginx-1.17.7.tar.gz -C /usr/src [root@docker01 ~]# cd /usr/src/nginx-1.17.7/ [root@docker01 nginx-1.17.7]# ./configure --user=nginx --group=nginx --with-http_stub_status_module --with-http_realip_module --with-pcre --with-http_ssl_module && make && make install [root@docker01 nginx-1.17.7]# cd [root@docker01 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ [root@docker01 ~]# nginx
consul-template的做用就是將收集到的信息(把registrator收集到容器的信息)寫入template模板中,而且最終寫入Nginx的配置文件中。
[root@docker01 ~]# wget https://releases.hashicorp.com/consul-template/0.23.0/consul-template_0.23.0_linux_amd64.zip [root@docker01 ~]# unzip consul-template_0.23.0_linux_amd64.zip [root@docker01 ~]# mv consul-template /usr/local/bin [root@docker01 ~]# chmod +x /usr/local/bin/consul-template //獲取consul-template 命令 [root@docker01 ~]# cd /usr/local/nginx/ [root@docker01 nginx]# mkdir consul && cd consul [root@docker01 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; } } [root@docker01 consul]# vim ../conf/nginx.conf include /usr/local/nginx/consul/*.conf; //調用生成的vhost.conf文件 } //必須在末尾的大括號中添加 [root@docker01 consul]# nohup consul-template -consul-addr 192.168.1.1:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload" & [2] 64430 [root@docker01 consul]# nohup: 忽略輸入並把輸出追加到"nohup.out" [root@docker01 consul]# //一樣也是將這條命令放入後臺執行,不然會佔用前臺的終端 //這條命令的做用就i是將本機收集到的信息,生成一個vhost.conf的文件,將命令放入後臺才能保證明時發現同步並更新
配置至此,docker02或者docker03上一旦有任何Nginx相關的容器之後臺「-d」的運行方式運行,都會被添加到反向代理中來,進行調度,一旦容器發生意外關閉,則能夠自動從反向代理配置文件中剔除。
如今能夠在docker0二、和docker03上分別運行兩臺Nginx容器,其容器名稱依次爲web0一、web02.......,其網頁文件依次爲:web0一、web02……爲其準備不一樣的網頁文件的目的就是方便客戶端訪問時區分訪問的是哪臺容器。
因爲其配置過程相似,我這裏就寫出一個運行Nginx容器的過程,其餘照作便可!
[root@docker02 ~]# docker run -itd --name web01 -P nginx [root@docker02 ~]# docker exec -it web01 /bin/bash root@b49445d94603:/# echo "web01" > /usr/share/nginx/html/index.html
在docker02及docker03運行四個Nginx容器後(必須之後臺運行的方式,也就是說在運行時必須有「-d」選項),那麼,此時訪問docker01的8000端口,就會循環訪問到這四個容器提供的網頁文件,以下:
[root@docker01 consul]# curl 127.0.0.1:8000 web01 [root@docker01 consul]# curl 127.0.0.1:8000 web02 [root@docker01 consul]# curl 127.0.0.1:8000 web03 [root@docker01 consul]# curl 127.0.0.1:8000 web04 [root@docker01 consul]# cat /usr/local/nginx/consul/vhost.conf upstream http_backend { server 192.168.1.2:32768; server 192.168.1.2:32769; server 192.168.1.3:32768; server 192.168.1.3:32769; } server { listen 8000; server_name localhost; location / { proxy_pass http://http_backend; } } //因爲consul-template是在後臺運行的,因此,只要檢測到容器的變化,就會動態修改上述文件 //而且重啓Nginx服務,使更改生效
如今就已經配置完成了,docker02和docker03上建立和刪除容器,vhost.conf文件都會動態的進行修改,自行測試!
——————————本文到此結束,感謝閱讀——————————