1、架構圖
2、組件介紹
一、Registrator
Registrator:一個由Go語言編寫的,針對docker使用的,經過檢查本機容器進程在線或者中止運行狀態,去註冊服務的工具。因此咱們要作的實驗,全部的工具都是在docker上運行的,就是由於registrator是經過檢查docker容器的狀態來判斷服務狀態的,這樣就和咱們的代碼實現徹底解耦了,對上層透明化,無感知。它有以下特色html
經過docker socket直接監聽容器event,根據容器啓動/中止等event來註冊/註銷服務
每一個容器的每一個exposed端口對應不一樣的服務
支持可插拔的registry backend,默認支持Consul, etcd and SkyDNS
自身也是docker化的,能夠容器方式啓動
用戶可自定義配置,如服務TTL(time-to-live)、服務名稱、服務tag等node
二、consul
Consul在這裏用來作 docker 實例的註冊與配置共享。linux
特色:nginx
一致性協議採用 Raft 算法,比Paxos算法好用. 使用 GOSSIP 協議管理成員和廣播消息, 而且支持 ACL 訪問控制.
支持多數據中心以免單點故障,內外網的服務採用不一樣的端口進行監聽。而其部署則須要考慮網絡延遲, 分片等狀況等.zookeeper 和 etcd 均不提供多數據中心功能的支持.
健康檢查. etcd 沒有的.
支持 http 和 dns 協議接口. zookeeper 的集成較爲複雜, etcd 只支持 http 協議.
還有一個web管理界面。web
三、consul-template
一開始構建服務發現,大多采用的是zookeeper/etcd+confd。可是複雜難用。consul-template,大概取代了confd的位置,之後能夠這樣etcd+confd或者consul+consul-template。算法
consul template的使用場景:consul template能夠查詢consul中的服務目錄、key、key-values等。這種強大的抽象功能和查詢語言模板可使consul template特別適合動態的建立配置文件。例如:建立apache/nginx proxy balancers、haproxy backends、varnish servers、application configurations。docker
consul-template提供了一個便捷的方式從consul中獲取存儲的值,consul-template守護進程會查詢consul服務,來更新系統上指定的任何模板,當更新完成後,模板能夠選擇運行一些任意的命令,好比咱們這裏用它來更新nginx.conf這個配置文件,而後執行nginx -s reload命令,以更新路由,達到動態調節負載均衡的目的。apache
四、nginx
Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫爲俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。bootstrap
2、數據流tomcat
數據流過程以下:
registrator來監控每一個web server的狀態。當有新的web server啓動的時候,registrator會把它註冊到consul這個註冊中心上。因爲consul_template已經訂閱了該註冊中心consul上的服務消息,此時consul註冊中心會將新的web server信息推送給consul_template,consul_template則會去修改nginx.conf的配置文件,而後讓nginx從新載入配置以達到自動修改負載均衡的目的。一樣當一個web server掛了,registrator也能感知到,進而通知consul作出響應。
3、單機版consul+consul-template+registrator+nginx實現自動服務發現
一、consul部署
consul安裝
下載二進制Consul包: https://www.consul.io/downloads.html
# unzip consul_0.9.2_linux_amd64.zip
# mv consul /usr/bin
consul部署
nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=10.11.97.181 -client=0.0.0.0 -node=server01 &>/var/log/consul.log &
指定角色爲server、agent,啓動UI界面,數據目錄爲/var/lib/consul-data,綁定本機IP地址,節點名稱爲server01;
啓動後查看服務是否正常:
[root@localhost src]# cat /var/log/consul.log nohup: ignoring input ==> WARNING: Bootstrap mode enabled! Do not enable unless necessary ==> Starting Consul agent... ==> Consul agent running! Version: 'v0.9.2' Node ID: 'f5491cd9-e4da-993e-1b70-e8d3541a0b56' Node name: 'server01' Datacenter: 'dc1' Server: true (bootstrap: true) Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 8600) Cluster Addr: 10.11.97.181 (LAN: 8301, WAN: 8302) Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false ==> Log data will now stream in as it occurs: 2019/07/16 11:02:40 [INFO] raft: Restored from snapshot 4-8192-1563031670925 2019/07/16 11:02:40 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:10.11.97.181:8300 Address:10.11.97.181:8300}] 2019/07/16 11:02:40 [INFO] raft: Node at 10.11.97.181:8300 [Follower] entering Follower state (Leader: "") 2019/07/16 11:02:40 [INFO] serf: EventMemberJoin: server01.dc1 10.11.97.181 2019/07/16 11:02:40 [WARN] serf: Failed to re-join any previously known node 2019/07/16 11:02:40 [INFO] serf: EventMemberJoin: server01 10.11.97.181 2019/07/16 11:02:40 [WARN] serf: Failed to re-join any previously known node 2019/07/16 11:02:40 [INFO] consul: Adding LAN server server01 (Addr: tcp/10.11.97.181:8300) (DC: dc1) 2019/07/16 11:02:40 [INFO] consul: Handled member-join event for server "server01.dc1" in area "wan" 2019/07/16 11:02:40 [WARN] Service name "composenginxtomcat_nginx" will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes. 2019/07/16 11:02:40 [WARN] Service name "composelnmp_nginx" will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes. 2019/07/16 11:02:40 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp) 2019/07/16 11:02:40 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp) 2019/07/16 11:02:40 [INFO] agent: Started HTTP server on [::]:8500 2019/07/16 11:02:47 [ERR] agent: failed to sync remote state: No cluster leader 2019/07/16 11:02:48 [WARN] raft: Heartbeat timeout from "" reached, starting election 2019/07/16 11:02:48 [INFO] raft: Node at 10.11.97.181:8300 [Candidate] entering Candidate state in term 5 2019/07/16 11:02:48 [INFO] raft: Election won. Tally: 1 2019/07/16 11:02:48 [INFO] raft: Node at 10.11.97.181:8300 [Leader] entering Leader state 2019/07/16 11:02:48 [INFO] consul: cluster leadership acquired 2019/07/16 11:02:48 [INFO] consul: New leader elected: server01 2019/07/16 11:02:49 [INFO] agent: Synced node info
查看集羣信息: consul members consul info |grep leader consul catalog services
經過HTTP API獲取集羣信息: curl 127.0.0.1:8500/v1/status/peers # 集羣server成員 curl 127.0.0.1:8500/v1/status/leader # 集羣Raft leader curl 127.0.0.1:8500/v1/catalog/services # 註冊的全部服務 curl 127.0.0.1:8500/v1/catalog/services/nginx # 服務信息 curl 127.0.0.1:8500/v1/catalog/nodes # 集羣節點詳細信息
三、模擬註冊一個服務
curl -X PUT -d \ '{"id": "jetty","name": "service_name","address": "10.11.97.181","port": 8080,"tags": ["test"],"checks": [{"http": "http://10.11.97.181:8080/","interval": "5s"}]}' \ http://10.11.97.181:8500/v1/agent/service/register
四、UI界面查看
能夠看到,這個service是失敗的。
清理service:
curl http://10.11.97.181:8500/v1/agent/service/deregister/jetty -X PUT
清理無用service。
二、registrator部署
一、安裝
docker run -d --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest -ip=10.11.97.181 consul://10.11.97.181:8500
二、查看容器
三、consul-template部署
consul-template \ -consul-addr 10.11.97.181:8500 \ -template "./nginx.ctmpl:/usr/local/nginx/conf/nginx.conf:/usr/local/nginx/sbin/nginx -s reload" \ -log-level=info
後臺啓動方式:
nohup consul-template -consul-addr 10.11.97.181:8500 -template "./nginx.ctmpl:/usr/local/nginx/conf/default.conf:/usr/sbin/nginx -s reload" -log-level=info &>/var/log/consul-template.log &
日誌以下:
[root@localhost src]# cat /var/log/consul-template.log nohup: ignoring input 2019/07/16 03:27:23.423211 [INFO] consul-template v0.19.3 (ebf2d3d) 2019/07/16 03:27:23.423237 [INFO] (runner) creating new runner (dry: false, once: false) 2019/07/16 03:27:23.423793 [INFO] (runner) creating watcher 2019/07/16 03:27:23.423910 [INFO] (runner) starting 2019/07/16 03:27:23.423951 [INFO] (runner) initiating run 2019/07/16 03:27:23.426838 [INFO] (runner) initiating run Reloading configuration...
其中,nginx.ctmpl爲nginx模板:
[root@localhost src]# cat nginx_template/nginx.ctmpl upstream http_backend { {{range service "nginx"}} server {{ .Address }}:{{ .Port }}; {{ end }} } server { listen 8888; server_name localhost; location / { proxy_pass http://http_backend; } } [root@localhost src]#
四、Nginx服務啓動
啓動4個nginx容器做爲測試:
而且將nginx的index.html文件進行對應的修改:
查看nginx配置文件
consul-template會根據啓動的容器,自動發現nginx服務並加入配置文件中。
五、結果測試
咱們直接訪問http://10.11.97.181:8888,便可看到效果: