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