头图

项目简介

本项目主要功能是为了实现在微服务架构下能够动态向配置中心添加新的数据源,并且应用程序能够感知并采用最新的数据源列表,目前sdk已支持nacos和consul

项目地址

gitee:https://gitee.com/binarypursuer/dynamic-datasource-refresher/...
github:https://github.com/binarypursuer/dynamic-datasource-refresher/tree/v1.0.0

项目结构

模块名说明
dynamic-datasource-refresher-api配置中心推送数据源API
dynamic-datasource-refresher-listener应用程序监听感知数据源变化
dynamic-datasource-refresher-spring-boot-starterAPI和监听器自动配置
nacos-exampleNacos使用示例
consul-exampleConsul使用示例

依赖框架版本

框架版本
Spring Cloud2020.0.3
Spring Cloud Alibaba2021.1
dynamic-datasource-spring-boot-starter3.5.1

快速开始

1.引入依赖(SDK已发布至阿里Maven中央仓库,直接引入依赖即可)

<dependency>
    <groupId>io.github.binarypursuer</groupId>
    <artifactId>dynamic-datasource-refresher-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dendency>

2.refresher相关配置,这里以nacos为例

refresher:
  type: nacos
  nacos:
    server-addr: 127.0.0.1:8848
    username: nacos
    password: nacos

3.配置中心配置默认数据源,以yaml为例

spring:
  datasource:
    dynamic:
      primary: master
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver

4.注入ConfigCenterApi推送数据源

package io.github.binarypursuer.refresher.example.nacos.controller;

import io.github.binarypursuer.refresher.api.core.ConfigCenterApi;
import io.github.binarypursuer.refresher.api.enums.ConfigType;
import io.github.binarypursuer.refresher.api.model.DsConfig;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 数据源API
 *
 * @author Pursuer
 * @version 1.0
 * @date 2025/3/2
 */
@RestController
@RequestMapping("/datasource")
public class DatasourceController {

    @Resource
    private ConfigCenterApi configCenterApi;

    @RequestMapping("/push")
    public boolean addDatasource() {
        DsConfig dsConfig = new DsConfig();
        List<DsConfig.ServiceConfig> configs = new ArrayList<>();
        DsConfig.ServiceConfig config = new DsConfig.ServiceConfig();
        config.setDataId("nacos-example");
        config.setGroup("DEFAULT_GROUP");
        config.setType(ConfigType.YAML);
        configs.add(config);
        dsConfig.setServiceConfigs(configs);
        dsConfig.setId("slave");
        dsConfig.setUrl("jdbc:mysql://127.0.0.1:3306/monitor_system?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8");
        dsConfig.setUsername("root");
        dsConfig.setPassword("root");
        dsConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
        return configCenterApi.publish(dsConfig) == configs.size();
    }
}

5.调用接口并查看配置中心变化(可以看到配置中心已经添加了新的数据源)
配置中心变化
6.查看应用程序日志(可以看到应用程序已经感知到新的数据源,并且已经添加到了动态数据源列表中)
应用程序日志

补充说明

本项目的起源主要是在业务项目中多租户分库的场景下,每产生一个新的租户需要创建一个新的数据库,
而且需要在应用程序不停的情况下添加新的数据源并让应用程序感知到变化,所以才开始构思如何去实现这样的需求


Pursuer丶
7 声望4 粉丝

对技术抱有热情,对工作保持严谨!