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