1五、基於consul+consul-template+registrator+nginx實現自動服務發現

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,便可看到效果:

相關文章
相關標籤/搜索