Java?nacos動(dòng)態(tài)配置實(shí)現(xiàn)流程詳解
一、前言
使用動(dòng)態(tài)配置的原因: properties 和 yaml 是寫(xiě)到項(xiàng)目中的,好多時(shí)候有些配置需要修改,每次修改就要重新啟動(dòng)項(xiàng)目,不僅增加了系統(tǒng)的不穩(wěn)定性,也大大提高了維護(hù)成本,非常麻煩,且耗費(fèi)時(shí)間。
使用動(dòng)態(tài)配置,則可以避免這些麻煩,可以動(dòng)態(tài)的修改配置,不需要重新啟動(dòng)項(xiàng)目。
nacos配置中心,可以使得配置標(biāo)準(zhǔn)化、格式統(tǒng)一化,當(dāng)配置信息發(fā)生變動(dòng)時(shí),修改實(shí)時(shí)生效,無(wú)需要重新重啟服務(wù)器,就能夠自動(dòng)感知相應(yīng)的變化,并將新的變化統(tǒng)一發(fā)送到相應(yīng)程序上,快速響應(yīng)變化。
本次環(huán)境使用版本:NACOS1.4.2; spring-boot 2.3.9.RELEASE;nacos-config-spring-boot-starter 0.2.1
二、在nacos上創(chuàng)建配置文件
創(chuàng)建配置文件
在默認(rèn)命名空間中,創(chuàng)建一個(gè)配置文件
配置說(shuō)明
- Data ID —— 用于項(xiàng)目讀取名稱,spring-nacos 動(dòng)態(tài)配置命名規(guī)范為 :{prefix}-{spring.profiles.active}.{file-extension}
- prefix 默認(rèn)為 spring.application.name 的值,也可以通過(guò)配置項(xiàng) spring.cloud.nacos.config.prefix來(lái)配置。
- spring.profiles.active 即為當(dāng)前環(huán)境對(duì)應(yīng)的 profile,就是環(huán)境的命名,比如 test 環(huán)境, dev 環(huán)境;spring.profiles.active 可以為空,為空著不區(qū)分環(huán)境信息,dataId 的拼接格式變成 {prefix}.{file-extension}。
- file-exetension 為配置內(nèi)容的數(shù)據(jù)格式,一般常用 properties 和 yaml 類型。
說(shuō)明:
- 我這次修改的項(xiàng)目是網(wǎng)關(guān),項(xiàng)目名稱 :gateway(spring.application.name= gateway)
- 沒(méi)有使用環(huán)境配置
- 所以 nacos 的配置文件為: {prefix}.{file-extension} 即 gateway.yml
- 如果有配置環(huán)境的,可以為 {prefix}-{spring.profiles.active}.{file-extension} 即 gateway-dev.yml
本次配置文件名稱為 gateway.yml
注意: 項(xiàng)目啟動(dòng)時(shí),nacos-config 會(huì)自動(dòng)加載以下文件,故以下文件名稱都可以作為默認(rèn)動(dòng)態(tài)配置的文件格式。
- icp-gateway-dev.yml,icp-gateway.yml,icp-gateway,(說(shuō)明,這三個(gè)文件,可以指定命名 nacos 分組)
- common.yml (該文件為默認(rèn)分組,DEFAULT_GROUP)
添加測(cè)試使用的配置 nacosConfigDemmo: NAME1
說(shuō)明: 本次配置項(xiàng)目,分組名稱為 ICP_PLATFORM (注意:分組名稱建議使用下劃線 _ ,不建議使用 中橫線 - ,中橫線會(huì)有幾率出現(xiàn)不能讀取的問(wèn)題,使用連接符請(qǐng)注意使用;分組名可以自定,如果要區(qū)分命名空間,需要到 nacos 命名空間 中新建 命名空間)
發(fā)布并檢查配置文件
編輯完成之后,直接點(diǎn)擊發(fā)布,會(huì)提示新建完成
點(diǎn)擊確定,然后點(diǎn)擊返回配置中心,在配置列表中能找到自己的配置文件,確保文件內(nèi)容正確即可
至此,配置文件完成,接下來(lái)在項(xiàng)目中使用這個(gè)配置文件。
三、 修改項(xiàng)目配置與動(dòng)態(tài)讀取配置文件
添加 nacos 動(dòng)態(tài)配置依賴
在 pom.xml 文件中,添加依賴。
<dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-starter</artifactId> <version>0.2.1</version> </dependency>
修改項(xiàng)目配置文件,讀取 nacos 中的配置內(nèi)容
# 指定啟動(dòng)端口
server:
port: 7200
spring:
application:
# 指定服務(wù)名稱
name: gateway
# 項(xiàng)目運(yùn)行環(huán)境,可以搭配在 nacos 動(dòng)態(tài)配置文件名上面,不同環(huán)境使用不同的動(dòng)態(tài)配置
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #nacos 的注冊(cè)地址
file-extension: yml #動(dòng)態(tài)配置文件的 格式。就是 nacos 中的動(dòng)態(tài)配置,這里是 yml
group: ICP_PLATFORM #nacos 動(dòng)態(tài)配置的分組,要與 nacos 配置文件保持一致
# namespace: #namespace 是nacos 的命名空間,我這兒是默認(rèn)空間,就不配置了
在controller與service中使用動(dòng)態(tài)配置
controller 代碼:
import com.insupro.search2.service.IIndexService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/demo") public class nacosConfigDemmo { @Autowired private DemoService demoService; @GetMapping("/name") public Object showDemoName(){ return demoService.showDemoName(); } }
service 接口代碼:
public interface IIndexService { Object showDemoName(); }
service 實(shí)現(xiàn)代碼:
import com.insupro.search2.service.demoService; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Service; @Service // 注意,要自動(dòng)刷新配置,需要 @RefreshScope 這個(gè)注解 @RefreshScope public class demoServiceImpl implements demoService{ /** * 使用在上面nacos 中添加的測(cè)試使用配置。 */ @Value("${nacosConfigDemmo}") private String demoName; @Override public Object showDemoName(){ return demoName; } }
運(yùn)行,請(qǐng)求接口地址,得到響應(yīng)值:
postman 請(qǐng)求,第一次響應(yīng),值為 NAME2
修改 nacos 配置文件,將 nacosConfigDemmo: NAME1 改為 nacosConfigDemmo: NAME2 并發(fā)布
等待控制臺(tái)打?。?Refresh keys changed: [nacosConfigDemmo],則動(dòng)態(tài)配置已經(jīng)生效
再次請(qǐng)求,發(fā)現(xiàn)返回值已經(jīng)改變:
請(qǐng)求結(jié)果,NAME1 已經(jīng)變成 NAME2,項(xiàng)目不需要重啟,動(dòng)態(tài)配置已經(jīng)生效。
四、 動(dòng)態(tài)配置網(wǎng)關(guān)的使用
導(dǎo)入配置,網(wǎng)關(guān)不進(jìn)行權(quán)限校驗(yàn)的路徑
獲取配置文件,生成 bean
import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; // 自動(dòng)刷新機(jī)制,需要 get 方法支撐 @Setter @Getter // 獲取配置文件 @ConfigurationProperties(prefix = "security.ignore") // 開(kāi)啟自動(dòng)刷新 @RefreshScope public class SecurityProperties { private PermitProperties ignore = new PermitProperties(); }
配置文件實(shí)體類
import lombok.Getter; import lombok.Setter; @Setter @Getter public class PermitProperties { /** * 設(shè)置不用認(rèn)證的url */ private String[] httpUrls = {}; public String[] getUrls() { if (httpUrls == null || httpUrls.length == 0) { return new ArrayList<>(); } List<String> list = new ArrayList<>(); for (String url : httpUrls) { list.add(url); } return list.toArray(new String[list.size()]); } }
至此,導(dǎo)入自動(dòng)配置完成,可以根據(jù)自己的業(yè)務(wù)代碼進(jìn)行網(wǎng)關(guān)的配置與使用。
但是??!注意?。?如果在配置文件中調(diào)用配置,則需要在配置文件中使用 @RefreshScope 注解,用于刷新配置。因?yàn)榕渲梦募陧?xiàng)目啟動(dòng)時(shí)便已經(jīng)完成加載。
例如:
@Configuration public class ResourceServerConfiguration { @Autowired private SecurityProperties securityProperties; // 使用了 @Configuration 定義配置文件,并在配置類中使用 @Bean 裝配 bean,此時(shí)如果在自動(dòng)裝配出沒(méi)有使用 @RefreshScope 注解,則自動(dòng)配置不會(huì)生效。 @Bean @Autowired(required = false) @RefreshScope SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { if (securityProperties.getIgnore().getUrls().length > 0) { authorizeExchange.pathMatchers(securityProperties.getIgnore().getUrls()).permitAll(); } // TODO 余下自行業(yè)務(wù)代碼 ………… return http.build(); } }
到此這篇關(guān)于Java nacos動(dòng)態(tài)配置實(shí)現(xiàn)流程詳解的文章就介紹到這了,更多相關(guān)Java nacos動(dòng)態(tài)配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+Redis實(shí)現(xiàn)接口防刷的示例代碼
在實(shí)際開(kāi)發(fā)中,會(huì)出現(xiàn)用戶多次點(diǎn)擊發(fā)送請(qǐng)求,本文主要介紹了SpringBoot+Redis實(shí)現(xiàn)接口防刷的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01SpringBoot整合Spring?Security過(guò)濾器鏈加載執(zhí)行流程源碼分析(最新推薦)
Spring?Boot?對(duì)于?Spring?Security?提供了自動(dòng)化配置方案,可以使用更少的配置來(lái)使用?Spring?Security,這篇文章主要介紹了SpringBoot整合Spring?Security過(guò)濾器鏈加載執(zhí)行流程源碼分析,需要的朋友可以參考下2023-02-02解決Maven本地倉(cāng)庫(kù)明明有對(duì)應(yīng)的jar包但還是報(bào)找不到的問(wèn)題
這篇文章主要介紹了解決Maven本地倉(cāng)庫(kù)明明有對(duì)應(yīng)的jar包但還是報(bào)找不到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10詳解Spring Cloud Netflix Zuul中的速率限制
這篇文章主要介紹了詳解Spring Cloud Netflix Zuul中的速率限制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11利用MyBatis進(jìn)行不同條件的like模糊查詢的方法
這篇文章主要介紹了利用MyBatis進(jìn)行不同條件的like模糊查詢,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08idea創(chuàng)建springboot項(xiàng)目,Application.java不能運(yùn)行問(wèn)題及解決
這篇文章主要介紹了idea創(chuàng)建springboot項(xiàng)目,Application.java不能運(yùn)行問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Spring中的動(dòng)態(tài)數(shù)據(jù)源解讀
這篇文章主要介紹了關(guān)于Spring中的動(dòng)態(tài)數(shù)據(jù)源解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06java使用IO流對(duì)數(shù)組排序?qū)嵗v解
在本篇文章里小編給大家整理的是一篇關(guān)于java使用IO流對(duì)數(shù)組排序?qū)嵗v解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-02-02MyBatis Plus插件機(jī)制與執(zhí)行流程原理分析詳解
這篇文章主要介紹了MyBatis Plus插件機(jī)制與執(zhí)行流程原理分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09