<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一文捋清項(xiàng)目里的各種配置,看了必懂!

          共 3541字,需瀏覽 8分鐘

           ·

          2022-04-11 13:34

          點(diǎn)擊關(guān)注公眾號,Java干貨及時送達(dá)

          來源:https://lepdou.github.io/blogs/config/config.html

          引言

          項(xiàng)目開發(fā)中總是有各種各樣的配置,對于程序開發(fā)新手來說,配置是擺在面前的第一座大山?;叵氘?dāng)年在學(xué)校學(xué)習(xí)經(jīng)典的“SSH”的時候,一個web.xml配置都是異常的艱辛。工作多年的你,對配置真的了解嗎?

          什么是配置?

          首先我們來看一下配置文件的定義:

          “A software file used to configure the initial settings for a computer program.” -- From wikipedia

          配置來源可能有以下這些:

          1. 硬編碼參數(shù)
          2. 項(xiàng)目里的配置文件
          3. 文件系統(tǒng)上的配置文件
          4. 網(wǎng)絡(luò)上的配置文件
          5. 啟動參數(shù)(JVM屬性)
          6. 操作系統(tǒng)參數(shù)
          (圖一 配置參數(shù)體系)

          下面會詳細(xì)介紹每一種配置類型的使用場景。

          硬編碼參數(shù)

          最常見的就是定義靜態(tài)變量方式。例如:public static final int PAGE_SIZE = 10;另外就是通過框架暴露的各種API接口設(shè)置參數(shù)。

          優(yōu)點(diǎn)
          • 這種是最簡單、成本最低的方式
          • 不用額外創(chuàng)建文件
          • 代碼里能直接能讀取
          • 離配置使用地方最近的一種方式
          缺點(diǎn)
          • 代碼和配置糅合在一起,不易于維護(hù)
          • 修改配置必須修改源代碼,重新編譯、打包、上線
          • 同一個框架的配置散落到項(xiàng)目各個角度,不利于查找
          適用場景
          • Hard Code 適用于配置極其簡單且?guī)缀醪粫兏?/section>
          • 為了賦予常量語義
          • 配置極少從而創(chuàng)建配置文件成本高

          項(xiàng)目里配置文件

          這種方式是最常見的。標(biāo)準(zhǔn)的maven項(xiàng)目有一個resources目錄就是用來放置各種類型的配置文件,例如:

          • web項(xiàng)目的web.xml
          • log框架的配置
          • spring的bean定義的xml文件
          • mybatis的sql配置文件
          • spring boot的application.yml application.properties
          • 自定義的properties文件

          另外maven項(xiàng)目的核心pom.xml也算是配置文件。項(xiàng)目里使用到的各種各樣的框架、中間件基本上都需要配置文件來支撐??蚣茉谶\(yùn)行時,讀取配置文件來決定運(yùn)行時的行為。另外,Maven 系列教程全部整理好了,微信搜索關(guān)注公眾號:Java技術(shù)棧,在菜單欄中閱讀。

          配置文件路徑一般有兩種方式:

          優(yōu)點(diǎn)
          缺點(diǎn)
          適用場景

          文件系統(tǒng)上的配置文件

          此類配置文件是放在應(yīng)用運(yùn)行的機(jī)器上。常見的比如攜程公司內(nèi)部機(jī)器上都會放置一個server.properties文件。文件內(nèi)容主要是當(dāng)前機(jī)器的一些信息,比如env=dev標(biāo)示當(dāng)前機(jī)器屬于dev環(huán)境。公司配套提供framework-fundation基礎(chǔ)jar包,用來解析這個文件。

          那么應(yīng)用只要通過framework-foundation來獲取機(jī)器的相關(guān)信息。framework-foundation在這里的作用就是作為機(jī)器和應(yīng)用之間的橋梁。這種方式主要好處是規(guī)范運(yùn)維。?

          另外一種使用比較多的場景是應(yīng)用直接讀取文件系統(tǒng)上的某個文件。這種方式的好處就是可以動態(tài)更新配置,無需重新編譯、打包、運(yùn)行應(yīng)用。

          優(yōu)點(diǎn)
          缺點(diǎn)
          適用場景

          筆者遇到過一個dal框架,datasource配置文件就是放在文件系統(tǒng)上,結(jié)果開發(fā)人員在上線時,忘記在機(jī)器上放置這個文件導(dǎo)致線上bug。

          點(diǎn)擊關(guān)注公眾號,Java干貨及時送達(dá)

          網(wǎng)絡(luò)上的配置文件

          常見的包括兩種:DB上的配置表、配置中心。如果公司沒有統(tǒng)一的配置中心,那么最簡單的動態(tài)修改配置的方式莫過于把配置放置在DB上。相信大部分的開發(fā)都使用過或者遇到過。

          配置中心是最適合集中化管理配置、動態(tài)修改配置的地方。常見的配置中心都會提供管理配置后臺、實(shí)時推送配置、分環(huán)境管理配置、配置版本管理等。筆者目前就在開發(fā)一款開源的配置中心系統(tǒng)。

          優(yōu)點(diǎn)
          • 集中管理配置、全方位管理配置
          • 動態(tài)修改配置、實(shí)時推送、更新配置
          • 配置更加靈活,例如可以分環(huán)境、集群以及灰度發(fā)布等
          缺點(diǎn)
          • 需要依賴數(shù)據(jù)庫或者配置中心,成本高
          適用場景
          • 經(jīng)常需要變更的配置
          • 配置值每個環(huán)境不一致
          • 不希望配置值隨著代碼一起發(fā)布,例如開源項(xiàng)目中的某些配置

          啟動參數(shù)(JVM屬性)

          JVM屬性主要是應(yīng)用運(yùn)行的JVM進(jìn)程相關(guān)的屬性,比如java.class.version、java.class.path等Java相關(guān)的參數(shù)。在代碼里,可以通過System.getProperty()獲取參數(shù)值。另外,可以通過在啟動時指定-D參數(shù)來設(shè)置JVM屬性。最常見的使用場景是用來解決不同環(huán)境需要配置不同的參數(shù)。

          最新 JVM 面試題整理好了,點(diǎn)擊Java面試庫小程序在線刷題。

          例如作為中間件,依賴的外部系統(tǒng)越少越好,如果不依賴配置中心,那么就可以通過這種方式來實(shí)現(xiàn)不同環(huán)境配置不同的參數(shù),例如每個環(huán)境的數(shù)據(jù)庫連接串不一樣。另外需要提到的是maven打包參數(shù)。

          相比于-D運(yùn)行時參數(shù),maven打包參數(shù)是在編譯時設(shè)置配置屬性,maven會獲取打包參數(shù)然后替換掉配置文件里的placeholder。假設(shè)一個可運(yùn)行的jar包,只需要在打包的時候傳入?yún)?shù)值,打出來的jar包就可以到處運(yùn)行了,如果不這么做,那么需要每次運(yùn)行的時候指定參數(shù),成本太高。使用方式則是在mvn package 時指定-D參數(shù)。新手很容易混淆這兩種參數(shù)。換個角度看-D是命令行參數(shù)。

          優(yōu)點(diǎn)
          • 以非常小的代價就可以達(dá)到運(yùn)行時指定特殊參數(shù)值
          缺點(diǎn)
          • 啟動運(yùn)行項(xiàng)目需要設(shè)置啟動參數(shù),增加使用成本
          適用場景
          • 適合中間件類系統(tǒng),不推薦業(yè)務(wù)系統(tǒng)使用(業(yè)務(wù)系統(tǒng)用配置中心解決此類場景)
          • 增加統(tǒng)一運(yùn)維成本

          操作系統(tǒng)參數(shù)

          操作系統(tǒng)參數(shù)一般是只讀的,當(dāng)然也可以設(shè)置。例如前面提到的server.properties文件里的env參數(shù),其實(shí)也可以作為系統(tǒng)參數(shù),但是不建議這么做。

          另外,Java 系列面試題和答案全部整理好了,微信搜索Java技術(shù)棧,在后臺發(fā)送:面試,可以在線閱讀。

          后記

          配置的好處顯而易見,但是我們在工作中經(jīng)常會遇到這種情況。拿到一個項(xiàng)目,看到亂七八糟的配置無從下手,項(xiàng)目中使用的框架、中間件配置風(fēng)格更不相同,更頭疼的是配置項(xiàng)如果不了解框架的基礎(chǔ)上很難理解。

          導(dǎo)致的結(jié)果就是如果不復(fù)制、粘貼配置,手寫配置基本上很難寫對。驗(yàn)證這種情況最簡單的方式就是不復(fù)制其它項(xiàng)目的配置,手動搭建一個新項(xiàng)目。我相信絕大多數(shù)的人都難以做到。

          片面的說學(xué)習(xí)一個框架其實(shí)是在學(xué)習(xí)這個框架的API和配置參數(shù)。如果你非常熟悉一個框架的配置,那么你對框架的使用就得心應(yīng)手了。當(dāng)然,知道框架的原理也非常重要。說這么多,只想說明項(xiàng)目的配置真的非常重要,更好的管理、規(guī)范配置更加重要。

          對于框架、中間件開發(fā)者來說,配置應(yīng)該越少越好,增加一個配置對于使用者使用成本就會大大提高。如果配置很多,那么你的框架基本上就是很難用了。Spring一直是Java界最權(quán)威的框架體系,最新的Spring Boot框架的配置就非常少,一眼看上去非常舒心。

          推薦一個 Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:

          https://github.com/javastacks/spring-boot-best-practice

          Spring現(xiàn)在倡導(dǎo)減少配置文件,例如Spring早期版本的xml配置其實(shí)是很繁瑣的。新的Spring更多的配置放置在代碼中,利用注解以及API方式配置。Servlet最新版本也不需要web.xml文件了。

          說明一個道理: 大道至簡?








          突發(fā)!Spring 也淪陷了。。。
          2021 年發(fā)生的 10 件技術(shù)大事??!
          23 種設(shè)計(jì)模式實(shí)戰(zhàn)(很全)
          Spring Boot 保護(hù)敏感配置的 4 種方法!
          再見單身狗!Java 創(chuàng)建對象的 6 種方式
          阿里為什么推薦使用 LongAdder?
          AnotherRedisDesktopManager 開始收費(fèi)了?
          別再寫爆爆爆炸類了,試試裝飾器模式!
          Java 18 發(fā)布,默認(rèn) UTF-8,finalize 被棄用。。
          Spring Boot 3.0 M1 發(fā)布,正式棄用 Java 8
          Spring Boot 學(xué)習(xí)筆記,這個太全了!



          關(guān)注Java技術(shù)??锤喔韶?/strong>



          獲取 Spring Boot 實(shí)戰(zhàn)筆記!
          瀏覽 94
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美一级做A片 | 五月丁香花综合网 | 久久精品一二三视频 | 精品无码一区二区三区无毛 | 亚州性爱第一视频 |