# 为提供服务发现和健康检测,Consul提供了易于使用的键值存储
# 可被用于存储动态配置信息、帮助服务协作、建构Leader选举机制、及开发者可以想到的建构任何其它的东西 ...
注册键值信息
# 先验证KV存储内是否有键,若无则返回404(递归recurse)
[root@node1 ~]# curl -s http://localhost:8500/v1/kv/?recurse
# 先用PUT方法存储一些键值
[root@node1 ~]# curl -X PUT -d 'test1' http://localhost:8500/v1/kv/key1
[root@node1 ~]# curl -X PUT -d 'test2' http://localhost:8500/v1/kv/key2
[root@node1 ~]# curl -X PUT -d 'test3' http://localhost:8500/v1/kv/web/key1?flags=42
# flags是键的标记(为64位整型数字,可被客户端用来做元数据)此处对键"web/key1"为其设置了"42"的自定义标记....
# 也可使用命令行方式注册
[root@node1 ~]# echo "5" | consul kv put redis/config/password -
[root@node1 ~]# consul kv put redis/config/password @password.txt
[root@node1 ~]# consul kv put redis/config/connections 5
# Success! Data written to: redis/config/connections
# 获取数据
[root@node1 ~]# consul kv get [-detailed|-recurse] redis/config/connections
5
# 获取详情
[root@node1 ~]# consul kv get -detailed redis/config/connections
# CreateIndex 336
# Flags 0
# Key redis/config/connections
# LockIndex 0
# ModifyIndex 336
# Session -
# Value 5
# 删除数据
[root@node1 ~]# consul kv delete [-recurse|not-a-real-key] redis/config/connections
# Success! Data deleted at key: redis/config/connections
# 导出tree结构
[root@node1 ~]# consul kv export vault/
# JSON output
查询键值信息
# 查询所有键值信息 (使用 recurse 参数发出递归请求)
[root@node2 ~]# curl -s http://node1:8500/v1/kv/?recurse | python -m json.tool
[
{
"CreateIndex": 1721,
"Flags": 0,
"Key": "key1", # 键
"LockIndex": 0,
"ModifyIndex": 1721,
"Value": "dGVzdDE=" # 值(值的返回是base64的编码,其允许非UTF8字符集)
},
{
"CreateIndex": 1723,
"Flags": 0,
"Key": "key2", # 键
"LockIndex": 0,
"ModifyIndex": 1723,
"Value": "dGVzdDI=" # 值
},
{
"CreateIndex": 1729,
"Flags": 42, # flag信息...(此标记不由Consul使用,它可被用于存储任意键值对的元数据信息)
"Key": "web/key1", # 键
"LockIndex": 0,
"ModifyIndex": 1729,
"Value": "dGVzdDM=" # 值
}
]
# 查询指定键值信息...
[root@node2 ~]# curl -s http://localhost:8500/v1/kv/web/key1 | python -m json.tool
[
{
"CreateIndex": 1729,
"Flags": 42,
"Key": "web/key1",
"LockIndex": 0,
"ModifyIndex": 1729,
"Value": "dGVzdDM="
}
]
# ---------------------------------------------
# 也可使用consul的命令行方式查询
[root@node1 ~]# consul kv get web/key1
# newval
# 查询所有键值对信息
[root@node1 ~]# consul kv get -recurse
# key1:test1
# key2:test2
# my_key:666
# web/key1:newval
删除键值信息
[root@node2 ~]# curl -X DELETE http://localhost:8500/v1/kv/web/key1?recurse # 使用DELETE方法即可
[root@node2 ~]# cus http://localhost:8500/v1/kv/web/key1 | python -m json.tool # 再次查询即不存在
# No JSON object could be decoded
修改键值信息
# 使用PUT请求相同的URI并提供不同的消息体即可修改指定键,Consul提供了检测并设置的操作且操作是原子的......
# 通过在GET中提供 ?cas= 参数并及指定最新的 ModifyIndex 值就可以得到原子操作
# 假设想要更新"web/key1"
[root@node2 ~]# curl -s http://localhost:8500/v1/kv/web/key1 | python -m json.tool
[
{
"CreateIndex": 1841,
"Flags": 0,
"Key": "web/key1",
"LockIndex": 0,
"ModifyIndex": 1841, # ModifyIndex的值为1841
"Value": "bmV3dmFs"
}
]
[root@node2 ~]# curl -X PUT -d 'newval' http://localhost:8500/v1/kv/web/key1?cas=1841
true
[root@node2 ~]# curl -X PUT -d 'newval' http://localhost:8500/v1/kv/web/key1?cas=1841
false
#这里,第1个CAS更新成功是因为最新的 ModifyIndex 是1841,而第二个操作失败因为最新的 ModifyIndex 不再是此值
#--------------------------------------------------------------------------------------------------------
#通过提供"?index=",即可请求等待直到键包含一个大于20000的 ModifyIndex 的值
#并且由于"?wait=",限制了查询最多等待5秒则超时后会返回当前没有修改的值
#该操作可高效地等待键的更新。另外相同的方法可用于等待一个键的集合,直到键集合中任何一个键发生更新...
[root@node2 ~]# curl -s "http://localhost:8500/v1/kv/web/key1?index=20000&wait=3s" | python -m json.tool
[
{
"CreateIndex": 1841,
"Flags": 0,
"Key": "web/key1",
"LockIndex": 0,
"ModifyIndex": 1858,
"Value": "bmV3dmFs"
}
]