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
相关文章
相关标签/搜索