公司要求平台实现多租户,我实现方案是添加租户,动态创建数据库,然后把最新数据源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: true2、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版权协议,转载请附上原文出处链接和本声明。