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