1. 程式人生 > >Consul KV Consul之:key/value儲存

Consul KV Consul之:key/value儲存

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

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