名字服务consul-快速应用

说明

有关于consul的说明有一个入门的中文文档,连接如下:consul入门指南;名字服务consul系列中的内容来源于此文档!

名字服务的应用

名字服务主要用于服务发现和服务注册。
一个打电话的场景:当需要打电话的时候,我们可以在手机上电话薄中找到对应人然后拨打就可以了;想象一下,如果没有电话薄的话,我们就需要记住每一个人的电话号码;并且如果其中某些人的电话号码变了,记忆中的电话号码也需要变更。
我想给a打电话:我不需要知道a的电话号码,直接在电话薄上选择a就可以了(服务发现);前提是a在电话薄上有记录(服务注册)。
consul就是类似于一个电话薄的作用;服务A如果要调用服务B,服务A不直接调用B,而是通过名字服务(consul)获取B的信息,然后再去调用,为什么要这样做?为什么不直接调用?
有如下服务调用:
左边调用右边的服务,在服务较少的时候肯定是直接连接的,这样只要右边服务变动了,那么所有依赖此后端的web服务都需要改变。
后来加入代理服务,通过ha做代理,web服务通过ha不同的端口去连接端服务;这样后端服务对web服务是透明的,当后端服务变动的时候,我们只需要改变ha的配置即可,想象一下这种服务有什么缺点?
1、ha的配置变动影响很大,若是ha不可用了,则整个应用会全部挂掉;当然这里可以和keepalived结合使用高可用,但是ha只有一台主机对外提供服务,虽然ha的性能很高,但是单个机器的性能毕竟是有限的。
2、后端服务变动,每次都需要手动修改ha的配置,风险较高。
3、虽然使用ha和keepalived我们可以做ha代理的高可用,但是我们需要手动维护两个haproxy代理配置文件的一致性。
4、如果后端服务有问题,ha还是会把相应的请求转发到对应的出现异常的服务器上。
在这里插入图片描述应用中引入名字服务:
在这里插入图片描述如图我们引入了名字服务:
红色线: 服务注册到名字服务consul中(服务注册)
黑色虚线: web查询名字服务(服务发现),注意这里只查询得到对应服务的连接信息。
蓝色实线:web服务根据查询到的对应的服务,然后直接连接后面的服务,而不是通过名字服务。【这一点是和ha代理的很不一样的地方】
consul服务本身就有集群的特性,因此我们可以使用多个consul server保证集群的高可用性;并且不需要手动维护数据的统一。

consul基本概念

下面信息来自官方文档翻译: consul官方文档
consul是一个分布式高可用架构,每一个提供consul 服务的节点都需要运行一个consul agent。

Every node that provides services to Consul runs a Consul agent. Running an agent is not required for discovering other services or getting/setting key/value data. The agent is responsible for health checking the services on the node as well as the node itself.

consul agent与一个或多个consul server通信,consul server用于k,v值的持久化和server之间的replication。生产建议使用3到5台server机器组成集群,以避免数据的丢失。
consul server会生成一个目录,server会汇聚agent提交的信息。通过server可以查看到当前集群中运行状态,服务名,以及各个agent的状态。
我们可以查询consul集群中的任何一台服务器(包含agent和server),agent会自动地把相应的请求转发到server。
每个数据中心都有一个集群,当跨数据中心的请求或者注册到达本地时,数据中心会转发相应的请求到远程数据中心,并且返回结果。

名字服务特性

Consul包含多个组件,但是作为一个整体,为你的基础设施提供服务发现和服务配置的工具.他提供以下关键特性:

1、服务发现 Consul的客户端可用提供一个服务,比如 api 或者mysql ,另外一些客户端可用使用Consul去发现一个指定服务的提供者.通过DNS或者HTTP应用程序可用很容易的找到他所依赖的服务.

2、健康检查 Consul客户端可用提供任意数量的健康检查,指定一个服务(比如:webserver是否返回了200 OK 状态码)或者使用本地节点(比如:内存使用是否大于90%). 这个信息可由operator用来监视集群的健康.被服务发现组件用来避免将流量发送到不健康的主机.

3、Key/Value存储 应用程序可用根据自己的需要使用Consul的层级的Key/Value存储.比如动态配置,功能标记,协调,领袖选举等等,简单的HTTP API让他更易于使用.

4、多数据中心: Consul支持开箱即用的多数据中心.这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域.

consul agent & server

consul agent是consul的核心,agent用于维护集群之间成员关系,注册服务,健康检测,响应查询等功能,agent必须运行在集群的每一个节点上。
consul server节点还需要承担“仲裁”的功能,这些节点是raft协议的一部分,在发生故障时提供强一致性和可用性。server节点通常应运行在单独的实例上,server需要更多的资源。客户端节点构成了群集的大部分,它们非常轻巧,因为它们与服务器节点交互以进行大多数操作,并且很少维护自己的状态。
consul可以直接从官方网站下载一个二进制可执行包,其有两种运行模式一种是以server形式运行,一种是以agent形式运行。

agent

官方文档-agent介绍

consul是一个二进制文件,直接从官网下载即可,linux系统加入到对应PATH环境变量即可。
1、启动一个agent节点

[root@test1 ~]# consul agent                #这里提示需要执行data_dir参数
==> data_dir cannot be empty
[root@test1 ~]# consul agent -data-dir=/tmp/    #data-dir参数的位置,指定consul运行目录,会生成一些agent相关的文件信息
==> Starting Consul agent...
           Version: 'v1.7.0'                    #consul的版本      
           Node ID: '6a73a0a6-959e-0d28-7835-e9cfca08da6c'      #consul的nodeid,这个值在旧版本中没有
         Node name: 'test1'                     #node name默认是主机名
        Datacenter: 'dc1' (Segment: '')         #数据中心名称
            Server: false (Bootstrap: false)    #是否是以server模式运行,默认是false
       Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
      Cluster Addr: 10.9.8.23 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false
==> Log data will now stream in as it occurs:

# **下面有说明几个端口的应用**
2020-10-28T15:18:14.748+0800 [INFO]  agent.client.serf.lan: serf: EventMemberJoin: clent1 10.9.8.23
2020-10-28T15:18:14.748+0800 [INFO]  agent: Started DNS server: address=127.0.0.1:8600 network=udp
2020-10-28T15:18:14.750+0800 [INFO]  agent: Started DNS server: address=127.0.0.1:8600 network=tcp
2020-10-28T15:18:14.750+0800 [INFO]  agent: Started HTTP server: address=127.0.0.1:8500 network=tcp

在实际使用中有关consul的配置我们都会放入配置文件中,以指定配置文件的形式启动,而不是把所有的参数都放在命令行。有关consul配置文件参数说明:consul agent相关配置详细说明
2、以配置文件的形式启动agent:
以配置文件启动的时候需要指定config-dir参数,这样consul在启动时会自动加载 这个目录 下面的所有json文件:
执行以下命令启动agent,命令会把consul服务放入后台运行,并且把日志重定向输出到/data/nameservice/consul.log文件中。

consul agent -config-dir=/etc/consul.d/ -bind=10.9.8.23 -advertise=10.9.8.23 -ui >> /data/nameservice/consul.log 2>&1 &

在/etc/consul.d/下面写入consul agent的配置文件:

[root@test1 consul.d]# pwd
/etc/consul.d
[root@test1 consul.d]# cat consul_agent.json 
{
   "node_name":"clent1",
   "server":false,
   "datacenter":"local_ds",
   "pid_file":"/var/run/consul.pid",
   "enable_local_script_checks":true,
   "data_dir":"/data/nameservice/data" 
}

说明一个用python校验json格式正确与否的小技巧:

[root@test1 consul.d]# python -m json.tool consul_agent.json     #如果格式没有异常,会把对应的内容打印出来的
{
    "data_dir": "/data/nameservice/data",
    "datacenter": "local_ds",
    "enable_local_script_checks": true,
    "node_name": "clent1",
    "pid_file": "/var/run/consul.pid",
    "server": false
}

3、以开发模式启动agent:
consul会自动加载在config-dir指定的目录下面的所有json文件,因此当我们想通过此agent向consul注册服务时,就可以把相应的服务信息写入到json文件中,然后放入到这个目录中,重新加载consul即可。
首先以开发模式启动consul agent:

[root@test1 consul.d]# consul agent -dev -config-dir /etc/consul.d/
# 这里-dev表示以开发模式启动consul

然后把下面这个web.json放到/etc/consul.d/下面,再执行consul reload重新加载consul!

[root@test1 consul.d]# cat web.json 
{
    "services":[{
        "id": "mysql",
        "name": "min-kline",
        "tags": ["dev"],
        "port": 3309,
        "address": "10.9.8.23"
     },{
        "id": "redis",
        "name": "min-redis",
        "tags": ["dev"],
        "port": 6379,
        "address": "10.9.8.23"
     }]
}

我们这个web.json文件放到/etc/consul.d/目录下面,然后通过重新加载consul:

consul reload 命令可以重新加载consul服务,这样并不需要重启

[root@test1 ~]# mv /tmp/web.json /etc/consul.d/ 
[root@test1 ~]# consul reload 
Configuration reload triggered

dev模式下,日志输出到标准输出,这时候我们可以在日志中看到如下内容:

2020-10-28T16:44:46.722+0800 [DEBUG] agent: Service in sync: service=mysql
2020-10-28T16:44:46.722+0800 [DEBUG] agent: Service in sync: service=redis

这就说明web.json中的两个服务已经注册到消息中心了!
通过http接口可以访问到对应的服务:

[root@test1 ~]# curl http://127.0.0.1:8500/v1/catalog/services
{
    "consul": [],
    "min-kline": [
        "dev"
    ],
    "min-redis": [
        "dev"
    ]
}

consul集群搭建

使用的consul版本:

[root@test2 ~]# consul version
Consul v1.7.0
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

使用三台机器搭建一个consul集群:
测试主机:10.9.8.24、10.9.8.25、10.9.8.26
三台主机的目录结构如下:

/data/nameservice
[root@test2 nameservice]# tree -L 2
.
├── bin
├── conf
│   └── consul.json
├── consul.log
├── consul.pid
└── data

其中conf/consul.json文件为启动consul时的配置文件,其内容如下:

[root@test2 conf]# cat consul.json 
{
  "datacenter": "local_ds",                       #数据中心
  "data_dir": "/data/nameservice/data",           #指定data_dir的位置
  "log_level": "INFO",                            #日志级别 
  "node_name": "test3",                           #node_name要唯一
  "server": true,                                 #以server模式启动
  "pid_file": "/data/nameservice/consul.pid"      #指定pid文件的位置   
}

三台机器的配置文件保持一致即可,注意更改node_name,然后启动consul集群。

consul agent -ui -bind 10.9.8.24 -client 0.0.0.0 -config-dir /data/nameservice/conf/ >> /data/nameservice/consul.log 2>&1 &
参数说明:
-ui:指定启动consul的web管理解密
-bind:Sets the bind address for cluster communication.【绑定ip用于集群之间通信,三台机器各自绑定各自的ip,这里需要个改动】
-config-dir:指定配置文件的路径,位于这个目录下面的所有json文件都会被加载。
-client-dir: Sets the address to bind for client access.This includes RPC, DNS,
     HTTP, HTTPS and gRPC (if configured) [这个绑定用于http,客户端通信]

注意更改-bind参数,然后分别在其余两台机器启动,查看一下监听端口:

[root@test2 bin]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 10.9.8.24:8300          0.0.0.0:*               LISTEN      2754/consul         
tcp        0      0 10.9.8.24:8301          0.0.0.0:*               LISTEN      2754/consul         
tcp        0      0 10.9.8.24:8302          0.0.0.0:*               LISTEN      2754/consul         
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1549/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2139/master         
tcp6       0      0 :::8500                 :::*                    LISTEN      2754/consul         
tcp6       0      0 :::22                   :::*                    LISTEN      1549/sshd           
tcp6       0      0 :::8600                 :::*                    LISTEN      2754/consul         
tcp6       0      0 ::1:25                  :::*                    LISTEN      2139/master         
[root@test2 bin]# 

三台机器都应该有监听以上的端口:
在10.9.8.25、10.9.8.26机器上执行如下命令加入集群中:

[root@test3 nameservice]# consul join 10.9.8.24
Successfully joined cluster by contacting 1 nodes.

在日志中可以看到如下提示:

2020-10-26T10:20:14.852+0800 [INFO]  agent.server: New leader elected: payload=test2

由以上信息已经可以看到,consul集群中已经选举产生了一个leader!

agent加入集群

上面提到过agent可以用配置文件的形式启动,下面启动一个agent(ip为:10.9.8.23),然后把agent加入到对应的集群中!
agent服务器的/etc/consul.d/目录下面有两个文件,内容如下:

[root@test1 consul.d]# cat consul_agent.json 
{
   "node_name":"clent1",
   "server":false,
   "datacenter": "local_ds",
   "pid_file":"/var/run/consul.pid",
   "enable_local_script_checks":true,
   "data_dir":"/data/nameservice/data" 
}
[root@test1 consul.d]# cat web.json 
{
    "services":[{
        "id": "mysql",
        "name": "min-kline",
        "tags": ["dev"],
        "port": 3309,
        "address": "10.9.8.23",
        "checks": [{
            "name": "check mysql status",
            "args": ["/data/nameservice/script/check_db_status.sh"],
            "interval": "10s",
            "timeout": "5s"
         }]
     },{
        "id": "redis",
        "name": "min-redis",
        "tags": ["dev"],
        "port": 6379,
        "address": "10.9.8.23",
        "checks": [{
            "name": "SSH TCP on port 22",
            "tcp": "localhost:22",
            "interval": "10s"
         }]
     }]
}
# checks里面的参数可以暂时先忽略,后面在注册服务中会有说明!

用以下命令启动agent服务:

consul agent -config-dir=/etc/consul.d/ -bind=10.9.8.23 -client=0.0.0.0 -ui -join=10.9.8.24 >> /data/nameservice/consul.log 2>&1 & 

查看集群成员信息

1、查看当前集群中的成员信息,可以执行如下命令:
说明:这个consul members命令会查看自身的8500端口,如果报错可能是consul没有监听127.0.0.1这个ip地址。

[root@test1 consul.d]# consul members
Node    Address         Status  Type    Build  Protocol  DC        Segment
test1   10.9.8.26:8301  alive   server  1.7.0  2         local_ds  <all>
test2   10.9.8.25:8301  alive   server  1.7.0  2         local_ds  <all>
test3   10.9.8.24:8301  alive   server  1.7.0  2         local_ds  <all>
clent1  10.9.8.23:8301  alive   client  1.7.0  2         local_ds  <default>

2、查看当前集群中的领导者、集群中的leader是有标识的!

[root@test2 nameservice]# consul operator raft list-peers
Node   ID                                    Address         State     Voter  RaftProtocol
test3  f501a2ab-2719-dd76-2768-fafd9bb40573  10.9.8.24:8300  leader    true   3
test2  a7f2c8ef-21ec-f544-8eac-ededfd9a0f48  10.9.8.25:8300  follower  true   3
test1  99de144d-82dd-22e7-11bb-1c7e1fcfe3c4  10.9.8.26:8300  follower  true   3

离开集群

在启动agent客户端时,在config-dir指定的配置目录下面,注册了两个服务,我们可以通过指向集群任一地址查看注册的服务:

[root@test2 nameservice]# curl 10.9.8.25:8500/v1/catalog/services
{"consul":[],"min-kline":["dev"],"min-redis":["dev"]}

agent离开集群

consul leave命令的官方文档:consul leave
leave命令触发一次平稳的离开并且关闭agent;当执性leave之后,在集群中该节点的状态为left而不是failed;使用consul leave离开集群之后,重新启动agent,agent不会自动加入集群。

[root@test1 consul.d]# consul leave 
Graceful leave complete

在集群的server机器上执行一下consul members,发现client的状态为left!

[root@test2 nameservice]# consul members
Node    Address         Status  Type    Build  Protocol  DC        Segment
test1   10.9.8.26:8301  alive   server  1.7.0  2         local_ds  <all>
test2   10.9.8.25:8301  alive   server  1.7.0  2         local_ds  <all>
test3   10.9.8.24:8301  alive   server  1.7.0  2         local_ds  <all>
clent1  10.9.8.23:8301  left    client  1.7.0  2         local_ds  <default>

然后我们查看一下这个agent注册的两个服务,发现agent注册的两个服务已经不存在了;也就是说通过当前agent注册的服务,在agent停止是候,其对应的注册服务也不存在了。

[root@test2 nameservice]# curl 10.9.8.25:8500/v1/catalog/services
{"consul":[]}[root@test2 nameservice]#

server服务离开集群

在这个集群中,10.9.8.24、10.9.8.25、10.9.8.26是三台集群,选择一个非leader的server端,尝试离开集群的操作:
由上面的consul operator raft list-peers命令可知当前consul集群中的leader为test3,在test2上测试,在test2上执行如下命令:

[root@test2 nameservice]# consul leave 
Graceful leave complete

然后在consul集群中执行命令,查看当前集群中的leader是否改变!

[root@test3 nameservice]# consul members
Node    Address         Status  Type    Build  Protocol  DC        Segment
test1   10.9.8.26:8301  alive   server  1.7.0  2         local_ds  <all>
test2   10.9.8.25:8301  alive   server  1.7.0  2         local_ds  <all>
test3   10.9.8.24:8301  left    server  1.7.0  2         local_ds  <all>
clent1  10.9.8.23:8301  alive   client  1.7.0  2         local_ds  <default>
[root@test3 nameservice]# consul operator raft list-peers
Node   ID                                    Address         State     Voter  RaftProtocol
test2  a7f2c8ef-21ec-f544-8eac-ededfd9a0f48  10.9.8.25:8300  follower  true   3
test1  99de144d-82dd-22e7-11bb-1c7e1fcfe3c4  10.9.8.26:8300  leader    true   3

发现test2的状态已经改为left,但是集群的leader也已经由test3换为test1;在consul集群中,非leader server服务的离开,也会导致集群leader的重新选举。

注册服务

下面我们在agent端注册一个服务:
有关agent注册服务的配置,官方文档上有说明:官方文档agent conf,下面会以一个实例说明:
官方文档里有命令行的配置和配置文件的配置说明,下面以配置文件的配置说明:
配置文件是json格式,json格式是更容易编辑和阅读的。环境中提倡使用配置文件,配置文件提供服务定义和检测服务的功能。
官方文档的配置说了很多配置,这里只说明服务注册和checks机制。官方文档:服务发现和checks
配置文件是一个json格式,以上面检查MySQL实例的json文件来说明:

{
    "services":[{
        "id": "mysql",
        "name": "min-kline",
        "tags": ["dev"],
        "port": 3309,
        "address": "10.9.8.23",
        "checks": [{
            "name": "check mysql status",
            "args": ["/data/nameservice/script/check_db_status.sh"],
            "interval": "10s",
            "timeout": "5s"
         }]
     }]
}

service定义必须包含一个name和许多其他的字段如:idtagsaddressmetaportenable_tag_overridecheck 等。
如果没有定义id,则id被设为为name的值。所有的服务必须有唯一的id,因此如果name冲突的话,则id应为唯一。
tag:其值是一个[“value”]形式,可以有多个,标签可以用来区分服务的主备。标签的值在ui界面会有展示。
address: 服务的ip地址,默认是agent所在的ip地址。
port:定义服务的端口
checks:主要用于检测定义的服务是否正常,关于checks的详细说明:checks
我们使用脚本的方式进行检测:
脚本检测需要当前agent设置enable_local_script_checks为true:

        "checks": [{
            "name": "check mysql status",
            "args": ["/data/nameservice/script/check_db_status.sh"],
            "interval": "10s",
            "timeout": "5s"
         }]

args字段里面是一个list值,里面可以设置检测的脚本以及脚本参数等;检测根据返回码来判断服务是否健康:

Exit code 0 - Check is passing
Exit code 1 - Check is warning
Any other code - Check is failing

写一个很简单的脚本,来检查MySQL是否存活:

[root@test1 script]# pwd
/data/nameservice/script
[root@test1 script]# cat check_db_status.sh 
#!/bin/bash
mysql_ping=`/usr/local/mysql/bin/mysqladmin ping |grep 'alive'|wc -l`
if [ $mysql_ping -eq 1 ];then
echo "Mysql is running The Pid is" `ps aux |grep mysql|grep 3306 |grep -v grep |awk '{print $2}'`
exit 0
else:
echo "Mysql is not running"
exit 1
fi

把这个json文件放在agent端config-dir指定的目录下面,然后执行consul reload重新加载配置文件。

agent查询

若是没有报错则可以查看注册的服务:
agent有很多api,官方文档地址:agent api
1、查询当前agent注册的服务:

[root@test1 ~]# curl 10.9.8.23:8500/v1/agent/services
{"mysql":{"ID":"mysql","Service":"min-kline","Tags":["dev"],"Meta":{},"Port":3309,"Address":"10.9.8.23","TaggedAddresses":{"lan_ipv4":{"Address":"10.9.8.23","Port":3309},"wan_ipv4":{"Address":"10.9.8.23","Port":3309}},"Weights":{"Passing":1,"Warning":1},"EnableTagOverride":false},"redis":{"ID":"redis","Service":"min-redis","Tags":["dev"],"Meta":{},"Port":6379,"Address":"10.9.8.23","TaggedAddresses":{"lan_ipv4":{"Address":"10.9.8.23","Port":6379},"wan_ipv4":{"Address":"10.9.8.23","Port":6379}},"Weights":{"Passing":1,"Warning":1},"EnableTagOverride":false}}
[root@test1 ~]# curl 10.9.8.23:8500/v1/agent/services?name=min-kline     #查询指定服务的信息

查询当前agent的信息:/v1/agent/members
读取当前agent自身的配置: /v1/agent/self
说明这个/v1/agent/只能查询当前agent注册的服务,不能查询其余agent注册的服务;可以通过集群/v1/catalog/这个url查看集群中注册的服务。

[root@test2 nameservice]# curl 10.9.8.26:8500/v1/catalog/services
{"consul":[],"min-kline":["dev"],"min-redis":["dev"]}

consul本身提供了许多API信息,可以对consul中的服务做crud操作:官方API文档
2、查询当前集群中注册的服务:
通过/v1/catalog/这个url可以查看到当前集群中注册的服务:

  • 查看当前集群中注册了哪些服务,url后面加入pretty表示以格式化展示。
[root@test1 nameservice]# curl 10.9.8.24:8500/v1/catalog/services?pretty
{
    "consul": [],
    "min-kline": [
        "dev"
    ],
    "min-redis": [
        "dev"
    ]
}

查看某个服务的详细信息:/v1/catalog/service/service_name, 这个url会显示出当前注册服务的详细信息。

[root@test1 nameservice]# curl 10.9.8.24:8500/v1/catalog/service/min-kline?pretty
[
    {
        "ID": "b2ff0f00-f28e-d1dd-c27b-d8986d2c7352",
        "Node": "clent1",
        "Address": "10.9.8.23",
        "Datacenter": "local_ds",
        "TaggedAddresses": {
            "lan": "10.9.8.23",
            "lan_ipv4": "10.9.8.23",
            "wan": "10.9.8.23",
            "wan_ipv4": "10.9.8.23"
        },
        "NodeMeta": {
            "consul-network-segment": ""
        },
        "ServiceKind": "",
        "ServiceID": "mysql",
        "ServiceName": "min-kline",
        "ServiceTags": [
            "dev"
        ],
        "ServiceAddress": "10.9.8.23",
        "ServiceTaggedAddresses": {
            "lan_ipv4": {
                "Address": "10.9.8.23",
                "Port": 3309
            },
            "wan_ipv4": {
                "Address": "10.9.8.23",
                "Port": 3309
            }
        },
        "ServiceWeights": {
            "Passing": 1,
            "Warning": 1
        },
        "ServiceMeta": {},
        "ServicePort": 3309,
        "ServiceEnableTagOverride": false,
        "ServiceProxy": {
            "MeshGateway": {},
            "Expose": {}
        },
        "ServiceConnect": {},
        "CreateIndex": 16388,
        "ModifyIndex": 16388
    }
]

键值对存储(key,value)

consul提供了一个web界面用于管理服务和kv值,在启动consul的时候我们使用了-ui选项,这个选项表示启用consul的web界面!
集群中的任一节点ip地址,在浏览器访问:10.9.8.25:8500/ui,进入consul的web管理端,在nodes导航下可以看到集群中的节点信息!
在这里插入图片描述web界面中可以看到每个节点的信息,以及每个节点的服务信息。

web界面创建键值对

可以在consul的web界面看到一个key/value导航,这个就是consul的键值对存储管理,在这里我们可以创建一个键值对存储!
这里选择了使用json格式,点击save保存!
在这里插入图片描述

调用API操作键值对

官方文档
1、查询在web界面创建的键值对

  • 查询注册的所有的keys
[root@test3 nameservice]# curl 10.9.8.25:8500/v1/kv/?keys
["stock/db/kline_info","wm/memory/redis_info"]
  • 查询指定的key,可以看到查询出的vallue是经过加密处理,base64加解密的。
[root@test3 nameservice]# curl 10.9.8.25:8500/v1/kv/stock/db/kline_info?pretty 
[
    {
        "LockIndex": 0,
        "Key": "stock/db/kline_info",
        "Flags": 0,
        "Value": "ewoJInVzZXIiOiAia2xpbmVyZWFkIiwKICAiaG9zdCI6ICIxMC45LjY4LjQxIiwKICAicG9ydCI6ICIzMzA2IiwKICAicGFzc3dvcmQiOiAiMTIzNHF3ZXIiLAogICJkYiI6ICJrbGluZWRiIgp9",
        "CreateIndex": 10962,
        "ModifyIndex": 10962
    }
]
# 解密信息
[root@test3 nameservice]# echo "ewoJInVzZXIiOiAia2xpbmVyZWFkIiwKICAiaG9zdCI6ICIxMC45LjY4LjQxIiwKICAicG9ydCI6ICIzMzA2IiwKICAicGFzc3dvcmQiOiAiMTIzNHF3ZXIiLAogICJkYiI6ICJrbGluZWRiIgp9" |base64 -d 
{
	"user": "klineread",
  "host": "10.9.68.41",
  "port": "3306",
  "password": "1234qwer",
  "db": "klinedb"
}
  • 上面的响应包含了元数据信息并且value值是经过加密处理的,若是想要直接查询未加密的信息可以执行如下命令:
[root@test3 nameservice]#curl 10.9.8.25:8500/v1/kv/stock/db/kline_info?raw=true 
{
	"user": "klineread",
  "host": "10.9.68.41",
  "port": "3306",
  "password": "1234qwer",
  "db": "klinedb"
}
  • 使用命令创建一个key值
[root@test3 nameservice]#curl -H "application/json" --data "{\"user\":\"dealuser\",\"host\":\"10.9.3.2\",\"password\":\"1234qwer\",\"db\":\"dealdb\"}" -X PUT 10.9.8.25:8500/v1/kv/stock/db/deal_db 
true
  • 查看一下新创建的key值:
[root@test3 nameservice]# curl 10.9.8.25:8500/v1/kv/?keys
["stock/db/deal_db","stock/db/kline_info","wm/memory/redis_info"]

单独查询这个key值时并不会返回json格式,而是一个字符串!

[root@test3 nameservice]# curl 10.9.8.25:8500/v1/kv/stock/db/deal_db?raw
{"user":"dealuser","host":"10.9.3.2","password":"1234qwer","db":"dealdb"}
  • 更新一个key值,consul支持原子更新,在多个客户端同时更新一个key值,只有一个操作更新成功。
    在查询一个key时,我肯可以看到一些元数据信息,如下:
[root@test3 nameservice]# curl 10.9.8.25:8500/v1/kv/stock/db/deal_db?pretty
[
    {
        "LockIndex": 0,
        "Key": "stock/db/deal_db",
        "Flags": 0,
        "Value": "eyJ1c2VyIjoiZGVhbHVzZXIiLCJob3N0IjoiMTAuOS4zLjIiLCJwYXNzd29yZCI6IjEyMzRxd2VyIiwiZGIiOiJkZWFsZGIifQ==",
        "CreateIndex": 11285,       #是一个内部索引值
        "ModifyIndex": 11285         
    }
]

is the last index that modified this key. This index corresponds to the X-Consul-Index header value that is returned in responses, and it can be used to establish blocking queries by setting the ?index query parameter. You can even perform blocking queries against entire subtrees of the KV store: if ?recurse is provided, the returned X-Consul-Index corresponds to the latest ModifyIndex within the prefix, and a blocking query using that ?index will wait until any key within that prefix is updated

cas (int: 0) - Specifies to use a Check-And-Set operation. This is very useful as a building block for more complex synchronization primitives. If the index is 0, Consul will only put the key if it does not already exist. If the index is non-zero, the key is only set if the index matches the ModifyIndex of that key.

利用ModifyIndex我们可以做到多个agent更新同一个key时,只有一个更新成功!
把deal_db的断口改为3309,如下:

[root@test3 nameservice]# curl -H "application/json" --data "{\"user\":\"dealuser\",\"host\":\"10.9.3.2\",\"password\":\"1234qwer\",\"db\":\"dealdb\",\"port\":\"3309\"}" -X PUT 10.9.8.25:8500/v1/kv/stock/db/deal_db?cas=11285  
true
[root@test3 nameservice]# curl -H "application/json" --data "{\"user\":\"dealuser\",\"host\":\"10.9.3.2\",\"password\":\"1234qwer\",\"db\":\"dealdb\",\"port\":\"3308\"}" -X PUT 10.9.8.25:8500/v1/kv/stock/db/deal_db?cas=11285  
false

第一次更改成功了,第二次更改未成功,查看一下当前key的值!

[root@test3 nameservice]# curl 10.9.8.25:8500/v1/kv/stock/db/deal_db?raw 
{"user":"dealuser","host":"10.9.3.2","password":"1234qwer","db":"dealdb","port":"3309"}
  • 删除一个key值
    删除使用delete方法,一个简单的实例如下:
[root@test3 nameservice]# curl 10.9.8.25:8500/v1/kv/?keys
["stock/db/deal_db","stock/db/kline_info","wm/memory/redis_info"]
[root@test3 nameservice]# curl -X DELETE 10.9.8.25:8500/v1/kv/stock/db/deal_db
true
[root@test3 nameservice]# curl 10.9.8.25:8500/v1/kv/?keys
["stock/db/kline_info","wm/memory/redis_info"][root@test3 nameservice]# 

这里只是纯粹介绍了consul的基本简单的用法,有关consul的内部通信,以及agent与server之间的通信方式,consul如何保持一致性都没有说明,希望有个抛砖引玉的作用吧。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值