Consul之:key/value存儲
key/value作用
- 動態修改配置文件
- 支持服務協同
- 建立leader選舉
- 提供服務發現
- 集成健康檢查
除了提供服務發現和綜合健康檢查,Consul還提供了一個易於使用的鍵/值存儲。這可以用來保存動態配置,協助服務協調,建立領導人選舉,並啟用其他開發人員可以想構建的任何其他內容。
有兩種方法可以使用:通過HTTP API和通過CLI API。
一、使用CLI API操作key/value
1、consul kv get 查詢
D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv get redis/config/minconns Error! No key exists at: redis/config/minconns
你將看到沒有結果返回,由於KV存儲中沒有該鍵返回了一個錯誤,接下來我們將插入或”put”一個值到KV存儲中。
2、consul kv put增加key/value
D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv put redis/config/minconns 1 Success! Data written to: redis/config/minconns
現在再次查詢該鍵你將看到如下結果:
D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv get redis/config/minconns 1
Consul保留額外的元數據在該字段,你可以使用-detailed標志檢索詳細信息:
D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv get -detailed redis/config/minconns CreateIndex 74 Flags 0 Key redis/config/minconns LockIndex 0 ModifyIndex 74 Session - Value 1
在web UI上可以看到用CLI API創建的key
在web UI上創建一個“duan”的key:
再通過CLI API查詢結果:
設置值的時候,還可以使用-flags標志
- -flags=<uint>
Unsigned integer value to assign to this key-value pair. This value is not read by Consul, so clients can use this value however makes sense for their use case. The default value is 0 (no flags).
flags用來做客戶端自定義標志,consul並不使用它,你可以在你自己的程序中隨便定義
D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv put -flags=42 redis/config/users/admin abcd1234 Success! Data written to: redis/config/users/admin
設置flag值為42,想設置成什么就設置成什么.所有的鍵都支持設置一個64位的整型值。
3、consul kv get -recurse 列表查詢
使用-recurse選項可以列出KV存儲中所有keys,返回的結果將按照字母排序。
D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv get -recurse redis/config/minconns:1 redis/config/users/admin:abcd1234
4、consul kv delete刪除
使用delete命令刪除KV存儲中指定的key。
D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv delete redis/config/minconns Success! Deleted key: redis/config/minconns
還可以使用recurse選項遞歸選項刪除含某個前綴的所有keys:
D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv delete -recurse redis Success! Deleted keys with prefix: redis
如果要更新一個存在鍵的值,可以put一個新值在同樣的路徑上。
D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv put foo bar Success! Data written to: foo D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv get foo bar D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv put foo zip Success! Data written to: foo
Consul可以使用Check_And_Set提供原子鍵更新操作。執行CAS操作時需指定-cas標志。至於什么是CAS,請自行百度吧
- -modify-index=<uint>
Unsigned integer representing the ModifyIndex of the key. This is used in combination with the -cas flag.
首先查詢foo這個key的詳細信息
D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv get -detailed foo CreateIndex 131 Flags 0 Key foo LockIndex 0 ModifyIndex 133 Session - Value zip
看到foo的索引編號ModifyIndex是133。然后使用CAS操作的方式來修改它
D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv put -cas -modify-index=133 foo bar Success! Data written to: foo
修改成功,再查詢
D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv get -detailed foo CreateIndex 131 Flags 0 Key foo LockIndex 0 ModifyIndex 141 Session - Value bar
ModifyIndex變成141了。依然使用上面那個修改命令試試
D:\soft\worksoft\consul_1.0.6_windows_amd64>consul kv put -cas -modify-index=133 foo bar Error! Did not write to foo: CAS failed
失敗了。原因是第一次CAS操作成功,因為ModifyIndex的值是141,我們輸入的也是-modify-index=133。
第二次操作失敗,ModifyIndex已經變成141了,我們還用-modify-index=133,Check_And_SetS中的Check這步就失敗了,不會再Set了。
二、使用http API操作key/value
2.1、查看全部key/value http://127.0.0.1:8500/v1/kv/?recurse
說明:
- 使用?recurse參數來指定查看多個KV
- 沒有值--404
2.2、添加key/value
說明:flags--用於為任意一個KV添加一個有意義的metadata。
注意:上邊的這個就是有問題的,一定要注意是flags而非flag。
2.3、查看單個key/value
說明:value是test的base64編碼(使用base64編碼是為了允許非UTF-8的字符)
2.4、修改key/value
cas的值如果與ModifyIndex相等,則修改成功,若不相等,則修改失敗。
2.5、刪除key/value
2.5.1、刪除單一KV
2.5.2、刪除一定范圍的KV(指定前綴范圍內的KV)
說明:
- 指定刪除的KV的K的前綴(zjg)
- 多個操作一定要有?recurse參數
三、使用Consul 的key/value存儲替換config server
由於consul自帶kv存儲,完全可以取代config server。
步驟如下:
一、先添加jar依賴
//compile 'org.springframework.cloud:spring-cloud-starter-config' compile 'org.springframework.cloud:spring-cloud-starter-consul-config'
之前config server的依賴去掉,換成consul-config的依賴即可。
二、修改bootstrap.yml文件
1 spring: 2 ... 3 cloud: 4 consul: 5 host: 127.0.0.1 6 port: 8500 7 discovery: 8 tags: version=1.0,author=yjmyzz 9 healthCheckPath: /info.json 10 healthCheckInterval: 5s 11 instanceId: ${spring.application.name}:${spring.cloud.client.ipAddress} 12 enabled: true 13 config: 14 enabled: true 15 format: YAML 16 prefix: config 17 defaultContext: application 18 profileSeparator: ',' 19 data-key: data 20 # config: 21 # label: dev 22 # discovery: 23 # enabled: true 24 # service-id: my-config-server 25 # fail-fast: true 26 # retry: 27 # max-interval: 1500 28 # max-attempts: 5 29 # multiplier: 1.2
關鍵是13-19行,解釋一下:
15行 format:YAML 表示consul中的key-value中的value內容,采用YAML格式
16行 prefix: config 表示consul用於存儲配置的文件夾根目錄名為config
17行 defaultContext: application 表示配置文件對應的應用名稱(eg: 你的服務如果打算取名為myApp,則這里的application就要換成myApp)
18行 profileSeparator: ',' 表示如果有多個profile(eg: 開發環境dev,測試環境test...) ,則key名中的profile與defaultContext之間,用什么分隔符來表示(這里有點費解,后面還會詳細解釋)
19行 data-key: data 表示最后一層節點的key值名稱,一般默認為data
三、consul中創建kv配置節點
很多文章,包括官方文檔這一步都講得不明不白,關鍵是 節點名稱的命名規則,要與bootstrap.yml中的配置一樣,比如我們要創建一個test環境的配置,key名可以取為:
config/application,test/data
這里每一個部分,都要與上一步bootstrap.yml中的一致,上圖中5個剪頭所指,大家結合上一步中15-19行的解釋體會一下。
然后Value值的部分,把配置內容按yml格式填進去就行:
tips: 平時開發時,一般使用consul dev模式,開發模式下kv存儲不會持久化存儲,全在內存中(重啟consul就丟了!),所以一般建議yml配置文件內容,在項目中單獨存一個文件,啟動調試時,直接把配置文件內容貼到Value框里即可。
好了,現在你可以試着啟動下,順利的話,應該就可以了,是不是很簡單,關鍵還省掉了config server的部署,幫公司省了機器,別忘了讓領導給你加績效哦^_^
如果希望用代碼的方式來讀/寫 KV存儲,可以用下面的方式:
讀:
curl http://localhost:8500/v1/kv/config/application,dev/data?raw=true