正文
1.首先,upstream服务启动,我们通过管理后台向Consule注册服务。
2.我们需要在Nginx机器上部署并启动Consul-template Agent,其通过长轮询监听服务变更。
3.Consul-template监听到变更后,动态修改upstream列表。
4.Consul-template修改完upstream列表后,调用重启Nginx脚本重启Nginx。
整个实现过程还是比较简单的,不过,实际生产环境要复杂得多。我们使用了Consul0.7.0和Consul-template0.16.0来实现。
Consul-Server
首先我们要启动Consul-Server。
./consul agent -server -bootstrap-expect 1-data-dir /tmp/consul -bind 0.0.0.0-client 0.0.0.0
此处需要使用data-dir指定Agent状态存储位置,bind指定集群通信的地址,client指定客户端通信的地址(如Consul-template与Consul通信)。在启动时还可以使用-ui-dir ./ui/指定Consul Web UI目录,实现通过Web UI管理Consul,然后访问如http://127.0.0.1:8500即可看到控制界面。
使用如下HTTP API注册服务。
curl -X PUT http://127.0.0.1:8500/v1/catalog/register -d'{"Datacenter": "dc1", "Node":"tomcat", "Address":"192.168.1.1","Service": {"Id" :"192.168.1.1:8080", "Service": "item_jd_tomcat","tags": ["dev"], "Port": 8080}}'
curl -X PUT http://127.0.0.1:8500/v1/catalog/register -d'{"Datacenter": "dc1", "Node":"tomcat", "Address":"192.168.1.2","Service": {"Id" :"192.168.1.1:8090", "Service": "item_jd_tomcat","tags": ["dev"], "Port": 8090}}'
Datacenter指定数据中心,Address指定服务IP,Service.Id指定服务唯一标识,Service.Service指定服务分组,Service.tags指定服务标签(如测试环境、预发环境等),Service.Port指定服务端口。
通过如下HTTP API摘除服务。
curl -X PUThttp://127.0.0.1:8500/v1/catalog/deregister -d '{"Datacenter":"dc1", "Node": "tomcat", "ServiceID" :"192.168.1.1:8080"}'
通过如下HTTP API发现服务。
curlhttp://127.0.0.1:8500/v1/catalog/service/item_jd_tomcat
可以看到,通过这几个HTTPAPI可以实现服务注册与发现。更多API请参考
https://www.consul.io/docs/agent/http.html
。
Consul-template
接下来我们需要在Consul-template机器上添加一份配置模板item.jd.tomcat.ctmpl。
upstream item_jd_tomcat {
server 127.0.0.1:1111; #占位server,必须有一个server,否则无法启动
{{range service"dev.item_jd_tomcat@dc1"}}
server {{.Address}}:{{.Port}} weight=1;
{{end}}
}
service指定格式为:标签.服务@数据中心,然后通过循环输出Address和Port,从而生成Nginx upstream配置。
启动Consul-template。