集群多節點動態刷新方案-Nacos配置修改監聽


本篇就不對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,命名空間和分組都采用默認),內容則無所謂
    新增Nacos配置文件
  • 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的控制台其實已經有實例,可對目標配置文件進行內容讀取、文件刪除、內容更新/覆蓋,如圖↓
    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參數端口啟動即可,如圖↓
    STS快速多節點測試截圖
  • 收工

小結

  • 本文是緊接Drools的,但標題並沒有繼續取名和Drools相關,因為這種方式是一種Nacos服務注冊列表的廣播方案,和具體業務無關,可以用於各個場景。
  • 本次demo源碼就是上篇工程,只不過對其進行了改造。
  • 下篇預告:將springboot依賴工程starter化
  • 原文地址,歡迎交流
  • love & peace


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM