前言
在《构建Consul集群》章节中介绍了如何实现consul集群的构建,通过对consul的进一步了解,其并没有提供的对cluster直接操作的client-api,故需要针对Consul集群构建一个统一入口,但这个并不需要我们过多的担心,Consul的小伙伴Consul-Template正是为此而生,通过Nginx+ConsulTemplate能够非常方便的实现,本章将来介绍如何配置应用并验证。
本章概要
1、准备工作;
2、Nginx配置;
3、编写ctmpl模板;
4、启动服务;
5、高可用集群验证;
准备工作
1、环境:
Client节点:WIN10(192.168.6.78);
Server节点:Linux(192.168.3.89);
2、下载consul-template:地址https://releases.hashicorp.com/consul-template/
3、安装nginx1.13.8;
Note:其中nginx和consul-template均会部署在linux中.
Nginx配置
为了将我们的个性化配置与默认配置分离,在nginx.conf中添加如下include conf.d/*.conf;配置,并调整其默认监听端口为8112,大致如下:
编写ctmpl模板
创建consul.ctmpl文件,内容如下:
upstream consul {
# Refer: http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream
# ip_hash;
# least_conn;
# least_time;
{{range nodes "@dc2~_agent"}}
server {{.Address }}:{{.Meta.httpport}} max_fails=3 fail_timeout=60 weight=1;
{{else}}server 127.0.0.1:65535; # force a 502{{end}}
}
server {
listen 8111;
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;
}
}
Note:
网上包括官网有一些案例可以参考,但其在获取节点信息时均采用的service方式,其仅仅可以获取到以server模式启动的节点,但实际在应用中,我们需要连接的是非持久化的client节点,故调整为获取Nodes信息;
获取每个节点的端口信息采用{{.Meta.httpport}}方式。官方提供的{{.Port}}并非是http-port属性值,故需要通过自定义元数据来实现;
通过"@dc2~_agent"对Nodes进行了一些过滤,如果需要区分是否为server节点,可以自定义一些元数据即可;
具体的语法和参数可以参考如下两个地址:
语法:https://github.com/hashicorp/consul-template;
参数:https://github.com/hashicorp/consul-template/blob/master/dependency/catalog_nodes.go;https://github.com/hashicorp/consul-template/blob/master/dependency/catalog_node.go;https://github.com/hashicorp/consul-template/blob/master/dependency/health_service.go
以上具体有哪些参数可用也可以通过/v1/catalog/nodes相关的端口查看;
启动服务
1、首先来看下已经准备好哪些文件:
2、启动Nginx,其安装在/usr/local/nginx-1.13.8目录下:
/usr/local/nginx-1.13.8/sbin/nginx
3、启动Linux下Server(Master)节点:
./consul agent -server -bootstrap-expect 1 -ui -datacenter dc2 -disable-host-node-id -client 0.0.0.0 -bind 192.168.3.89 -data-dir ./data/ -http-port 8501 -node node2 -node-meta httpport:8501
4、启动WIN10下的Client节点:
D:\consul>consul agent -datacenter dc2 -client 0.0.0.0 -ui -data-dir ./data/ -http-port 8500 -bind 192.168.6.78 -join 192.168.3.89 -disable-host-node-id -node node1 -node-meta httpport:8500
5、编写consul-template-start.sh如下,其主要用来启动consul-template:
./consul-template -consul-addr 192.168.3.89:8501 -template ./consul.ctmpl:/usr/local/nginx-1.13.8/conf/conf.d/consul.conf:"/usr/local/nginx-1.13.8/sbin/nginx -s reload"
Note:
-consul-addr:表示其连接监听的数据来源,个人连接可靠稳定的server节点比较好;
-template:指定模板生成conf后放置自定义的Nginx配置目录;
最后进行Nginx的重启操作;
6、此时我们通过http://192.168.3.89:8501/ui/#/dc2/nodes和http://192.168.6.78:8500/ui/#/dc2/nodes均能够看下如下
高可用集群验证
1、此时至/usr/local/nginx-1.13.8/conf/conf.d/即可看到根据模板生成的conf配置文件:
可以看到两个节点均被加入了负载服务列表;
2、通过浏览器访问http://192.168.3.89:8111/ui/#/dc2/nodes,能够正常获取到各种信息:
3、停止Win下的Client节点,再次查看生成的conf配置文件:
可以看到其仅仅有一个存活状态的Server节点存在,更新成功。
4、再次通过浏览器访问http://192.168.3.89:8111/ui/#/dc2/nodes,节点信息如下:
5、KEY/VALUE部分的验证已经在之前的章节验证,不再说明;
总结
本章节主要介绍了如何通过Nginx+ConsulTemplate实现高可用Consul的配置和验证,其仍然存在一定的不足,需要重新启动Nginx,重启频率低时还是可以接受的,如果很频繁势必造成一定的影响。
---------------------
作者:帅天下
来源:CSDN
原文:https://blog.csdn.net/songhaifengshuaige/article/details/79111676
版权声明:本文为博主原创文章,转载请附上博文链接!
demo:
nginx_service1.ctmpl
upstream MsgService {
{{range service "MsgService"}}
server {{.Address}}:{{.Port}} fail_timeout=3s;
{{end}}
keepalive 64;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://MsgService;
}
}
.\consul-template --consul-addr localhost:8500 --template "nginx_service1.ctmpl:.\conf\vhosts\MsgService.conf:nginx -s reload"