Consul
是由HashCorp
基于Go
语言开发的一个分布式高可用的系统,提供了服务发现、健康检查、配置(KV存储)和分段功能可以被独立使用,每个提供给Consul
的节点都运行了一个Consul
代理,服务注册和发现时这些代理都不是必须的,它们主要的作用是对服务节点进行健康检查(也可以代理对Consul Server
的访问,如果部署的是Consul Server
集群的话)。
服务节点注册信息保存在Consul Server
中,每个代理可以和一个或多个Consul Server
进行交互,在整个微服务架构中,Consul Server
作为注册中心承担着服务注册与发现任务,作用异常重要,如果出现问题,则服务注册和发现将不能完成,服务调用失败,因此,在生产环境中,我们会部署一个Consul Server
集群(3到5台Consul
服务器),集群会通过分布式一致性协议(基于Paxos
的Raft
算法)选举一个领袖并进行数据的同步,当一台机器挂掉,会选举新的领袖,从而提供了系统的可用性。
推荐按官方docker-compose-datacenter教程使用docker-compose
命令搭建consul
环境:
执行如下命令,克隆官方github
仓库获取配置文件和资源
$ git clone https://github.com/hashicorp/learn-consul-docker.git
然后进入datacenter-deploy-service-discovery
目录,使用服务发现的环境:
$ cd datacenter-deploy-service-discovery
启动容器:
$ docker-compose up -d
这样一个用于服务发现的Consul
环境就搭建完成了。
进入容器,运行consul members
即可查看集群中所有成员,目前有两个:
$ sudo docker exec -it consul-server /bin/sh
/ # consul members
Node Address Status Type Build Protocol DC Partition Segment
consul-server 192.168.0.3:8301 alive server 1.12.0 2 dc1 default <all>
consul-client 192.168.0.2:8301 alive client 1.12.0 2 dc1 default <default>
Consul
使用Access Control List
(ACL
访问控制列表)来保护对UI
、API
、CLI
、服务通信和代理通信的访问;ACL
的核心是将规则分组为策略,然后将一个或多个策略与令牌相关联。
Consul
使用token
的形式进行安全控制访问,配置ACL
的前提是所有节点都需要将ACL
启用,然后还要一个boostrap token
,因为针对子权限(策略)生成token
的时候需要用到。
要启用ACL
,需要将以下ACL
参数添加到配置文件中,然后重新启动Consul
服务:
"acl": {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true,
"tokens": {
"initial_management": "xxxxxx"
}
}
参数说明:
更多的参数说明请参考官方文档。
注意:Token
持久化是在Consul 1.4.3以后的版本才有的,在此前的版本中使用HTTP API时不能持久化token。
文中代码已上传github
。