一 Nacos 配置中心
1 引入依賴 – services.pom
??每個微服務都需要
<!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
2 配置文件 – service-order
??指定Nacos地址,并指定想導入Nacos中的那些配置信息(數據集)
spring.application.name=service-order
server.port=8000
spring.cloud.nacos.server-addr=127.0.0.1:8848# nacos前綴自動引用地址 項目啟動后將配置中心的 service-order.properties 文件導入
spring.config.import=nacos:service-order.properties
3 創建數據集
# 訂單支付超時時間,用戶下單后需在 30分鐘 內完成支付,否則訂單自動取消。
order.timeout=30min
# 訂單發貨后 3天 自動確認收貨(無需用戶手動點擊確認)。
order.auto-confirm=3d
4 獲取配置文件內容 – OrderController
@RestController
public class OrderController {@AutowiredOrderService orderService;// 獲取配置文件中的配置值@Value("${order.timeout}")String orderTimeOut;@Value("${order.autoconfirm}")String orderAutoConfirm;// 測試@GetMapping("/config")public String config(){return "order.timeout:"+orderTimeOut+";order.autoconfirm:"+orderAutoConfirm;}@GetMapping("/create")public Order createOrder(@RequestParam("productId") Long productId,@RequestParam("userId") Long userId) {Order order = orderService.createOrder(productId, userId);return order;}
}
5 啟動測試
自配置中心獲取數據,但此刻還不能夠跟隨配置中心同步變化
二 動態刷新
1 自動刷新屬性 – OrderController
??想要屬性能夠跟隨配置中心變化,還需要注解@RefreshScope
,激活配置屬性的刷新功能
@RefreshScope
@RestController
public class OrderController {@AutowiredOrderService orderService;// 獲取配置文件中的配置值@Value("${order.timeout}")String orderTimeOut;@Value("${order.autoconfirm}")String orderAutoConfirm;@GetMapping("/config")public String config(){return "order.timeout:"+orderTimeOut+";order.autoconfirm:"+orderAutoConfirm;}@GetMapping("/create")public Order createOrder(@RequestParam("productId") Long productId,@RequestParam("userId") Long userId) {Order order = orderService.createOrder(productId, userId);return order;}
}
2 自動刷新測試
跟隨配置中心變化
3 配置文件禁用導入檢查 – service-product
??當導入配置中心依賴后,但微服務還不需要使用配置中心,啟動服務會導致報錯,因此需要將配置設置為可選(引入的配置文件可以沒有)或禁用Nacos的導入檢查
spring.application.name=service-product
server.port=9000
spring.cloud.nacos.server-addr=127.0.0.1:8848# 不啟動導入檢查
spring.cloud.nacos.config.import-check.enabled=false
4 優化動態刷新
??① 將配置常用數據抽取到Bean中 – OrderProperties
// 該 Bean 需為容器中的組件才能夠成功綁定
@Component
// 指定屬性前綴 order. 屬性名可省略 order
@ConfigurationProperties(prefix = "order")
@Data
public class OrderProperties {// 可以對配置文件中的屬性進行批量綁定 無需 @RefreshScopeString timeOut;// orderAutoConfirmString autoConfirm;
}
??② 修改方法 – OrderController
// @RefreshScope 不再需要
@RestController
public class OrderController {@AutowiredOrderService orderService;// 所需屬性@AutowiredOrderProperties orderProperties;@GetMapping("/config")public String config(){return "order.timeout:"+orderProperties.getTimeOut()+";order.autoconfirm:"+orderProperties.getAutoConfirm();}@GetMapping("/create")public Order createOrder(@RequestParam("productId") Long productId,@RequestParam("userId") Long userId) {Order order = orderService.createOrder(productId, userId);return order;}
}
5 測試動態刷新
6 注意
??配置中心內容為高優先級配置
,項目內部的 application.properties 是低優先級配置
,當二者對同一屬性都有編寫時,高優先級會生效,也就是先導入優先和外部優先
。
具體流程為:項目啟動時,將所有配置合并,產生沖突低優先級的配置被丟棄,然后生成一張生效的配置列表,存入項目的環境變量中,等待取用。
若存在多個導入的配置文件都屬于高優先級配置
(外部優先),則按照先后順序排列等級,以第一次聲明的配置為準(先導入優先)
// service-order.properties 優先級更高
spring.config.import=nacos:service-order.properties,nacos:common.properties
三 監聽配置 – NacosConfigManager
1 作用
??當配置中心的配置文件發生變化,我們需要獲取是哪一項發生了變化,可通過郵件通知。
因此需要在項目啟動時監聽配置文件變化,發生變化后拿到變化的值,然后發送郵件
2 監聽方法 – OrderMainApplication
// 開啟服務發現功能
@EnableDiscoveryClient
@SpringBootApplication
public class OrderMainApplication {public static void main(String[] args) {SpringApplication.run(OrderMainApplication.class, args);}// 參數上的所有組件會自動從容器中拿 -- Spring Boot 機制// 一次性任務 項目啟動的同時觸發@BeanApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager) {// 項目啟動時運行該任務return new ApplicationRunner() {@Overridepublic void run(ApplicationArguments args) throws Exception {// 查看是否成功觸發System.out.println("RUN!!!");// 拿到配置服務ConfigService configService = nacosConfigManager.getConfigService();// 給配置服務添加一個監聽器 參數為:數據集ID 組 監聽器configService.addListener("service-order.properties", "DEFAULT_GROUP", new Listener() {// 監聽器的監聽任務是在線程池中運行的@Overridepublic Executor getExecutor() {// 給一個固定大小的線程池return Executors.newFixedThreadPool(4);}// 接收配置信息@Overridepublic void receiveConfigInfo(String configInfo) {System.out.println("變化為:"+configInfo);System.out.println("可發郵件通知");}});}};}
}
3 測試
四 數據隔離
1 作用
??研發項目會存在多種環境如,開發,測試,生產,根據不同環境,每個微服務的同一套配置的值就會有所變動如,訂單服務的數據庫配置文件在不同環境需要鏈接不同的數據庫,因此需要實現數據隔離。
2 實現原理
??根據定義,Nacos 采用Namespace命名空間 → Group組 → Data-id數據集
的三層隔離結構,通過命名空間區分環境,組區分每個微服務,數據集區分配置,一套命名空間含有多個組,每個組下面有對應的多個數據集。
在SpringBoot項目中,可定義多個環境與各命名空間綁定,在項目啟動時激活想要的環境,其綁定的命名空間下的所有配置就會對應生效。
3 新建命名空間
??若不創建命名空間,則配置都存在于默認的public(保留空間)
4 新建組與數據集
??訂單組
商品組
5 克隆配置
??復制配置文件到不同環境,便于更改配置文件內容
6 更新配置文件 – service-order
??注釋掉原配置文件application.properties
,使用新文件 –application.yml
,原配置文件import
對應的是public(保留空間),此時應更換其他環境
server:port: 8000spring:application:name: service-ordercloud:nacos:server-addr: 127.0.0.1:8848# 表示接下來要讀取的 dev 命名空間下的配置config:namespace: devconfig:# - 此處短橫線表示導入一個文件 order 組的 common.properties 文件import:- optional:nacos:common.properties?group=order- optional:nacos:database.properties?group=order
7 更新配置屬性Bean – OrderProperties
// 該 Bean 需為容器中的組件才能夠成功綁定
@Component
// 指定屬性前綴 order. 屬性名可省略 order
@ConfigurationProperties(prefix = "order")
@Data
public class OrderProperties {// 可以對配置文件中的屬性進行批量綁定 無需 @RefreshScopeString timeOut;// orderAutoConfirmString autoConfirm;// 新屬性String dbUrl;
}
8 更新方法 – OrderController
@RestController
public class OrderController {@AutowiredOrderService orderService;// 所需屬性@AutowiredOrderProperties orderProperties;@GetMapping("/config")public String config(){return "order.timeout:"+orderProperties.getTimeOut()+ ";order.autoconfirm:"+orderProperties.getAutoConfirm()+ ";order.dbUrl:"+orderProperties.getDbUrl();}@GetMapping("/create")public Order createOrder(@RequestParam("productId") Long productId,@RequestParam("userId") Long userId) {Order order = orderService.createOrder(productId, userId);return order;}
}
9 啟動測試
10 切換環境測試 – service-order
??① 修改為測試環境 – application.yml
server:port: 8000spring:application:name: service-ordercloud:nacos:server-addr: 127.0.0.1:8848# 表示接下來要讀取的 dev 命名空間下的配置config:namespace: testconfig:# - 此處短橫線表示導入一個文件 order 組的 common.properties 文件import:- optional:nacos:common.properties?group=order- optional:nacos:database.properties?group=order
??② 測試
11 多配置文件場景配置文件 – service-order
??① 修改配置文件,不同環境所需配置文件數量可能不統一,yaml可支持多文檔模式,- - -
表示多文檔模式,根據spring:profiles:active
選擇對應環境所需的配置文件
server:port: 8000spring:profiles:active: devapplication:name: service-ordercloud:nacos:server-addr: 127.0.0.1:8848# 表示接下來要讀取的 dev 命名空間下的配置config:# 關閉檢查import-check:enabled: false# 動態根據 active 變化 若不配置 默認為 publicnamespace: ${spring.profiles.active:public}---
spring:config:# - 此處短橫線表示導入一個文件 order 組的 common.properties 文件import:- optional:nacos:common.properties?group=order- optional:nacos:database.properties?group=order# 表示在開發環境下生效 這兩個文件生效 搭配 profiles active 激活使用activate:on-profile: dev---
spring:config:import:- optional:nacos:common.properties?group=order- optional:nacos:database.properties?group=order- optional:nacos:dahuang.properties?group=order# 表示在測試環境下生效 這兩個文件生效activate:on-profile: test---
spring:config:import:- optional:nacos:common.properties?group=order- optional:nacos:database.properties?group=order- optional:nacos:xiaohuang.properties?group=order# 表示在生產環境下生效 這兩個文件生效activate:on-profile: prod
??② 測試,首先根據active: dev
標識dev
被激活,連接namespace
,其中 ${spring.profiles.active:public}
的值為dev
,然后判斷on-profile:dev
為dev
時,所需要導入的配置文件。
③ 測試 test