Nacos注冊中心提供服務注冊發現,在真實開發中一個項目會有很多微服務實例,每個微服務實例中都有自己獨立的配置,如果有一個配置是多個微服務中都需要使用的話,就需要配置每一個微服務實例,並且還要重啟這些微服務實例。
Nacos不僅有注冊中心還有配置管理,Nacos配置管理可以完成統一配置、配置熱更新
Nacos配置管理
添加Nacos配置管理依賴
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
統一配置管理
統一配置是指配置信息可以被多個微服務實例使用
新建統一配置
讀取統一配置
springboot項目啟動時讀取本地application.yaml文件,然后實現自動裝配
現在需要把Nacos配置信息讀取並讀取,讀取Nacos配置信息步驟:
- 讀取Nacos配置信息必須在讀取application.yaml配置文件之前完成(bootstrap.yml這個文件是引導文件,優先級高於application.yml)
- 讀取Nacos配置信息之前知道Nacos地址和配置信息Id
通過bootstrap.yml配置nacos地址、當前環境、服務名稱、文件后綴名。這些決定了程序啟動時去nacos讀取哪個配置信息
spring: application: name: userservice profiles: active: dev cloud: nacos: discovery: server-addr: localhost:8848 config: file-extension: yaml
通過Value注解將pattern.dateformat配置注入到Controller中做測試
@Slf4j @RestController @RequestMapping("/user") public class UserController { @Value("${pattern.dateformat}") private String dateFormat; @GetMapping("/now") public String now(){ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateFormat, Locale.CHINA)); } }
配置熱更新
Nacos中的配置信息變更后,微服務實例無需重啟就可以的獲取變更后的配置
方式一:通過@Value注解注入,結合@RefreshScope來刷新(在@Value注入的變量所在類上添加注解@RefreshScope)
@RefreshScope public class UserController { @Value("${pattern.dateformat}") private String dateFormat; .... .... }
修改Nacos配置
沒有重啟微服務實例前提下訪問 http://localhost:8081/user/now
方式二:通過@ConfigurationProperties注入,自動刷新(推薦)
@Data //lombok,提供get、set方法 @Component //將被標記的類注冊成spring容器的Bean @ConfigurationProperties(prefix = "pattern")//采用約定大於配置的方式:類中屬性和配置中的屬性(pattern.dateformat)一致,就可以完成屬性的自動更新 public class PatternProperties { private String dateformat; }
依賴注入PatternProperties對象
@Slf4j @RestController @RequestMapping("/user") //@RefreshScope public class UserController { // @Value("${pattern.dateformat}") // private String dateFormat; @Autowired private PatternProperties patternProperties; @GetMapping("/now") public String now(){ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat(), Locale.CHINA)); } }
重啟微服務實例
修改Nacos配置信息
訪問 http://localhost:8081/user/now
多環境共享配置
微服務啟動時會從nacos讀取多個配置文件:
- [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
- [spring.application.name].yaml,例如:userservice.yaml
無論profile如何變化,[spring.application.name].yaml這個文件一定會加載,因此多環境共享配置可以寫入這個文件
Java配置類關聯配置信息
@Data //lombok,提供get、set方法 @Component //將被標記的類注冊成spring容器的Bean @ConfigurationProperties(prefix = "pattern")//采用約定大於配置的方式,類中屬性和配置文件中的屬性一致,就可以完成屬性的自動更新 public class PatternProperties { private String dateformat; private String evnShared; }
獲取信息
@Autowired private PatternProperties patternProperties; @GetMapping("/properties") public PatternProperties properties(){ return patternProperties; }
指定微服務的活動環境
重啟微服務實例,訪問8081和8083
優先級:
[服務名]-[環境].yaml >[服務名].yaml > 本地配置
本地配置
Java配置類關聯配置信息
@Data //lombok,提供get、set方法 @Component //將被標記的類注冊成spring容器的Bean @ConfigurationProperties(prefix = "pattern")//采用約定大於配置的方式,只要類中屬性和配置文件中的屬性一致,就可以完成屬性的自動更新 public class PatternProperties { private String dateformat; private String evnShared; private String name; }
Nacos共享配置
Nacos環境配置