本篇就不對Nacos做基本介紹使用了。
緊接上篇,解決集群下動態刷新規則的問題。
前言
- 上篇提到兩個方案
- 使用MQ對節點進行廣播
- 使用Nacos
- 由於工作中深度使用到了Nacos,所以本次利用Nacos特性實現。
- Nacos很強大,直接包攬服務注冊、配置中心,且更有國人特色。
- Nacos支持配置修改毫秒級實時生效,官方還提供了配置更新監聽且自帶多節點廣播特點,本次重點利用這個特性。
- 另外,Nacos提供了API可主動修改目標配置文件,產生change事件,這也是本次要利用的特性。
快速開始
工程引入Nacos
直接在上篇springboot工程基礎上進行改造。
- pom新增Nacos依賴
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
- application.yml 重命名為 bootstrap.yml,並添加Nacos相關配置
spring: application: name: @project.artifactId@ profiles: active: local thymeleaf: cache: false cloud: nacos: config: server-addr: 127.0.0.1:8848 # 默認為public命名空間,可以省略不寫 #namespace: local #命名空間,用於區分環境或者個人使用 # 指定配置群組 --如果是Public命名空間 則可以省略群組配置 #group: DEFAULT_GROUP # 文件名 -- 如果沒有配置則默認為 ${spring.appliction.name} #prefix: ${spring.application.name} # 指定配置中心中配置文件的格式 file-extension: yml discovery: # 指定注冊中心的地址,如果你不需要注冊該服務,也可以去掉該項,並刪除discovery依賴 server-addr: 127.0.0.1:8848 # 默認為public命名空間,可以省略不寫 #namespace: local #命名空間,用於區分環境 app: drools: # 配置Drools決策表文件路徑,可多個 xlsFilePaths: - D:/temp/person_check.xls
- 啟動本地的Nacos服務
- 啟動工程,注意日志
- 查看Nacos控制台服務注冊列表:http://127.0.0.1:8848/nacos/
- 驗證上篇功能
Nacos配置修改監聽與集群廣播
- 在Nacos控制台添加一個extend配置文件(drools-reload-flag-local.yml,命名空間和分組都采用默認),內容則無所謂
- bootstrap.yml 的nacos配置中心部分添加拓展配置文件讀取
server-addr: 127.0.0.1:8848 # 默認為public命名空間,可以省略不寫 #namespace: local #命名空間,用於區分環境或者個人使用 # 指定配置群組 --如果是Public命名空間 則可以省略群組配置 #group: DEFAULT_GROUP # 文件名 -- 如果沒有配置則默認為 ${spring.appliction.name} #prefix: ${spring.application.name} # 指定配置中心中配置文件的格式 file-extension: yml # 額外文件引入 extension-configs: - data-id: drools-reload-flag-${spring.profiles.active}.yml group: DEFAULT_GROUP refresh: true
- 重啟查看日志讀取情況,可以看到配置已經被發現且被默認監聽
: Started BootDroolsNacos in 6.095 seconds (JVM running for 7.185) : [fixed-127.0.0.1_8848] [add-listener] ok, tenant=, dataId=drools-springboot-nacos.yml, group=DEFAULT_GROUP, cnt=1 : [fixed-127.0.0.1_8848] [add-listener] ok, tenant=, dataId=drools-springboot-nacos, group=DEFAULT_GROUP, cnt=1 : [fixed-127.0.0.1_8848] [add-listener] ok, tenant=, dataId=drools-springboot-nacos-local.yml, group=DEFAULT_GROUP, cnt=1 : [fixed-127.0.0.1_8848] [add-listener] ok, tenant=, dataId=drools-reload-flag-local.yml, group=DEFAULT_GROUP, cnt=1
- 定義配置Bean獲取該配置內容,雖然不會用到...
@Component @ConfigurationProperties(prefix = "drools-reload-flag") @Data public class DroolsReloadFlagConfigPropertiesBean { private Long timestamp; private String updator; }
- controller測試
@Autowired private DroolsReloadFlagConfigPropertiesBean droolsReloadFlagConfigPropertiesBean; @GetMapping("/rule/propeties") public Object ruleProperties() { //實時修改生效(添加了文件需要重啟Nacos?) return droolsReloadFlagConfigPropertiesBean; }
- 添加Nacos目標配置文件修改監聽
try { Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr); properties.put(PropertyKeyConst.NAMESPACE, namespace); ConfigService configService = NacosFactory.createConfigService(properties); String content = configService.getConfig(dataId, group, 5000); if (StringUtils.isEmpty(content)) { log.warn("目標配置內容為空,跳過監聽"); return; } log.info("初始配置內容讀取: {}", content); log.info("開始注冊修改監聽: {}", dataId); configService.addListener(dataId, group, new Listener() { @Override public void receiveConfigInfo(String configInfo) { log.info("{} 本次修改后的內容: {}", dataId, configInfo); //業務邏輯部分,即刷新規則 kieUtilService.reload(); } @Override public Executor getExecutor() { return null; } }); log.info("結束注冊修改監聽: {}", dataId); } catch (NacosException e) { log.error("Nacos配置相關異常:{}", e.getMessage()); throw new RuntimeException("Nacos配置讀取與修改監聽", e); }
- OK
Nacos主動public觸發文件更新監聽
- 和監聽一樣,需要用到Nacos的ConfigService
- Nacos的控制台其實已經有實例,可對目標配置文件進行內容讀取、文件刪除、內容更新/覆蓋,如圖↓
- 可以對其進行簡單封裝,然后寫一個controller方法測試下內容修改,測試是否監聽到
@Autowired private DroolsReloadFlagConfigListener droolsReloadFlagConfigListener; @GetMapping("/rule/config/publish") public Object ruleConfigPublish() throws NacosException { droolsReloadFlagConfigListener.publishConfig(LocalDateTime.now().toString()); return "OK"; }
- 單節點測試監聽OK后,就可以測試下Nacos服務注冊多節點的監聽廣播了。STS下快速復制注冊一個節點很容易,在BootDashboard下對當前的應用Duplicate下,然后修改VM參數端口啟動即可,如圖↓
- 收工
小結
- 本文是緊接Drools的,但標題並沒有繼續取名和Drools相關,因為這種方式是一種Nacos服務注冊列表的廣播方案,和具體業務無關,可以用於各個場景。
- 本次demo源碼就是上篇工程,只不過對其進行了改造。
- 下篇預告:將springboot依賴工程starter化
- 原文地址,歡迎交流
- love & peace