<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
什麼是多環境?其實就是說你的電腦上寫的程式最終要放到別人的伺服器上去執行。每個計算機環境不一樣,這就是多環境。常見的多環境開發主要兼顧3種環境設定,開發環境——自己用的,測試環境——自己公司用的,生產環境——甲方爸爸用的。因為這是絕對不同的三臺電腦,所以環境肯定有所不同,比如連線的資料庫不一樣,設定的存取埠不一樣等等。
那什麼是多環境開發?就是針對不同的環境設定不同的設定屬性即可。比如你自己開發時,設定你的埠如下:
server: port: 80
如何想設計兩組環境呢?中間使用三個減號分隔開
server: port: 80 --- server: port: 81
如何區分兩種環境呢?起名字唄
spring: profiles: pro server: port: 80 --- spring: profiles: dev server: port: 81
那用哪一個呢?設定預設啟動哪個就可以了
spring: profiles: active: pro # 啟動pro --- spring: profiles: pro server: port: 80 --- spring: profiles: dev server: port: 81
就這麼簡單,再多來一組環境也OK
spring: profiles: active: pro # 啟動pro --- spring: profiles: pro server: port: 80 --- spring: profiles: dev server: port: 81 --- spring: profiles: test server: port: 82
其中關於環境名稱定義上述格式是過時格式,標準格式如下
spring: config: activate: on-profile: pro
將所有的設定都放在一個組態檔中,尤其是每一個設定應用場景都不一樣,這顯然不合理,於是就有了將一個組態檔拆分成多個組態檔的想法。拆分後,每個組態檔中寫自己的設定,主組態檔中寫清楚用哪一個組態檔就好了。
主組態檔
spring: profiles: active: pro # 啟動pro
環境組態檔
server: port: 80
環境組態檔因為每一個都是設定自己的項,所以連名字都不用寫裡面了。那問題是如何區分這是哪一組設定呢?使用檔名區分。
application-pro.yaml
server: port: 80
application-dev.yaml
server: port: 81
檔案的命名規則為:application-環境名.yml
上圖中的application.yml就是我們說的主組態檔,其他的都是環境組態檔。
在組態檔中,如果某些設定項所有環境都一樣,可以將這些項寫入到主設定中,只有哪些有區別的項才寫入到環境組態檔中。
SpringBoot最早期提供的組態檔格式是properties格式的,這種格式的多環境設定也可以瞭解一下。
主組態檔
spring.profiles.active=pro
環境組態檔
application-pro.properties
server.port=80
application-dev.properties
server.port=81
檔案的命名規則為:application-環境名.properties
properties檔案多環境設定僅支援多檔案格式
多環境開發獨立組態檔書寫技巧
作為程式設計師在搞設定的時候往往處於一種分久必合合久必分的局面。開始先寫一起,後來為了方便維護就拆分。對於多環境開發也是如此,下面給大家說一下如何基於多環境開發做設定獨立管理,務必掌握。
將所有的設定根據功能對組態檔中的資訊進行拆分,並製作成獨立的組態檔,命名規則如下
使用include屬性在啟用指定環境的情況下,同時對多個環境進行載入使其生效,多個環境間使用逗號分隔
spring: profiles: active: dev include: devDB,devRedis,devMVC
比較一下,現在相當於載入dev設定時,再載入對應的3組設定,從結構上就很清晰,用了什麼,對應的名稱是什麼
注意
當主環境dev與其他環境有相同屬性時,主環境屬性生效;其他環境中有相同屬性時,最後載入的環境屬性生效
改良
但是上面的設定也有一個問題,比如我要切換dev環境為pro時,include也要修改。因為include屬性只能使用一次,這就比較麻煩了。SpringBoot從2.4版開始使用group屬性替代include屬性,降低了設定書寫量。簡單說就是我先寫好,你愛用哪個用哪個。
spring: profiles: active: dev group: "dev": devDB,devRedis,devMVC "pro": proDB,proRedis,proMVC "test": testDB,testRedis,testMVC
現在再來看,如果切換dev到pro,只需要改一下是不是就結束了?完美!
最後說一個衝突問題。就是maven和SpringBoot同時設定多環境的話怎麼搞。
要想處理這個衝突問題,你要先理清一個關係,究竟誰在多環境開發中其主導地位。也就是說如果現在都設定了多環境,誰的應該是保留下來的,另一個應該遵從相同的設定。
maven是做什麼的?專案構建管理的,最終生成程式碼包的,SpringBoot是幹什麼的?簡化開發的。簡化,又不是其主導作用。最終還是要靠maven來管理整個工程,所以SpringBoot應該聽maven的。整個確認後下面就好做了。大體思想如下:
maven中設定多環境(使用屬性方式區分環境)
<profiles> <profile> <id>env_dev</id> <properties> <profile.active>dev</profile.active> </properties> <activation> <activeByDefault>true</activeByDefault> <!--預設啟動環境--> </activation> </profile> <profile> <id>env_pro</id> <properties> <profile.active>pro</profile.active> </properties> </profile> </profiles>
SpringBoot中讀取maven設定值
spring: profiles: active: @profile.active@
上面的@屬性名@就是讀取maven中設定的屬性值的語法格式。
紀錄檔其實就是記錄程式日常執行的資訊,主要作用如下:
紀錄檔的使用格式非常固定,直接上操作步驟:
步驟①:新增紀錄檔記錄操作
@RestController @RequestMapping("/books") public class BookController extends BaseClass{ private static final Logger log = LoggerFactory.getLogger(BookController.class); @GetMapping public String getById(){ log.debug("debug..."); log.info("info..."); log.warn("warn..."); log.error("error..."); return "springboot is running...2"; } }
上述程式碼中log物件就是用來記錄紀錄檔的物件,下面的log.debug,log.info這些操作就是寫紀錄檔的API了。
結果:
預設的我們的系統在啟動起來的時候,紀錄檔級別是info級別,所以這裡我們只能看到info以及其上的紀錄檔資訊
步驟②:設定紀錄檔輸出級別
紀錄檔設定好以後可以根據設定選擇哪些參與記錄。這裡是根據紀錄檔的級別來設定的。紀錄檔的級別分為6種,分別是:
一般情況下,開發時候使用DEBUG,上線後使用INFO,運維資訊記錄使用WARN即可。下面就設定一下紀錄檔級別:
# 開啟debug模式,輸出偵錯資訊,常用於檢查系統執行狀況 debug: true
在開啟了debug模式之後我們在開啟專案的時候會有大篇幅的文字,這個模式我們一般在專案上線之後的檢測才會使用到。
這麼設定太簡單粗暴了,紀錄檔系統通常都提供了細粒度的控制
# 開啟debug模式,輸出偵錯資訊,常用於檢查系統執行狀況 debug: true # 設定紀錄檔級別,root表示根節點,即整體應用紀錄檔級別 logging: level: root: debug
我們設定成debug級別之後,再執行就可以看到:
還可以再設定更細粒度的控制(例如我們不想看框架裡面的debug紀錄檔)
步驟③:設定紀錄檔組,控制指定包對應的紀錄檔輸出級別,也可以直接控制指定包對應的紀錄檔輸出級別
logging: # 設定紀錄檔組 group: # 自定義組名,設定當前組中所包含的包 ebank: com.nefu.controller,com.nefu.service level: root: warn # 為對應組設定紀錄檔級別 ebank: debug # 為對包設定紀錄檔級別 com.nefu.controller: debug
說白了就是總體設定一下,每個包設定一下,如果感覺設定的麻煩,就先把包分個組,對組設定。
總結
寫程式碼的時候每個類都要寫建立紀錄檔記錄物件,這個可以優化一下,使用前面用過的lombok技術給我們提供的工具類即可。
@RestController @RequestMapping("/books") public class BookController extends BaseClass{ private static final Logger log = LoggerFactory.getLogger(BookController.class); //這一句可以不寫了 }
匯入lombok後使用註解搞定,紀錄檔物件名為log
@Slf4j //這個註解替代了下面那一行 @RestController @RequestMapping("/books") public class BookController extends BaseClass{ private static final Logger log = LoggerFactory.getLogger(BookController.class); //這一句可以不寫了 }
紀錄檔已經能夠記錄了,但是目前記錄的格式是SpringBoot給我們提供的,如果想自定義控制就需要自己設定了。先分析一下當前紀錄檔的記錄格式。
對於單條紀錄檔資訊來說,日期,觸發位置,記錄資訊是最核心的資訊。級別用於做篩選過濾,PID與執行緒名用於做精準分析。瞭解這些資訊後就可以DIY紀錄檔格式了。
模擬的官方紀錄檔模板的書寫格式:
logging: pattern: console: "%d %clr(%p) --- [%16t] %clr(%-40.40c){cyan} : %m %n"
紀錄檔資訊顯示,記錄已經控制住了,下面就要說一下紀錄檔的轉存了。紀錄檔不能僅顯示在控制檯上,要把紀錄檔記錄到檔案中,方便後期維護查閱。
對於紀錄檔檔案的使用存在各種各樣的策略,例如每日記錄,分類記錄,報警後記錄等。這裡主要研究紀錄檔檔案如何記錄。
記錄紀錄檔到檔案中格式非常簡單,設定紀錄檔檔名即可。
logging: file: name: server.log
雖然使用上述格式可以將紀錄檔記錄下來了,但是面對線上的複雜情況,一個檔案記錄肯定是不能夠滿足運維要求的,通常會每天記錄紀錄檔檔案,同時為了便於維護,還要限制每個紀錄檔檔案的大小。下面給出紀錄檔檔案的常用設定方式:
logging: logback: rollingpolicy: #代表紀錄檔的捲動 max-file-size: 3KB #檔案大小限度 file-name-pattern: server.%d{yyyy-MM-dd}.%i.log #捲動紀錄檔的檔名怎麼啟
以上格式是基於logback紀錄檔技術設定每日紀錄檔檔案的設定格式,要求容量到達3KB以後就轉存資訊到第二個檔案中。檔案命名規則中的%d標識日期,%i是一個遞增變數,用於區分紀錄檔檔案。
到此這篇關於SpringBoot多環境開發與紀錄檔的文章就介紹到這了,更多相關SpringBoot多環境開發內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45