Consul是一个分布式高可用的系统,它有以下特点:
服务发现:Consul客户能够注册一个服务,比如api或mysql,其他客户可以在Consul上查询一个指定服务的提供者。Consul提供DNS和HTTP的服务发现接口。
健康检查:Consul可以灵活的使用脚本等来检测注册在其上的服务是否可用,不健康的服务Consul也能够灵活处理,比如提供服务的主机内存使用超过90%,我们可以配置让Consul不要把这样的服务提供给服务调用者。
key/value存储:这个功能和etcd有些类似,可以通过HTTP API方便地使用。
多数据中心支持:Consul支持开箱即用的多数据中心支持,这意味着用户不用建立额外的抽象层让业务扩展到各个区域。
Consul的基本架构
提供服务给Consul的节点需要运行一个Consul agent,agent可以运行为server或client模式,服务调用或使用KV存储的节点运行agent不是必需的。agent负责服务和节点的健康检测。agent与一个或多个Consul Server进行交互。Consul Server用于存放和复制数据。在一个集群中,Consul Server一般为奇数个,常用为3、5、7,它们会使用consensus protocol来选出一个leader。服务使用节点可以查询Consul agent,而不管这个agent运行在什么模式,因为运行在client模式下的agent虽然不保存数据,但是它会将请求转发到Consul Server。
下面的内容主要对Consul的服务注册、查询以及Consul Template进行介绍。
注册服务和查询服务
服务注册可以使用HTTP API或者服务定义文件来实现,这里采用后者。
在目录/etc/consul.d下建立一个文件web.json,内容如下:
{ "service": {"name": "web", "tags": ["rails"], "port": 80} }
启动Consul为dev模式(生产环境下不能用,因为不持久化任何数据)
$consul agent -dev -config-dir /etc/consul.d
如果日志输出正常,可以通过DNS API和HTTP API来查询刚才注册的服务
DNS API 查询
$dig @127.0.0.1 -p 8600 web.service.consul SRV
HTTP API 查询
$curl http://localhost:8500/v1/catalog/service/web
Consul Template简介
Consul Template提供一个方便的方式从Consul获取数据通过consul-template的后台程序保存到文件系统。这个后台进程监控Consul实例的变化并更新任意数量的模板到文件系统。作为一个附件功能,模板更新完成后consul-template可以运行任何命令, 比如我们可以render完nginx的配置文件,然后自动执行reload命令,全部自动化,不用人为干预。
consul template 的使用也简单直接,下面是一个例子:
consul-template \
-consul 127.0.0.1:8500 \
-template "/tmp/template.ctmpl:/var/www/nginx.conf:service nginx restart" \
-retry 30s \
-once
查询本地的 Consul 实例(agent),一旦Consul保存的配置发生变化,consul template拉下来这些配置,渲染模板并重启 Nginx ,如果 Consul 不可用30秒重试一次。
模板文件的书写方法和go template 一致,可以参考https://golang.org/pkg/text/template