搜尋

搜尋結果

Swarm mode 上線 5 - load balancer | 還有那些事該考量?
科技新知
MacauYeah・2024-11-18

前面介紹了 ingress network ,亦介紹了 proxy gateway 。能做到的基本都做到了,再來就是考量安全性的問題。因為加了 proxy gateway ,前述的例子是所有 service ,都放在同一個 yaml 檔中。好處是,所有相關的東西存放在同一個檔中, gateway ,背後的 service 都一眼看到。但壞處就是有其中一個 service 更新,都要改那個 yaml 檔。更大的問題是, stack deploy 的指令,不單只更新其中一個 service ,就連其他 service 都會自動取得最新 image 而 redeploy 。 對於一個緊密的系統來講,同步更新可能不是大問題。但對於一些預定排程發佈的系統可不能這樣因為副作用而更新了。如果你也有這樣的分開管理需求,可以參考下面做法,把 gateway service 及 upstream service 放在不同的檔案中,然後經過 external network把所有 service 串連起來。 # nginx-stack.yaml, docker stack deploy -c nginx-stack.yaml nginx services: http-gateway: image: http-gateway ports: - 8080:8080 deploy: replicas: 1 update_config: delay: 10s restart_policy: condition: on-failure # manager-stack.yaml services: managerhttp: image: bretfisher/httpenv networks: - nginx_default - default deploy: replicas: 3 update_config: delay: 10s restart_policy: condition: on-failure placement: constraints: - node.labels.zone==manager networks: nginx_default: external: true # dmz-stack.yaml services: dmzhttp: image: bretfisher/httpenv networks: - nginx_default - default deploy: replicas: 2 update_config: delay: 10s restart_policy: condition: on-failure placement: constraints: - node.labels.zone==dmz networks: nginx_default: external: true 這樣,不同 service 的維護人員,就可以獨自控制自己的檔案。在第一次發佈時,確認 nginx-stack.yaml 先行發佈就可以了。對應的發佈指令是docker stack deploy -c nginx-stack.yaml nginx,它會自動産生一個 nginx_default (即 stack名字_default )的網絡。之後其他service,就可以經networks的設定找到它了。 services: YOUR_SERVICE: networks: - nginx_default - default networks: nginx_default: external: true 上述即使分離檔案,在安全性考量時還是有一個問題,就是 ingress network 的問題。試想一下,dmzhttp (Demilitarized Zone)原本被設定的原因,就是想限制某些訪問只能一些可以公開的服務。但因為經過 ingress network 之後,它們會在所有機器上開放這些 port。那就是,以下面的例子來講,若 dmzhttp 是公開的服務, intrahttp 是內部服務,即使用 intrahttp 使用不同的port 8889。但一經 swarm mode 預設的 ingress network ,在node.labels.zone==dmz的那些節點,還是可以訪問到 intrahttp 。 services: dmzhttp: image: bretfisher/httpenv ports: - 8888:8888 deploy: replicas: 2 update_config: delay: 10s restart_policy: condition: on-failure placement: constraints: - node.labels.zone==dmz intrahttp: image: bretfisher/httpenv ports: - 8889:8888 deploy: replicas: 3 update_config: delay: 10s restart_policy: condition: on-failure placement: constraints: - node.labels.zone==intra 我們前述介紹的 proxy gateway ,其實已經有一定程度可以解決這個問題。因為 proxy gateway 是根據 http 協定中的 host header 去做分流。在邊界網絡進來的「合法」訪問,道理上會好好地經引導到我們的 dmzhttp 。不過網路的邪惡可容小看, proxy gateway 也會有被騙的一日。有特定能力的攻擊者,只需找到目標域名,還是可以接觸到 intrahttp 。 若要做進一步隔離,在這種情況下,我們可以在 dmz , intra 機器中各設定一套 swarm ,完全獨立,這是最安全的做法。但這樣做的管理成本就會變高,因為兩個網段都會有自己的 manager 節點,而且在 dmz 網段的 manager 節點也有被攻擊的可能。 若我們回到單一 swarm 的方向,可以修改各個 service 中的 port 和 deploy 。利用 post mode 中的「host」,配合 deploy mode 中的「global」,完全跳開 ingress network。 services: dmzhttp: image: nginx ports: - target: 80 published: 8888 mode: host deploy: mode: global update_config: delay: 1s restart_policy: condition: any placement: constraints: - node.labels.zone==dmz intrahttp: image: bretfisher/httpenv ports: - target: 8888 published: 8888 mode: host deploy: mode: global update_config: delay: 10s restart_policy: condition: on-failure placement: constraints: - node.labels.zone==intra 上面的例子中, dmzhttp 會在所有 dmz 的機器中,每個節點只運行一份服務,而且直接使用該機的 8888 port ,外面不會再有 ingress network 的 存在。同樣地,intrahttp 會在 intra 的所有節點,運行一份服務,佔用它們的8888 。這兩個服務,即使使用一個 port ,swarm 也不會說有任何問題。因為它們不會經 ingress network 搶佔其他人的 8888。 可能會有讀者問,如果 host mode 這麼安全,為什麼預設會是 ingress network,那我們就要先了理清 ingress network 與 host mode 有有什麼分別?假設我們只運行一個service,它佔用8888。 功能ingress modehost mode replicas 數 同一個 service replicas 為任意數量,什至比節點的數目多 因為有 port 限制,每個節點最多只能運行一份 Virtual IP Virtual IP 任意在節點中跳轉也可以,因為 ingress 會自動找到對應的 service 所在的節點 Virtual IP必需要與 service 所在節點綁定,其他節點訪問不到 load balance 有 沒有 host mode 就像我們傳統在各自的節點上自行佈署自己的程序,各個節點只有一份。所以不會有自動 load balance 的效果,如果客戶端訪問固定的IP,就會得到是固定的接器接受請求。我們有需要,就要在前面加一個 Proxy Gateway (或 HA proxy )。 Virtual IP 也一樣, host mode 下需要好好地自動跟著 service 的生命期,不過幸運的是, Docker 預設己經有自動重啟 service 功能,即前文中的 restart_policy ,它在 host mode 下也適用。如果大家有配合 deploy 中的 global mode , Virtual IP 的並沒有實際變動。但如果沒有 global mode ,就要再想想辦法了。 最後考慮 load balance 的問題,如果進入點的 service 的真的不太消耗資源,沒有 load balance 也是可以的 ,但若超負荷,就必需要自建 proxy gateway 。經過進入點後,若我有背後的 service 就沒有所謂的 ingress 和 host mode 選擇。

KLOOK 福鼠迎新春優惠碼,最高減HKD168!
激安優惠
OHChance 旅遊誌・2020-01-14

下載 OHChance 手機 APP, 特價資訊直送你手!   Klook 推出新ge 優惠碼,一張單滿1688可減168(優惠碼 “LUCKY168″)、滿1088減88(優惠碼 “LUCKY88″),新註冊用戶仲可以享88折優惠(優惠碼 “NEWYEAR88″)!推薦使用來買美國的迪士尼、環球影城,以及歐洲地區的火車票最划算(不過現在瑞士火車證也不能用code了 so sad)!另外日本的主題樂園及JR列車就不能用。 優惠碼使用方法是只需在付款時輸入即可,每個優惠碼每位用戶可用一次。產品使用時間沒有限制。  小tips:如果發現使用優惠碼時說你所在地區不能用這個優惠碼,可能是klook 誤判了你的位置,你可以嘗試:1) 看看klook 的帳戶是否設定了正確的地區,注意電話號碼也需要澳門/香港地區方可使用此優惠碼;2)你的ip 可能是鄰近地區或被誤認,如果是家裡,可以重開一下上網的路由器讓它重新取一個IP,又或是手機轉用行動上網試試。  【促銷公司】Klook【折扣代碼】LUCKY168(滿1688減168)      LUCKY88(滿1088減88)      NEWYEAR88(新用戶打88折)【預訂時限】2月2日23:59前使用【預訂方式】Klook APP 或網頁【預訂網址】https://ohchance.info/ref/klook   [價錢 Sample – 使用 LUCKY168 優惠碼] === 想搵平機票去玩,即上 OH!Chance!澳燦旅行資訊 https://ohchance.info/ 去日本旅行買咩 JR Pass好?即上 OH!Note!小燦的旅行筆記做功課 https://ohnote.info/ 唔知間航空公司好唔好坐?馬上 Subscribe OH Chance Youtube 睇睇佢:https://youtube.com/c/OHChanceTravel 睇埋 Facebook 專頁 https://fb.com/ohchance 第一時間獲得最新旅遊資訊!

土耳其航空葡國航點優惠,香港出發來回連稅HKD4,131起!
激安優惠
OHChance 旅遊誌・2018-09-14

土耳其航空呢排在澳門的巴士、手機app 等賣了一堆廣告,事實上是關於一個香港出發的葡國航點優惠,以價錢論是相當不錯的。搵過似乎真係得葡國航點有平,其他歐洲航點都無優惠。至於大假期像聖誕新年復活節等,踩正就唔見有平。 土耳其航空官網沒有港幣計價,所以可以上zuji 等機票預訂網站訂飛,價格計過也較官網平dd。  《優惠價錢(來回連稅)》 *里斯本:HKD4,159*波圖:HKD4,131 (註:以上價錢為香港出發來回價,各航點均需經伊斯坦堡轉機。)  《出發日期及最長停留》.出發日期:11月1日至2019年6月30日.最長停留:1個月  《購票日期及方法》.購票日期:9月20日23:59前預訂.預訂方法:至ZUJI HK.預訂網址:https://ohchance.info/ref/zujihk  【輔助訊息】.本優惠可以不同點來回;.土耳其航空票價已包機上餐飲及30KG托運行李額;.土耳其航空可以乘搭機場船直接由澳門到香港機場海天客運碼頭 check-in 並獲退HKD120 香港離境稅。  附註:上述最低價錢為航空公司公告之最優惠價格,或本站能找到的最低價格;每一航班有否優惠票價及所存票量由航空公司決定,優惠票量有限售完即止。  [價錢 Sample – 香港經伊斯坦堡飛里斯本來回連稅HKD4,159] ===== 想搵平機票去玩,即上 OH!Chance!澳燦旅行資訊 https://ohchance.info/ 去日本旅行買咩 JR Pass好?即上 OH!Note!小燦的旅行筆記做功課 https://ohnote.info/ 唔知間航空公司好唔好坐?馬上 Subscribe OH Chance Youtube 睇睇佢:https://youtube.com/c/OHChanceTravel 睇埋 Facebook 專頁 https://fb.com/ohchance 第一時間獲得最新旅遊資訊!

【家百科】舊床單可以用來做甚麼?將它來個大改造吧!
創意生活
Chrysalids 少爺・2017-08-19

每樣物件都會有固定的使用壽命,當過了使用壽命時候會如何處置?棄置是大多數朋友的做法,其實,只要好好利用,每樣不起眼的物件都可以大有用途,床單就是很好的例子,以下裝修佬教大家床單的另類用途及做法。 先準備好剪刀、針線,將床單裁剪成合適大小,用衫鈕,亦能當作裝飾物縫上去,一個舊床單收納袋就完成了,亂七八糟的遙控器和各種雜物,瞬間解決淩亂,恢復整潔,縫得大的話,還可以專門做雜物收納 。 枱墊 將床單裁剪成相同的六邊形,在內部塞入同樣大小的硬紙板,然後七個一組疊在一起縫好,根據自己的喜好來把它們拼起來,想要長一點的話,也可以接著往下拼,各種花色瞬間增強特色。 靠墊 純棉的床單不僅透氣性好,手感也舒適柔軟,將有花紋的床單做成靠墊,往睡房、客廳放幾個瞬間就能提升整個家居藝術氣息。 吊椅 文藝小清新必備的吊椅,用家裡的舊床單就能可以做出來,先準備好繩、掛鉤和打孔器,再將床單裁剪成梯形然後縫成雙層,兩側留出穿繩的洞口,用打孔器在房頂上固定好掛鉤(一定要非常牢固),最後將繩穿過床單和掛鉤一張文藝氣息滿滿的吊椅就完成 。 以上文章及圖片均轉載自網路,所有版權歸原作者所有 原文地址:http://yes-news.com/

6月, 是失落的一周, 還是冒起的一周?
玄學星相
熊神進・2016-06-11

6月13日至6月19日 鼠: 明眼人都知道你是有心事, 而你不想太多朋友擔心你, 你才裝逼, 星相學家善心提提你, 愛情不是你生命中的全部, 反而你在本周要冷靜一下, 最好不要喝酒, 留在家中休息。財運也非常反復, 真的不宜炒股, 建議多投資一些固定資產, 例如買房子, 至於定期儲蓄也是一個好方法。幸運顏色是黑色, 不宜穿紅衣服。 牛: 屬牛的少女,今個星期感情複雜多變,慎防多情反被多情誤。有的時候, 已婚婦女很想丈夫多愛自己, 但又不懂表達, 常常用了錯誤方式來維繫。不論男士或女士、可以佩帶黃金指環或白金手鏈、茶色眼鏡框、黃色皮帶等等。有關金錢的招財方法, 說起來也很簡單, 就是佩帶招財吊墜。 虎:健康情況良好,但也得多注意飲食習慣,特別在夏季日子。在玄理上, 消極屬於負面情緒, 屬虎的少女,今個星期感情複雜多變,慎防多情反被多情誤。炎熱夏天, 游泳是消暑的活動, 由於虎沖太歲, 午月屬火, 火力很旺, 虎有水險(遇溺的人都是運氣差), 最好的化解方法就是佩帶“煙晶化負能量手鏈”。 兔:   《五言獨步》有雲:進氣退氣,命物相爭,進氣不死,退氣不生。這一周生肖兔的運勢忽上忽下,時見反復而難以把控,工作上順逆均有些出乎預料,因此宜謹守本心,不要過於張揚,尤其注意言行。財運稍有下降,不可操之過急。情感平順,或有結識異性知己的機會。 龍: 今個星期健康方面並無大礙,只要注意飲食,不暴飲暴食,男性朋友少抽煙、喝酒,就可平安度過一年。偶爾的傷寒感冒,只要及時吃點藥就可痊癒。工作上會有一個好的開始,此時要注意不驕不躁,特別要與人親近。財運亨通,做好拓展計畫。異性緣不錯,已有感情務必遠離爛桃花。 蛇: 工作上易遭同事排擠,導致情緒低落,所以必須廣結善緣,和上下級搞好關係。感情上若即若離,令你失去方向。不妨將問題提出來,和資深的朋友探討一下,再者注意門戶家居安全。由於整體火旺,需要注意身體健康,閒暇之餘要注意多鍛煉,提高身體素質,面對危機,才能輕鬆度過。 馬: 本周生肖馬在經過白虎星折騰之後並非一切順利,會時有阻礙出現,工作上要注意保持低調收斂,尤其注意不要於是著急上火,易引發危機。錢財易泄,需小心理財。異性緣分低沉,已婚者勿與伴侶口角爭執。趁著工作稍微清閒了,多陪陪家人,自己也休息緩衝一下,鍛煉下身體,旅遊放鬆下身心,是不錯的選擇。 羊: 是非不算嚴重,但由於被白虎星克,建議佩帶金剛斧直至2018年6月, 同時要學會忍讓,但如果別人真的對你不滿,也會當面說清楚,很少有人在背後惡意傷害你。錢財開支依然不小,注意控制。桃花難現,已有感情易受外界影響。工作方面比較鬱悶,繁重的任務無法按時完成,讓自己倍感沮喪。 猴: 這一周生肖猴的運勢平平,因此在年後宜低調起步,以平穩為主,工作上不要太過出頭,以保守為好,待認清形勢做好準備再做打算。財運平平,理應收減開支。桃花難現,已有感情有小矛盾須妥善處理。星期六情緒較低落,無法靜下心來投入工作,其實這天的工作很重要,應學會調整和放鬆心情。 雞: 愛情上容易因為自己對異性的態度而引起另一半的誤會,感情會有波動。尤其是1981年屬雞的人事業運是特別旺盛,應該多做大膽的嘗試會有意外的回贈。危險藏于美麗的外表下,工作事事如意,但節節勝利背後有不穩定因素,勿忽視任何細小環節。“終生相愛姻緣吊墜”意念很好, 可以長時間佩帶。 狗: 打工一族今個星期也是幸運,事事順心如意,可受到上司賞識重用,更會有升職機會!但凡事小心,防小人!健康方面應多留意眼、鼻、喉等部位的感染性毛病,多注意個人衛生和飲食習慣,防有腸胃毛病,切記少飲酒。全個星期防“病從口入、禍從口出”。易與伴侶產生口舌之爭,須多些隱忍。 豬: 感情上會有一些新的機會,所以今個星期一定要多去結識一些新的朋友和新的夥伴。身旁有貴人出現,在一些投資機會上,他們會給你合理化的建議,甚至會在資金上給予幫助。身體方面,不小心磕到碰到會造成不小的損傷,不管在家或是出門都應多注意腳下才好。幸運顏色是白色, 佩帶人緣果增加朋友運。 如有任何問題,歡迎聯絡: 林小姐: 13726267799(晚8時後) 熊神進:澳門 853-66618785 Facebook: 熊神進(澳門風水師) 公共微信: macaumasterxiong 淘寶風水法器店:http://macauhung.taobao.com

台灣虎航 TigerWow 促銷,澳門-台灣來回連稅HKD723起!
激安優惠
OHChance 旅遊誌・2019-04-02

台灣虎航推出 TigerWow 促銷,今次賣7月底前出發,雖然今次價格一般,但搵過7月都有平就值得看看。 在虎航官網購買會收HKD130預訂費,如果在飛豬Trip.com等網上預訂機票預訂網站購買就不會收,但有些要注意的地方:.在網上預訂網站買一樣可以利用預訂編號去返官網加行李,但有些商家(有時機票不是飛豬Trip.com等自家賣給你,而是掛在上面的一些旅行社)可能會不給預訂編號你,迫你透過佢地買來賺差價(不是常態);如是者可以向飛豬trip.com 等投訴來獲取預訂編號,但這樣可能需要花一些時間,所以是近期要去且有行李需求的,就會建議去台灣虎航官網購買。 .不論在官網買或是機票預訂網站買,護照資訊都可以利用預訂編號自行上官網更正,詳細方法請參閱:https://ohnote.info/tigerair_manage_booking/ 如果是要在官網購買,提提大家最平的 tigerlight 票價是不包括托運行李,如果有20KG行李需求建議直接買 tigersmart票價,因為tigersmart比tigerlight貴HKD240,即等於買20KG行李價錢,但 tigersmart 還可以免費選位。  《優惠價錢(來回連稅)》 *澳門-台北/台中/高雄:HKD723*台北/台中/高雄-澳門:TWD2,836  #如在官網購買,需另外加上每人HKD130/TWD440預訂服務費。  《出發日期及最長停留》.出發日期:即日起至7月31日.最長停留:不限  《購票日期及方法》.購票日期:4月3日23:59前預訂.預訂方法:台灣虎航官網或機票預訂網站.預訂網址:https://www.tigerairtw.com/zh-tw/ (官網)      https://ohchance.info/ref/tripcom (Trip.com)  【行李資訊】.虎航tigerlight票價只包10KG手提行李額  附註:上述最低價錢為航空公司公告之最優惠價格,或本站能找到的最低價格;每一航班有否優惠票價及所存票量由航空公司決定,優惠票量有限售完即止。  [價錢 Sample - 澳門飛台北來回連稅HKD723] ===== 想搵平機票去玩,即上 OH!Chance!澳燦旅行資訊 https://ohchance.info/ 去日本旅行買咩 JR Pass好?即上 OH!Note!小燦的旅行筆記做功課 https://ohnote.info/ 唔知間航空公司好唔好坐?馬上 Subscribe OH Chance Youtube 睇睇佢:https://youtube.com/c/OHChanceTravel 睇埋 Facebook 專頁 https://fb.com/ohchance 第一時間獲得最新旅遊資訊!

緬甸。仰光 | 遇見是緣分吧。
走遍世界
原來世界這樣大・2019-05-10

到站後,我們一起逛菜市場。在來回的兩小時中,我們一起發掘列車上的趣事,有本地人會在列車上販賣東西,從外地來的我們就像是「發現新大陸」般在研究他們在賣什麼,本地人都太習慣了列車的緩慢,在列車上他們打發時間,而我們二人則靜悄悄地窺他們在做什麼。一個多小時的車程原是無聊的,但有旁人相伴,時間過得很快,一點都不是煎熬。我們在回程時搭錯車,看到列車在駛向相反方向,我們二人在那列車哭笑不得。 去緬甸的旅客手上都有差不多的行程,我到蒲甘後的一天他坐飛機來到蒲甘,過幾天我們又在蒲甘的廟宇相遇了。而我到達曼德勒那天,他也在隔天的黃昏坐郵輪到達曼德勒,我們更是入住同一間Hostel。多番的巧合,在臨別前相約在曼德勒吃晚飯。明明只是認識幾天,感覺就似是認識了很久的朋友,見面都是開心和驚喜的,我們去的景點相似的,但各自遇到不同的人和事,互相分享旅途的點滴是愉快的。 遇見是緣分吧,以前總是有點扭扭擰擰,怕開口跟陌生人說話有點難為情,其實沒有什麼大不了,只是自己放不開,頂多被拒絕,也毋須耿耿於懷。 主動踏出這一步換來的是認識新朋友、彼此結伴的機會,也許令你這段旅程更美好,不美好的也是一種體驗。即使旅途的事情並不如意,有人與你一起分擔的也讓日子沒那麼難捱。 (原來我沒有跟這位瑞典朋友拍個照,算吧,旅途從來都不是為拍攝一張好照片而活!)

澳門十六浦度假村呈獻:索菲特法國音樂會
音樂聯合國
LifeMag Editor・2017-06-17

法國自1982年起每逢6月都會慶祝「夏至音樂節」(Fête de la Musique),當日法國所有城市的大街小巷都沉醉在音樂節的歡騰氣氛中。夏至音樂節起源於一位在法國電台工作的美國音樂家約艾爾•科恩的構想,他提出在一年中日照最長的這天由不同的表演團體共同舉行音樂狂歡節。時至今日,法國音樂節已經被全世界許多國家接納,每年在五大洲120 個國家舉行。有見及此,澳門十六浦度假村亦與澳門十六浦索菲特酒店聯手於6月23日呈獻「索菲特法國音樂會」。 今年的法國音樂會,於澳門十六浦戶外廣場的青蔥舞台拉開序幕,先由極具歐陸風情的本地手風琴師及本地青年樂手於午後為您演奏最適合炎炎夏日的音樂。隨後,海風餐廳露天平台將上演Claret Apéro Chic 品酒音樂會。 夜幕琴音將延續整夜,相伴的美食佳餚包括來自法國及南澳大利亞州的美酒、肉質鮮甜的牛肋骨、烤全羊等,以及令人垂涎的法式小食。伴著柔柔的海風,想享受法式美饌、音樂及度過一個美好輕鬆的週五夜,別無他選。 索菲特法國音樂會Sofitel Fête de la Musique 2017 日期:2017年6月23日(星期五) 時間:下午4時 地點:澳門十六浦戶外廣場 費用:全免 表演嘉賓: Fai 本地手風琴音樂家,擅長不同國家的音樂,特別是葡國音樂,曾於澳門國際藝術節與楊琴合作,中西合壁演出亦獲多個組織邀請演出,宣揚澳門旅遊業。目前積極推廣手風琴及葡式音樂,為澳門旅遊城市出一分力。 澳門區草地音樂會 09年4月成立的音樂愛好者交流組織。以Free,Fresh,Friends為宗旨,讓不同身份、種族、信仰的人通過音樂聚在一起,通過音樂結識好友。獲多個團體邀請演出。 Claret Apéro Chic 品酒音樂會 日期:2017年6月23日(星期五) 時間:晚上7時-10時 地點:澳門十六浦索菲特酒店    六樓海風餐廳露天平台 費用:MOP198/人 預訂:(853) 8861 7213 表演嘉賓: 主唱 ─Amanda 擁有多年豐富的演唱經驗,包括爵士樂、不插電及街頭音樂等,曾於多個澳門酒店演出。 結他手 ─ 張家豪 有二十多年制作及演出經驗,除了歌曲制作外,作為獨當一面的結他手,張家豪多次被邀演出,曾為恭碩良、Soler等藝人之音樂會伴奏。 電子鍵琴手 ─ 鄧榮臻 逾百場演出經驗的鋼琴/電子鍵琴手,師從本澳資深爵士鋼琴手Tony Abelardo及葡萄牙著名爵士大師Ze Edurado。演出經驗逾十年,如澳門國際音樂節、爵士周演出等。

Spring Boot 08 - 多情境設置 maven profile 與 application.properties
科技新知
MacauYeah・2025-02-25

為何要有不同的建構 Profile Profile這一字,很難在IT技術文章中翻譯,它在Spring boot中的語意大概就是一個設定一個固定的運行環境參數合。例如我們做開發時,有些只想在開發環境中出現的設定,諸如測試用的資料庫、細緻一點的LOG層級,都寫在dev profile中。當換成正式環境時,我們也有一套全新的配置,而且會集中寫在prod profile中。把這些參數設定從程式碼邏輯中抽離,可以讓你的程式碼簡潔很多,也方便對比不同環境的設定。 application.properties Spring Boot (Spring Boot Starter) 就提供了 Profile 管理。我們可以為一個Spring Boot 模組設定多個不同的 application.properties src/main/resources/application.properties 為預設 (default profile) src/main/resources/application-uat.properties 為驗收環境專用 src/main/resources/application-prod.properties 為投產環境專用 src/main/resources/application-test.properties 為自動測試專用 在執行程式時,我們只要動改變啟動的參數spring.profiles.active,例如 mvn spring-boot:run -Dspring-boot.run.arguments="--spring.profiles.active=uat" # or mvn package && java -jar target/YOUR_JAR_NAME --spring.profiles.active=uat Spring Boot 就會指定載入 application-uat.properties 的內容,如果有些值沒有定義,它會再追溯到預設的 application.properties中。 在運行中改變啟動參數的情況可能不多,筆者更常用的情況是在編譯期間產生多個 Jar 檔,不同 Jar 檔指定不同的環境,方便系統管理員取用測試。想做到這個效果,我們需要在 application.properties 中,我們還需要加入一句spring.profiles.active=@active.profile@,並在編譯工具中加入這個變量,例如筆者常用的 maven pom.xml 中,就會有這一串設定 它在 maven clean compile package 時,就已經可以在JAR中填入固定spring.profiles.active。那麼每次執行時,都會是指定的profile。 mvn package -Puat java -jar target/YOUR_JAR_NAME 在這個例子中,JAR 中的 spring.profiles.active 就會固定是uat,我們不需要在啟動參數中加入字眼。 如果大家不會碰到混合Profile的話,其實上述的資訊已經足夠大家應付很多情境。 但當大家有追求,需要寫自動測試,有機會不同自動測試需要啟用不同的 Profile ,更有可能出現混合Profile的情況,這件事就變得很複雜。我們需要繼續深入了解一下 Spring Boot 的覆蓋機制,下面將會以測試方式導出結論。 如果真的對混合 Profile 沒有太多信心,我們也可以用單一 Profile 重組不同 properties 的方式,自行去模擬混合 Profile ,例如除了dev, uat, test之外,我們可以加入 dev-test, uat-test, default-test 作為驅分。這樣應該可以簡化測試的複雜度,不過 properties 檔案就可能會成幾何級成長。 但在某情特殊情況下,我們不可能簡單地重組 properties 等型式去做測試,例如針對部份uat-test的測試,只有部份可以執行,部份不可以,那麼我們還是需要用到混合 Profile ,限定某些測試需要執個某個 profile ,但其餘部份可以動態切換。 有條件的讀者,也可以先行試玩一下混合 profile 的特性,下期筆者再為不同情況作解紹。 混合Profile Source code spring boot profile