我的設想
一個Spring項目在沒有配置中心的時候,通常需要寫4個配置文件辞友,application.yml,application-dev.yml,application-prod.yml和application-test.yml侈离。
一般來說application.yml定義了項目的一些基本信息二鳄,如srping.application.name,server.port,logging.level等基本信息锹淌,而數(shù)據(jù)庫备图、mq等配置信息則可能需要根據(jù)不同的環(huán)境來進行配置影所,因此基本會放在其他三個配置中蹦肴,并在application.yml中通過spring.profiles.active來指定項目環(huán)境。當使用nacos來進行項目的配置時猴娩,由于spring啟動時需要從遠程獲取配置信息阴幌,所以從前application.yml相關的配置都需要在bootstrap.yml中勺阐,以此類推,dev矛双、prod渊抽、test也是如此。差別在于议忽,現(xiàn)在不需要將配置寫在這些yml中了懒闷,只需要在項目的bootstrap*.yml中配置需要從遠端獲取Configuration的元數(shù)據(jù)即可由于沒有具體實現(xiàn)過,所以還是來看看到底應該怎么做
添加nacos server配置
不管怎么樣栈幸,將如dev愤估、prod這些環(huán)境配置在nacos server上都是必須的,nacos支持非常多樣化的配置速址。先來回顧一下nacos的namespace玩焰、Data ID、Group:
Namespace
命名空間芍锚,用于隔離用戶配置昔园。不同的命名空間可以有相同的Group和DataID。Namespace的一個常見場景是在不同的環(huán)境中區(qū)分和隔離配置闹炉,比如在開發(fā)和測試環(huán)境以及生產(chǎn)環(huán)境中蒿赢。
Data ID
Data ID組成如下:
${prefix}-${spring.profile.active}.${file-extension}
prefix的默認值就是spring.application.name,也可以通過spring.cloud.nacos.config.prefix配置
spring.profile.active即項目所在profile渣触,如test羡棵、dev、prod嗅钻,若為空皂冰,則Data ID會省略掉這一部分內(nèi)容,可以通過spring.profiles-active配置
file-extension是配置內(nèi)容的數(shù)據(jù)格式养篓,目前支持properties和yaml秃流,可以通過spring.cloud.nacos.config.file-extension配置
Group
群組,簡單來說區(qū)分具有相同Data ID的配置集柳弄。
不難發(fā)現(xiàn)舶胀,要在nacos server上配置dev、prod配置有很多方法碧注,我來簡單列舉一些:
- 設置多個namespace嚣伐,每一個namespace存放不同環(huán)境的配置文件,項目在配置時只需指定namespace即可
- 設置一個namespace萍丐,統(tǒng)一使用DEFAULT_GROUP轩端,通過Data ID中的${spring.profile.active}區(qū)分不同環(huán)境的配置文件,項目在配置時需要指定namespace和spring.active.profile
- 設置一個namespace逝变,使用不同Group基茵,項目在配置時需要指定namespace和Group
- 其實還有更多方案奋构,比如使用dev、prod拱层、test劃分namespace弥臼,使用Group來劃分不同的服務,不是也可以嗎舱呻?……
ps:如果不指定namespace醋火,則會使用默認的namespace,不過建議還是自己創(chuàng)建~
上面的方案對于當前項目來說都可用箱吕,但是從微服務配置的角度來說芥驳,到底哪個方案適合當前來用,才是最重要的茬高。對于微服務來說兆旬,首先,一個完整的項目會涉及到多個服務怎栽,如日志服務丽猬、用戶服務、訂單服務熏瞄。那么對于這些服務脚祟,我想我會考慮將其配置在不同的namespace中,即每一個服務對應一個namespace强饮。
隨后由桌,將目標指向單個服務,在微服務中邮丰,每一個服務都會擁有多臺實例行您,每一臺實例在相同的環(huán)境中會使用相同的配置,回顧上面三個概念的介紹剪廉,可以發(fā)現(xiàn)namespace>Group>Data ID娃循,因此,對于不同實例使用的不同環(huán)境配置斗蒋,使用Group來加以區(qū)分捌斧,如Test_Group、Dev_Group泉沾、Prod_Group捞蚂,隨后通過Data ID來標識對應的環(huán)境配置。
當然爆哑,這里還有一個問題我是存疑的(是有關服務注冊方面,所以對這里的操作影響不大舆吮,跳過不看也可)如果以服務來進行namespace劃分揭朝,那么之后注冊在namespace1的服務能否調(diào)用到注冊在namespace2的服務呢队贱?
因此,基于嚴謹認真的態(tài)度潭袱,決定使用第三種方案來做配置柱嫌!
新建namespace
ui界面的操作就不展示了,比較簡單屯换,在左側(cè)命名空間欄點進去找到添加按鈕编丘,命名空間自動生成就好了,空間名可以以服務名來標識彤悔,會比較清晰嘉抓。
新建配置
這里用不同數(shù)據(jù)庫作為兩個環(huán)境的區(qū)分,前者為unit晕窑,后者為homstay
dev環(huán)境
Data ID:example.dev.yaml
Group:DEV_GROUP
配置內(nèi)容:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/unit?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT&useSSL=false
prod環(huán)境
Data ID:example.dev.yaml
Group:DEV_GROUP
配置內(nèi)容:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/homestay?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT&useSSL=false
項目中配置
nacos server配置完畢后抑片,項目中需要獲取對應的遠程配置,則需要在bootstrap*.yml中進行相應的配置
bootstrap.yml
這里其實和application.yml一樣杨赤,配置一些基本的屬性敞斋,如本地端口,注冊中心地址疾牲,配置中心地址植捎,應用名以及使用環(huán)境
server:
port: 8070
spring:
cloud:
nacos:
config.:
server-addr: localhost:8848
discovery:
server-addr: localhost:8848
application:
name: example
profiles:
active: dev
bootstrap-dev.yml
dev環(huán)境需要獲取到nacos server的遠程dev配置
spring:
cloud:
nacos:
config:
group: DEV_GROUP
namespace: 7adf435f-aafe-4512-90fe-eb8b51b7cce2
file-extension: yaml
discovery:
namespace: 7adf435f-aafe-4512-90fe-eb8b51b7cce2
profiles: dev
bootstrap-prod.yml
prod環(huán)境需要獲取到nacos server的遠程prod配置
spring:
cloud:
nacos:
config:
group: PROD_GROUP
namespace: 7adf435f-aafe-4512-90fe-eb8b51b7cce2
file-extension: yaml
discovery:
namespace: 7adf435f-aafe-4512-90fe-eb8b51b7cce2
profiles: prod
啟動項目
修改Controller
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${spring.datasource.url}")
private String dataBaseUrl;
@RequestMapping("/str")
public String str(){return dataBaseUrl;}
}
切換環(huán)境為dev,啟動項目阳柔,訪問localhost:8070/config/get
jdbc:mysql://localhost:3306/unit?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT&useSSL=false
切換為prod焰枢,啟動項目,訪問localhost:8070/config/get
jdbc:mysql://localhost:3306/homestay?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT&useSSL=false
發(fā)現(xiàn)獲取到的數(shù)據(jù)庫配置不一樣了盔沫,到此医咨,本次配置測試就完成啦~