NodeJS 后端開發09 多環境Profiling優雅根據不同環境自適應
學委好久沒有更新NodeJS專欄,還以為NodeJS冷門,沒想到最近看到幾個讀者留言問怎么優雅的管理多環境的配置,
太忙了,寫篇短文簡單展示一下原理,正好基于前篇 【NodeJS 后端開發 07 MySQL資料庫連接池開發生產應用 】簡單嘗試了mysql庫來連接資料庫,
本篇嘗試一個更加優雅的方式,通過環境變數來控制程式動態加載不同的配置,
這個搞Java的同學最清楚,比如我們開發springboot應用的時候會放置多個application.yml,
然后部署的時候通過環境變數來選擇配置,
這個用NodeJS來做就更加簡單了
NODE_ENV=process.env.NODE_ENV
console.log('NODE_ENV:', NODE_ENV)
直接貼在node REPL 終端查看:

process物件為Node背景關系的內置物件,可以直接獲取,這個物件管理了node行程相關的資料,
比如 process.env就是我們獲取環境變數設定的入口了(讀者可以自行列印查看更多資訊),
配置一個環境變數,重試代碼
export NODE_ENV=雷學委
打開node的終端

這里我們看到,設定的環境變數被行程內部讀取到了,
繼續根據環境自適應的profiling,
上面展示了設定不同變數代碼中能夠獲取到該環境變數的值,
安照這個機制,我們可以把組態檔按照下面進行命名,讓程式加載不同的檔案名,比如下面:
- config.dev.json
- config.testing.json
- config.prod.json
然后只需要寫一份應用代碼:
復制下面代碼保存為app.js
//雷學委Demo代碼
const NODE_ENV=process.env.NODE_ENV || 'dev'
console.log('NODE_ENV:', NODE_ENV)
//定位當前目錄下的config.<環境型別>.json
const configPath = __dirname + '/config.' + NODE_ENV + '.json'
console.log('configPath:', configPath)
//加載并列印資料庫的配置細節
const dbConfig = require(configPath)
console.log('dbConfig:', dbConfig)
我們直接來看效果;

運行代碼在這:
#開發環境啟動應用
node app.js
#測驗環境啟動應用
export NODE_ENV=testing && node app.js
#生產環境啟動應用
export NODE_ENV=prod && node app.js
很輕松吧,一份代碼根據不同的環境適配了,
實際運行應用app.js的服務器,上面會配置環境變數NODE_ENV為對應的dev/testing/prod值,
上面代碼僅為原理展示,
好了到這里讀者應該能夠懂得profling如何做了,(可以三連了)
下面看看為什么,
為啥搞這么多外部配置,直接寫在代碼里面根據主機名字加載不好么?
一般企業會有大量的服務器,然后會把服務器劃分為幾類,比較典型的劃分為:

很多中大公司會有下面這樣一個劃分:

這樣能夠把一個應用層層把關提拔到最上層的生產環境(production),
學委想對小白說的: 比如說一個游戲的新功能,往往會經過開發機器除錯,然后大量測驗,把大量的潛在的重要的bug解決了,提拔到預發布,最后到生產環境,這個程序通過一些列的自動化測驗,回歸測驗,可以大大保證系統的質量,還有一種高端玩法就是灰度發布,加上這個制度,這就是我們常說產品平滑上線的流程了,
這好像扯遠了,產品發布這一套能再寫億篇!
我們回到主題,通常就是只開發一份代碼,發布到不同環境之后,程式動態的連接到正確的資料庫,加載對應的資料,資料雖不同但是程式在任意環境的行為要絕對一致,
這里配置外部化考量是:配置外部化可以減少代碼跟環境的耦合
而不是發布一個型別的環境,就得修改代碼,
特別是互聯網/金融專案都會有嚴苛的質量把關,哪怕是修改一個標點符號,整個產品提升的程序都得從開發環境重新來過,
因此,配置外部化很有必要,
那么,應用能否跟外部環境毫無關聯?
比較有經驗的朋友,可能會想匿名函式,或者亞馬遜的lamda,或者serverless app(無服務器應用)
如果業務沒有任何環境區分,那就可以做到程式跟環境沒有耦合,這就充分的說明了serverless的一個優點!(沒有耦合,意味著隨便拿一個云服務器部署,即可輕松實作彈性伸縮了,但這并非此文出發點,有機會再說)
對了,學委還有這個可以關注長期閱讀 =>雷學委趣味編程故事匯編
或者=> 雷學委NodeJS系列
持續學習持續開發,我是雷學委!
編程很有趣,關鍵是把技術搞透徹講明白,
創作不易,請多多支持,點贊收藏支持學委吧!
更多代碼可以查看/Star: LearnNodeJS代碼下載
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/291349.html
標籤:其他
