Consul-template+Nginx實現Consul集羣高可用
描述
目前市面上有兩種提供服務發現工具,Eureka和Consul,Eureka集羣、技術能力已經成熟,可是已經不維護,有一些公司用了Consul作爲替代品,小編負責項目遇到一個問題,Consul集羣沒有實現高可用,致使RPC有段時間沒有工做。。。node
Consul配置文件和Eureka配置文件不同,須要指定全部集羣ip和端口並用逗號隔開,而Consul只能指定一臺機器的ip和端口,因此當指定這臺機器宕機之後其它服務就沒法使用RPC接口。linux
安裝Consul集羣
詳情見上篇博客:。。。。。。。nginx
安裝並配置Nginx
安裝Nginxweb
在nginx.conf中添加以下include conf.d/*.conf;配置。
redis
Consul-Template簡介
Consul-Template能夠查詢Consul中的服務目錄、Key、Key-values等。這種強大的抽象功能和查詢語言模板能夠使Consul-Template特別適合動態的建立配置文件。例如:建立Apache/Nginx Proxy Balancers、Haproxy Backends、Varnish Servers、Application Configurations等spring
- Quiescence:Consul-Template內置靜止平衡功能,能夠智能的發現Consul實例中的更改信息。這個功能能夠防止頻繁的更新模板而引發系統的波動。
- Dry Mode:不肯定當前架構的狀態,擔憂模板的變化會破壞子系統?無須擔憂。由於Consul-Template還有Dry模式。在Dry模式,Consul-Template會將結果呈如今STDOUT,因此操做員能夠檢查輸出是否正常,以決定更換模板是否安全。
- CLI and Config:Consul-Template同時支持命令行和配置文件。
- Verbose Debugging:即便每件事你都作的近乎完美,可是有時候仍是會有失敗發生。Consul-Template能夠提供更詳細的Debug日誌信息。
Consul-Template安裝
下載Consul-Template wget https://releases.hashicorp.com/consul-template/0.19.3/consul-template_0.19.3_linux_amd64.zip 解壓Consul-Template unzip consul-template_0.19.3_linux_amd64.zip 若是沒有unzip則安裝 sudo apt-get install unzip 授最高權限 chmod 777 consul-template 測試是否安裝成功 consul-template -v
編寫ctmpl模板
建立consul.ctmpl(touch consul.ctmpl)文件,內容以下:shell
upstream consul { {{range service "consul"}} # .Port 獲取consul的8300端口,這裏直接寫成8500 server {{.Address }}:{{ .Port/8500 }} max_fails=3 fail_timeout=60 weight=1; {{end}} } server { listen 8112; server_name localhost; location / { client_max_body_size 0; proxy_connect_timeout 300s; proxy_send_timeout 900; proxy_read_timeout 900; proxy_buffer_size 32k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_redirect off; proxy_hide_header Vary; proxy_set_header Accept-Encoding ''; proxy_set_header Host $host; proxy_set_header Referer $http_referer; proxy_set_header Cookie $http_cookie; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_headers_hash_max_size 51200; proxy_headers_hash_bucket_size 6400; proxy_pass http://consul; } }
授最高權限
chmod 777 consul.ctmpl
安全
Consul-Template模版語法
datacenters:在consul目錄中查詢全部的datacenters,{{datacenters}} file:讀取並輸出本地磁盤上的文件,若是沒法讀取,則報錯,{{file "/path/to/local/file"}} key:查詢consul中該key的值,若是沒法轉換成一個類字符串的值,則會報錯,{{key "service/redis/maxconns@east-aws"}} east-aws指定的是數據中心,{{key "service/redis/maxconns"}} key_or_default:查詢consul中該key的值,若是key不存在,則使用指定的值代替,{{key_or_default "service/redis/maxconns@east-aws" "5"}} ls:在consul中查詢給定前綴的key的頂級域值,{{range ls "service/redis@east-aws"}} {{.Key}} {{.Value}}{{end}} node:查詢consul目錄中的單個node,若是不指定node,則是當前agent的,{{node "node1"}} nodes:查詢consul目錄中的全部nodes,你也能夠指定datacenter,{{nodes "@east-aws"}} service:查詢consul中匹配的service組,{{service "release.web@east-aws"}}或者{{service "web"}},也能夠返回一組HealthService服務{{range service "web@datacenter"}} server {{.Name}} {{.Address}}:{{.Port}}{{end}},默認值返回健康的服務,若是你想返回全部服務,則{{service "web" "any"}} services:查詢consul目錄中的全部services,{{services}},也能夠指定datacenter:{{services "@east-aws"}} tree:查詢consul中給定前綴的全部K/V值,{{range tree "service/redis@east-aws"}} {{.Key}} {{.Value}}{{end}}
建立啓動命令腳本
建立啓動命令腳本 touch consul-template-start.sh 授最高權限 chmod 777 consul-template-start.sh 修改consul-template-start.sh內容以下: ./consul-template -consul-addr Consul集羣Leader節點IP:8500 -template ./consul.ctmpl:/etc/nginx/conf.d/consul.conf:"nginx -s reload"
- consul-addr:表示其鏈接監聽的數據來源,我的鏈接可靠穩定的server節點比較好;
- template:指定模板生成conf後放置自定義的Nginx配置目錄;
- 最後進行Nginx的重啓操做;
高可用集羣驗證
運行啓動命令腳本:
sh consul-template-start.sh
cookie
若是沒法啓動則檢查nginx配置和consul.ctmpl模板語法,看錯誤日誌。多半是nginx沒法啓動。架構
啓動成功後會在/nginx/conf.d文件中生成consul.conf文件,內容以下:
除Leader節點外隨便殺一個節點這個文件內容會改變,Nginx也會重啓。
咱們訪問 Nginx IP:8112 則會顯示Consul的UI界面
優勢:能夠經過Nginx動態實現負載均衡和高可用。
缺點:每次宕機後Nginx都會重啓。主節點宕機後Consul-Template沒法監控,此時從節點也跟着宕機那麼Nginx配置不會動態改變。
項目配置文件
spring: cloud: consul: host: Nginx IP port: 8112