内容纲要
功能
实现分布式系统的服务发现与配置
特点
分布式、高可用、可横向扩展
角色
- Server
- 维护 Cluster 信息(建议至少 3 个节点以上)
- 多节点选举使用 Raft 协议
- Client
- 维护自身状态
- 将 DNS 、HTTP 接口请求转发给服务端
Cluster
由部署了 Consul Agent 的节点组成;Cluster 由 Server 和 Client 组成
特性
- 服务发现
- 通过 DNS 或 HTTP 的方式来注册或发现服务
- 健康检测
- Client 提供健康检查
- K/V 存储
- 动态配置、功能标记、领袖选举
- 多数据中心
优点
- 简单易用、不需集成SDK
- 自带健康检查
- 支持多数据中心
- 提供 Web 管理界面
缺点
- 不能实时获取服务信息变化的通知
使用
端口
- Server RPC:8300
- Serf LAN:8301
- Serf WAN:8302
- HTTP API:8500
- DNS Interface:8600
Docker 部署、使用
开启第1台Server
[-p=8900:8500]把8500端口映射到外部主机的8900端口,使用http://ip:8900/ui访问
[-p=10080:80]把80端口映射到外部主机的10080端口,使用http://ip:80访问等会使用的nginx测试,这一步不是必须的
[-client=0.0.0.0]表示响应所有外部请求,不开启的话会导致webgui无法访问
$ docker run -d --name=server_1 -p=8900:8500 -p=10080:80 -e CONSUL_BIND_INTERFACE=eth0 consul agent -server -bootstrap-expect=3 -client=0.0.0.0 -ui
# 查看所有docker的ip地址
$ docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
# 启动第2台 Server,join 上面得到的 server_1 的IP地址
$ docker run -d --name=server_2 -e CONSUL_BIND_INTERFACE=eth0 consul agent -server -ui -join=172.17.0.2 -client=0.0.0.0
# 启动第3台 Server
$ docker run -d --name=server_3 -e CONSUL_BIND_INTERFACE=eth0 consul agent -server -ui -join=172.17.0.2 -client=0.0.0.0
# 启动第1台 Client
$ docker run -d --name=client_1 -e CONSUL_BIND_INTERFACE=eth0 consul agent -ui -join=172.17.0.2 -client=0.0.0.0
# 检查 Consul 集群状况
$ docker exec -t server_1 consul members
####################
# 集群2
$ docker run -d --name=consul5 -e CONSUL_BIND_INTERFACE='eth0' consul agent -server -bootstrap-expect 3 -datacenter=dc2
$ docker run -d --name=consul6 -e CONSUL_BIND_INTERFACE=eth0 consul agent --datacenter=dc2 --server=true --client=0.0.0.0 --join 172.17.0.6
$ docker run -d --name=consul7 -e CONSUL_BIND_INTERFACE=eth0 consul agent --datacenter=dc2 --server=true --client=0.0.0.0 --join 172.17.0.6
$ docker run -d --name=consul8 -e CONSUL_BIND_INTERFACE=eth0 consul agent --datacenter=dc2 --server=false --client=0.0.0.0 --join 172.17.0.6
# 多数据中心关联
$ docker exec -it consul6 consul join -wan 172.17.0.2
使用说明
Environment Variable(环境变量)
指令 | 功能 |
---|---|
CONSUL_BIND_INTERFACE=eth0 | 在容器启动时,自动绑定eth0端口的IP地址 |
CONSUL_UI_LEGACY | 使用旧版ui |
Command(命令)
指令 | 功能 |
---|---|
acl | Interact with Consul’s ACLs |
agent | 运行Consul agent |
catalog | Interact with the catalog |
connect | Interact with Consul Connect |
debug | 记录操作者的错误日志 |
event | 构建一个事件 |
exec | Executes a command on Consul nodes |
force-leave | Forces a member of the cluster to enter the "left" state |
info | 向操作者提供错误信息 |
intention | Interact with Connect service intentions |
join | 告诉Consul agent加入哪个簇 |
keygen | Generates a new encryption key |
keyring | Manages gossip layer encryption keys |
kv | 启用顶层KV键值功能 |
leave | Gracefully leaves the Consul cluster and shuts down |
lock | Execute a command holding a lock |
maint | Controls node or service maintenance mode |
members | Lists the members of a Consul cluster |
monitor | Stream logs from a Consul agent |
operator | Provides cluster-level tools for Consul operators |
reload | Triggers the agent to reload configuration files |
rtt | Estimates network round trip time between nodes |
services | Interact with services |
snapshot | Saves, restores and inspects snapshots of Consul server state |
tls | Builtin helpers for creating CAs and certificates |
validate | Validate config files/directories |
version | Prints the Consul version |
watch | Watch for changes in Consul |
Args(参数)
Docker参数 | 功能 |
---|---|
-e | 将时区信息传入到容器内部。 |
-d | Daemon模式 |
-p | 绑定端口 |
–name | 指定实例名称 |
Consul参数 | 功能 |
---|---|
-data-dir | 指定agent储存状态的数据目录 |
-config-dir | 指定service的配置文件和检查定义所在的位置;通常会指定为"某一个路径/consul.d"(通常情况下,.d表示一系列配置文件存放的目录) |
-config-file | 指定一个要装载的配置文件;选项可以配置多次,进而配置多个配置文件(后边的会合并前边的,相同的值覆盖) |
-dev | 创建一个开发环境下的server节点;该参数配置下,不会有任何持久化操作,即不会有任何数据写入到磁盘 |
-bootstrap-expect | 该命令通知consul server我们现在准备加入的server节点个数,该参数是为了延迟日志复制的启动直到我们指定数量的server节点成功的加入后启动。 |
-node | 指定节点在集群中的名称;该名称在集群中必须是唯一的(默认采用机器的host);推荐直接采用机器的IP |
-bind | 指明节点的IP地址 |
-server | 指定节点为server;每个数据中心(DC)的server数推荐为3或5(理想的是,最多不要超过5) |
-client | consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0 |
-join | 将节点加入到集群 |
-domain | 绑定域名 |
-dc | 指定加入哪个数据中心 |
–retry-join | [Server A的IP地址] 通过连接Server A加入集群 |
–ui | 开启网页GUI |
权限控制
架构图