我想起這輩子第一次寫程式的時候,直接 hard code 在 .java 裡面,後來進步一點,寫了一個 Param.java 裡面全部放參數,哈哈。
然後 log 也只會 System.out.println("..."),如果有人跟我一樣不要害羞快舉手 XD
其實這兩個本來真的是小事,但他的複雜度隨著現在主流架構的改變上升不少。
那接下來我們分兩個部分來探討這兩個主題,如果你是高手請給我一點指導,如果你是小朋友希望可以指導到你。
今天是上集,我們先來講設定檔。
會不會有人看到J葛就驚呆了,其實如果極少變動的參數或者是核心參數,寫死在原始碼的確是一個作法。
就是透過執行主程式時後面帶進去的參數,許多語言都有這種設計。
傳說中的-D參數,Java 是用 System.getProperty("xxx") 來拿。
環境變數,這個也是多語言通用,通常會跟部屬綁在一起,屆此控制一些相依環境的部份。
短短一個字,代表的來源倒是挺多的。
無論是 classpath 裡頭的檔案,作業系統內絕對路徑或是相對路徑,甚至網路上的資源,可以用URL表示的都算。
版本控管,這個要說的簡單或是要說的難都可以,我們講最簡單的作法。
基本上可以跟上面的 URL 搭配,就是你把設定檔放在 GitHub or GitLab 上透過 URL 去存取。
那這樣你就會得到版控的好處。
Config Server
像是 Spring Config 這種把 Config 管理也當成一個微服務模組在管的。
K8s Config
這個可能就比較少人碰到,有玩 K8s 的人才知道,就是 K8s 叢集內有一個元件是在管這個設定檔的,如果你的應用程式部屬在那上面就能透過 API 吃到。
經典的一個案例,我們參考 Spring 設定檔就好,看看那精美的層級,看看那優美的順序,你是不是想要回頭了阿。
來源神多,而且可以一層層按照優先序覆蓋過去,雖然複雜度上升了,可是彈性真的hen高。
想想一個情境,如果我線上更改 config,我的應用程式能不能吃到這個更新後的值?當然這要細部探討還要分的更細,跟當初系統設計時也有關係。
但主流的 Config 框架多半都有提供一些手法來做這件事。
我進版我又退版,打我阿笨蛋 (方唐鏡表示:)。就是說設定檔也要有版控R,做錯了能舊,還能查歷史抓兇手呢 (笑)
先來澄清一下,沒被提到絕對是小弟我太孤陋寡聞,不是你們不有名R (照樣毆飛),我這邊稍微帶一下我用過或是我喜歡的東東,有興趣的大家也能蕉流蕉流。
其實現在成熟的設定檔函式庫已經很多了,除了我大春天原生的之外,以前寫 Scala 的時候用過 Typesafe 出的 Config,另外 cfg4j 也是功能蠻強的。
那如果是在分散式環境下面用的設定檔這邊也能寫舉幾個,例如:ZooKeeper, Etcd, Spring Config, Central Dogma, K8s Config, ...
好的上集先這樣,下集來講日誌 (揮手掰掰)
About Me
Jian-Min Huang
wide range skill set backend engineer
Research, Architecture, Coding, DB, Ops, Infra.
mainly write Java but also ❤️ Scala, Kotlin and Go