Consul 是一個很實用的網站服務,可以對網站程式做負載平衡,其中一個最特別的功能就是存放設定檔。以往網站在不同的 staging,都會放上不同的設定檔(例如資料庫的 IP),在我以前工作的公司,是利用 build server 產出對應不同 staging 的 zip 檔案,每個 zip 裡的設定檔都不同,雖然這做法解決了不同 staging 的問題,但同時也出現了一個版本要維護多個 zip 檔的問題,更不用說佈署時上錯檔案的可能。

本篇文章會簡單介紹如何架設 Consul 服務以及如果利用它來存放設定檔。

多虧了 Docker 的熱潮,利用 Docker 就可以輕易的架設,首先下載 image 檔:

docker pull consul:1.5.2

本篇文章用的是 1.5.2 版,在下載 image 檔時最好指定版號,這樣測試時跟上 Production 環境時可以確保不會踩到 image 的 bug,因為不指定版號,有可能在不同的 staging 使用到不同版本的 image 檔。

接下來輸入下列指令來產生 container。

docker run -d --name=consul_dev -p 8900:8500 consul:1.5.2

需特別注意的是,這個指令產生出來的 Consul 服務是開發用的,任何的設定都是存在記憶體裡,所以重啟後資料會消失,故不能使用在 Production 環境上。

接下來開啟 Consul 的網站,輸入 http://localhost:8900/ui,就可以看到以下畫面:

接著點進 Key/Value,然後按 Create:

在接下來的畫面,先設定一個資料夾 Config,在輸入 Config 後在結尾加一個 ‘/’,Consul 就會直接視為資料夾:

新增後畫面如下,之後再點擊 Config 資料夾:

然後再新增我們要的設定,這邊名稱為 ‘aaa3’,值為一個 JSON 文件:

設定完成後,在瀏覽器的網址輸入 http://localhost:8900/v1/kv/Config/aaa3後,可以看到下列畫面:

可以看到回傳值是一個 JSON 文件,而 Value 就是 aaa3 底下的值,但這是一個 base64 字串,故需要再寫程式給轉回來。

另外,在 Production 環境中,需啟用的 container 數量會稍多,請參考以下指令:

docker run -d --name=consul_server1 -p 8500:8500 -e CONSUL_BIND_INTERFACE=eth0 consul:1.5.2 agent --server=true --bootstrap-expect=2 --client=0.0.0.0 -ui
docker run -d --name=consul_server2 -e CONSUL_BIND_INTERFACE=eth0 consul:1.5.2 agent --server=true --client=0.0.0.0 --join 172.17.0.2
docker run -d --name=consul_client -e CONSUL_BIND_INTERFACE=eth0 consul:1.5.2 agent --server=false --client=0.0.0.0 --join 172.17.0.2

簡單說明,第一個 container 為可以進入的 ui,第二個 container 為 cluster 裡的其中一個 node,它會加入 consul_server1,最後一個為接收外部 request 的 container,它會將收到的 request 轉給 server (也就是第一或第二個 container)。

參考資料