天天看点

Consul:分布式服务注册发现与配置中心

前言

Consul是一个用来实现分布式系统的服务发现与配置的开源工具,是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,是一个分布式高可用的系统,它有以下特点:

服务发现: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。

安装
mkdir /usr/local/consul
cd /usr/local/consul
mkdir consul.d data logs
wget https://releases.hashicorp.com/consul/1.6.1/consul_1.6.1_linux_amd64.zip
unzip consul_1.6.1_linux_amd64.zip
单机服务端节点启动配置
vi /etc/systemd/system/consul.service
[Unit]
Description=consul
After=syslog.target network.target
[Service]
Type=simple
RemainAfterExit=no
WorkingDirectory=/usr/local/consul
ExecStart=/usr/local/consul/consul agent -ui -server -bootstrap -bind 127.0.0.1 -client 0.0.0.0 \
  -data-dir /usr/local/consul/data -config-dir /usr/local/consul/consul.d \
  -log-level debug -log-file /usr/local/consul/logs/ -log-rotate-max-files=10
[Install]
WantedBy=multi-user.target
默认UI
http://192.168.200.60:8500
第三方UI
https://github.com/jippi/hashi-ui.git
./hashi-ui-linux-amd64 -consul-acl-token xxxxxxxx --consul-enable -listen-address 0.0.0.0:18500
Consul服务端ACL启用配置
#配置了acl之后,web访问,需要在ACL页面输入配置的token。
#vi /usr/local/consul/consul.d/acl.json
{
  "primary_datacenter": "dc1",
  "acl" : {
    "enabled": true,
    "default_policy": "deny",
    "down_policy": "extend-cache",
    "tokens" : {
      "master" : "xxxxxxx"
    }
  }
}
service 操作
#增加一个service
curl --request PUT --data @playload.json http://192.168.200.60:8500/v1/agent/service/register
#vi playload.json
{
    "id": "DEV/test",
    "name": "DEVtest",
    "tags": ["node_exporter","hostname"],
    "address": "192.168.200.111",
    "port": 9090,
    "Meta": {
        "username": "root666",
        "passwd": "123456666"
            },
    "check": {
        "tcp": "192.168.200.111:9090",
        "interval": "10s"
  }
}
# 删除:deregister/{ServiceID}
curl --request PUT http://192.168.200.60:8500/v1/agent/service/deregister/DEV/test
curl --request PUT http://192.168.200.60:8500/v1/agent/service/deregister/openshift.232-node02
#查询所有服务详情(精简)
curl http://192.168.200.60:8500/v1/agent/services|python -m json.tool
curl -H "X-Consul-Token: xxxxxxx" curl -H "X-Consul-Token: xxxxxxx" -G http://192.168.200.60:8500/v1/agent/services --data-urlencode 'filter=node_exporter in Tags'|python -m json.tool
curl -H "X-Consul-Token: xxxxxxx" -G http://192.168.200.60:8500/v1/agent/services --data-urlencode 'filter=Service == fgppro'
#查询单个服务(精简)【通过服务ID进行查询】
curl http://192.168.200.60:8500/v1/agent/service/dev/redis|python -m json.tool
------
查询所有服务列表【 查询所有的服务名及对应标签】
curl http://192.168.200.60:8500/v1/catalog/services|python -m json.tool
#查询指定环境的所有服务(详细)【 查询同一服务名的数据】
curl http://192.168.200.60:8500/v1/catalog/service/dev|python -m json.tool
#查询指定环境的单个服务(详细)【 查询同一服务名,同一标签的数据】
curl http://192.168.200.60:8500/v1/catalog/service/dev?tag=redis|python -m json.tool
K/V操作
#创建
curl -H "X-Consul-Token: xxxxxxx" -X PUT -d 'test' http://192.168.200.60:8500/v1/kv/web/key1
#删除
curl -H "X-Consul-Token: xxxxxxx" --request DELETE http://192.168.200.60:8500/v1/kv/web/key1
#级联删除
curl -H "X-Consul-Token: xxxxxxx" --request DELETE  http://192.168.200.60:8500/v1/kv/web/?recurse=ture
#查询
curl -H "X-Consul-Token: xxxxxxx" http://192.168.200.60:8500/v1/web/key1
curl -H "X-Consul-Token: xxxxxxx" http://192.168.200.60:8500/v1/kv/hosts?keys=ture|python -m json.tool
curl -H "X-Consul-Token: xxxxxxx" http://192.168.200.60:8500/v1/kv/hosts?recurse=ture|python -m json.tool
WEB页面的 ACL配置
key_prefix "" {
  policy = "read"
}
service_prefix "" {
  policy = "read"
}
service "consul" {
  policy = "deny"
}
增加ACL之后使用的接口
curl -H 'X-Consul-Token: xxxxxxx' http://192.168.200.60:8500/v1/catalog/services|python -m json.tool
curl -H 'X-Consul-Token: xxxxxxx' http://192.168.200.60:8500/v1/agent/service/appdev/mysql-m|python -m json.tool
#查询指定环境单个服务的信息:
curl http://192.168.200.60:8500/v1/agent/service/{环境}/{服务}|python -m json.tool
#查询所有环境的服务列表
curl http://192.168.200.60:8500/v1/catalog/services|python -m json.tool