6.8使用Consul和envconsul來配置外部環境變數

Owen William發表於2020-10-25

 因為我們不想我們的應用去知道任何關於Consul,但是不得不明確連線到Consul。我們可以應用其它的工具去建立和開啟資源通過Hashicorp,稱易 envconsul連線到Consul的服務,使用額外的特殊配置key/value樹,並且暴露它作為環境變數去開啟我們的應用。

  為了使用envconsul,我們需要下載包,可以從這個地方下載:https://github.com/hashicorp/envconsul/releases

6.8.1如何使用

  1. 如果你沒有新增值給my/config/value的key到Consul,讓我們執行這個命令新增:

curl -X PUT -d 'From Consul Config' http://localhost:8500/v1/kv/bookpub/my/config/value

  1. 第一步就是確保envconsul可以連線到Consul服務,和它提取正確的資料在我們的配置key中。讓我們執行簡單的測試命令:envconsul --once --sanitize --upcase --prefix bookpub env   你將會看到:

 …T
ERM=xterm-256color
SHELL=/bin/bash
LANG=en_US.UTF-8
HOME=/Users/<your_user_name>
…M
Y_CONFIG_VALUE=From Consul Config

 

  1. 確保envconsul返回了正確的資料給我們,我們可以使用它去開啟BookPub應用,執行命令是:envconsul --once --sanitize --upcase --prefix bookpub ./gradlew clean bootRun  我們會看到如下輸出資訊:

 2015-05-31 --- ication$$EnhancerBySpringCGLIB$$b123df6a : Value of my.config.value property is: From Consul Config

 

  1. 我們可以通過執行/gradlew clean bootRepackag這個命令來建立可執行的包,執行envconsul --once --sanitize --upcase --prefix bookpub ./build/libs/bookpub-0.0.1-SNAPSHOTexec.jar這個命令來開啟我們的應用。我們可以看到與前面相似的結果。如果你看到Gradle而不是From Consul Config,你要確保applicationDefaultJvmArgs的配置在build.gradle不是Dmy.config.value=Gradle.
  2. 另外一個好的地方是,enconsul不僅僅可 暴露配置的值作為環境變數,也可以監控任何的改變或重啟在Consul應用中的改變。執行這一行命令envconsul --sanitize --upcase --prefix bookpub ./build/libs/bookpub-0.0.1-SNAPSHOT-exec.jar 你會看到如下輸出:

 2015-05-31 --- ication$$EnhancerBySpringCGLIB$$b123df6a : Value of
my.config.value property is: From Consul Config

 

  1. 現在我們使用curl命令去獲取ModifyIndex的值,和更新它的值為From UpdateConsul Config。執行命令:curl

http://localhost:8500/v1/kv/bookpub/my/config/value, grabbing the

ModifyIndex value, and using it to execute curl -X PUT -d 'From UpdatedConsul

Config' http://localhost:8500/v1/kv/bookpub/my/config/value?cas=

<ModifyIndex Value>  你要看到應用的重啟,並且看到如下的輸出:

2015-05-31 --- ication$$EnhancerBySpringCGLIB$$b123df6a : Value of

my.config.value property is: From UpdatedConsul Config

6.8.2使用原理

  我們最先執行這個命令:envconsul --once --sanitize --upcase --prefix bookpub ./gradlew clean bootRun 我們來看一下這個命令是如何起作用。

  1. 首先,你可能意識到沒有明確的說明哪個Consul節點我們需要連線上。這是因為這個暗示或認為你已經有一個Consul代理執行在本地localhost:8500.你也可以通過—consul localhost:8500的命令來新增到命令列中作為指定Consul的例項。
  2. --prefix指定特殊的開啟配置key的分隔為不同的值。當我們新增key到Consul中時,我們可以使用這個key: bookpub/my/config/value 通過使用 –prefix bookpub,我們告訴envconsul去刪除bookpub作為key的部分,並且使用所有內部樹的元素在bookpub去建立環境變數。這個的話,my/config/value成為了環境變數
  3. --sanitize告訴envconsul去取代所有無效的帶的下劃線的特徵。所以,如果我們使用—sanitize,我們最終會以my_config_value作為環境變數。
  4. --upcase是保證所有環境變數都是大寫的,當它於—sanitize結合使用時,我們的環境變數my/config/value會變為MY_CONFIG_VALUE.
  5. --once說明我們僅僅想要外部的kye作為環境變數,不想繼續監控在Consul中的改變,如果我們的先前的tree發生改變時,重新的外部變數將作為環境變數並且重啟應用(注:如果你想監控Consul的改變,你可以移除掉--once)

 

envconsul的監控是非常有用,想一下,你的資料庫連線配置如果改變的話,envconsul將會監聽到並且重啟應用,然後連線到新的連線地址中。

當前這個應用是傳送傳統的SIGTERM訊號到應用中,告訴應用去結束應用並且重啟。有時候,我們並不想要這樣的功能,因為有些應用的啟動要花費大量時間。為了更好的處理這種情況,envcosul提供了一些標準的資訊配置。你可以新增 –kill -signal命令。指定這些資訊取代SIGTERN:SIGHUP,SIGTERM,SIGINT,SIGQUIT,SIGUSR1或SIGUSR2.

相關文章