springboot监听或发布配置到nacos

公司要求平台实现多租户,我实现方案是添加租户,动态创建数据库,然后把最新数据源publish到nacos,通知各实例模块数据源发生变化,各模块接收到通知,从nacos获取最新数据源更新已经初始化的数据源,通过shardingjdbc的分库达到不同租户访问自己数据源的效果,最终实现多租户且数据源完全隔离。整个方案实现细节比较多也有点小复杂,后续有时间写文章详细介绍,此文抠取nacos监听和发布进行分享。

1、bootstrap.yml配置

spring:
  profiles:
    active: @profile.name@
  application:
    name: iot-user
  cloud:
    nacos:
      discovery:
        server-addr: @config.server-addr@
        namespace: @config.namespace@
        group: @config.group@
        watch:
          enabled: false
      config:
        server-addr: @config.server-addr@
        namespace: @config.namespace@
        group: @config.group@
        file-extension: yaml
        prefix: ${spring.application.name}
        extension-configs:
          #流程监控配置
          - dataId: sentinel-@profile.name@.yaml
            refresh: true
          #分库分表实现
          - dataId: sharding-@profile.name@.yaml
            refresh: true

2、nacos的ConfigService创建

package net.wfl.user.biz.config;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import java.util.Properties;

/**
 * nacos配置
 *
 * @author wangfenglei
 */
@Slf4j
@Configuration
public class NacosConfig {
    @Value("${spring.cloud.nacos.config.server-addr}")
    private String serverAddr;
    @Value("${spring.cloud.nacos.config.namespace}")
    private String namespace;

    @Bean
    @Primary
    public ConfigService configService() {
        Properties properties = new Properties();
        properties.put("serverAddr", serverAddr);
        properties.put("namespace", namespace);
        try {
            return NacosFactory.createConfigService(properties);
        } catch (NacosException e) {
            log.error(e.toString(), e);
        }

        return null;
    }
}

3、nacos监听添加,可以在项目启动成功后添加

package net.wfl.user.biz.config.init;

import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import lombok.extern.slf4j.Slf4j;
import net.wfl.user.biz.modules.system.util.AiotConstants;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.Executor;

/**
 * 项目启动后添加监听,实现ApplicationRunner,在项目成功后会自动执行run方法
 *
 * @author wangfenglei
 */
@Slf4j
@Component
public class NacosListener implements ApplicationRunner {
    @Resource
    private ConfigService configService;
    @Value("${spring.cloud.nacos.config.group}")
    private String groupId;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        //添加nacos配置文件监听
        listenerNacosDatasource();
    }

    /**
     * 监听数据源变化
     *
     * @throws Exception 异常
     */
    private void listenerNacosDatasource() throws Exception {
        configService.addListener(AiotConstants.DATA_SOURCE_DATA_ID, groupId, new Listener() {
            @Override
            public void receiveConfigInfo(String configInfo) {
                /**
                 * todo
                 * 业务代码
                 */
                log.info(configInfo);
            }

            @Override
            public Executor getExecutor() {
                return null;
            }
        });
    }

    /**
     * 向nacos发布内容
     *
     * @param content 内容
     * @throws Exception 异常
     */
    private void publishConfig(String content) throws Exception {
        //发布内容
        configService.publishConfig(AiotConstants.DATA_SOURCE_DATA_ID, groupId, content);
    }
}


版权声明:本文为guaotianxia原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。