diff --git a/muyu-modules/muyu-many-datasource/pom.xml b/muyu-modules/muyu-many-datasource/pom.xml new file mode 100644 index 0000000..f2f6dee --- /dev/null +++ b/muyu-modules/muyu-many-datasource/pom.xml @@ -0,0 +1,113 @@ + + + 4.0.0 + + com.muyu + muyu-modules + 3.6.3 + + + muyu-many-datasource + + 动态多数据源 + + + 17 + 17 + UTF-8 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + io.springfox + springfox-swagger-ui + ${swagger.fox.version} + + + + + com.mysql + mysql-connector-j + + + + + com.muyu + muyu-common-datasource + + + + + com.muyu + muyu-common-datascope + + + + + com.muyu + muyu-common-log + + + + + com.muyu + muyu-common-swagger + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + + + + diff --git a/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/MuYuManyDataSourceApplication.java b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/MuYuManyDataSourceApplication.java new file mode 100644 index 0000000..2116c96 --- /dev/null +++ b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/MuYuManyDataSourceApplication.java @@ -0,0 +1,27 @@ +package com.muyu.many.datasource; + +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; +import com.muyu.common.security.annotation.EnableCustomConfig; +import com.muyu.common.security.annotation.EnableMyFeignClients; +import com.muyu.common.swagger.annotation.EnableCustomSwagger2; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; + +/** + * 多数据源启动类 CloudManyDataSourceApplication + * + * @author DeKangLiu + * Date 2024/6/3 18:51 + */ +@EnableCustomConfig +@EnableCustomSwagger2 +@EnableMyFeignClients +@SpringBootApplication(exclude = + {DynamicDataSourceAutoConfiguration.class, DataSourceAutoConfiguration.class} +) +public class MuYuManyDataSourceApplication { + public static void main (String[] args) { + SpringApplication.run(MuYuManyDataSourceApplication.class, args); + } +} diff --git a/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/DatasourceContent.java b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/DatasourceContent.java new file mode 100644 index 0000000..c5b0a8a --- /dev/null +++ b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/DatasourceContent.java @@ -0,0 +1,15 @@ +package com.muyu.many.datasource.config; + +/** + * @author DongZl + * @description: 数据源常量 + * @Date 2023-8-1 上午 11:02 + */ +public class DatasourceContent { + + public final static String DATASOURCE_URL = "jdbc:mysql://{}:{}/vehicle_networking?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8"; + + public final static String USER_NAME = "root"; + + public final static String PASSWORD = "root"; +} diff --git a/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/ManyDataSource.java b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/ManyDataSource.java new file mode 100644 index 0000000..7b551f3 --- /dev/null +++ b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/ManyDataSource.java @@ -0,0 +1,40 @@ +package com.muyu.many.datasource.config; + +import com.muyu.many.datasource.config.factory.DruidDataSourceFactory; +import com.muyu.many.datasource.config.role.DynamicDataSource; +import lombok.extern.log4j.Log4j2; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * 多数据源 ManyDataSource + * + * @author DeKangLiu + * Date 2024/6/3 20:01 + */ +@Configuration +@Log4j2 +public class ManyDataSource { + + @Bean + @Primary + public DynamicDataSource dynamicDataSource(DruidDataSourceFactory druidDataSourceFactory) { + + Map dataSourceMap = new HashMap<>(); + getDataSourceInfoList().forEach(dataSourceInfo -> { + dataSourceMap.put(dataSourceInfo.getKey(), createDataSourceConnection(dataSourceInfo)); + }); + //设置动态数据源 + DynamicDataSource dynamicDataSource = new DynamicDataSource(); +// dynamicDataSource.setDefaultTargetDataSource(masterDataSource()); + dynamicDataSource.setTargetDataSources(dataSourceMap); + //将数据源信息备份在defineTargetDataSources中 + dynamicDataSource.setDefineTargetDataSources(dataSourceMap); + return dynamicDataSource; + } +} diff --git a/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/domain/model/DataSourceInfo.java b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/domain/model/DataSourceInfo.java new file mode 100644 index 0000000..8efdb8b --- /dev/null +++ b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/domain/model/DataSourceInfo.java @@ -0,0 +1,53 @@ +package com.muyu.many.datasource.config.domain.model; + + +import com.muyu.common.core.utils.StringUtils; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import static com.muyu.many.datasource.config.DatasourceContent.*; + + +/** + * @author DongZl + * @description: 数据源实体类 + * @Date 2023-8-1 上午 11:15 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DataSourceInfo { + + /** + * 键 + */ + private String key; + + /** + * 地址 + */ + private String url; + + /** + * 用户名 + */ + private String userName; + + /** + * 用户密码 + */ + private String password; + + + public static DataSourceInfo hostAndPortBuild(String key,String host, String port){ + return DataSourceInfo.builder() + .key(key) + .url(StringUtils.format(DATASOURCE_URL, host, port,port)) + .password(PASSWORD) + .userName(USER_NAME) + .build(); + } +} diff --git a/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/factory/DruidDataSourceFactory.java b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/factory/DruidDataSourceFactory.java new file mode 100644 index 0000000..1f5c9eb --- /dev/null +++ b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/factory/DruidDataSourceFactory.java @@ -0,0 +1,39 @@ +package com.muyu.many.datasource.config.factory; + +import com.alibaba.druid.pool.DruidDataSource; +import com.muyu.many.datasource.config.domain.model.DataSourceInfo; +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Component; + +import java.sql.SQLException; + +/** + * Druid工厂 DruidDataSourceFactory + * + * @author DeKangLiu + * Date 2024/6/3 20:12 + */ +@Log4j2 +@Component +public class DruidDataSourceFactory { + /** + * @Description: 根据传递的数据源信息测试数据库连接 + * @Author Dongzl + */ + public DruidDataSource create(DataSourceInfo dataSourceInfo) { + DruidDataSource druidDataSource = new DruidDataSource(); + druidDataSource.setUrl(dataSourceInfo.getUrl()); + druidDataSource.setUsername(dataSourceInfo.getUserName()); + druidDataSource.setPassword(dataSourceInfo.getPassword()); + druidDataSource.setBreakAfterAcquireFailure(true); + druidDataSource.setConnectionErrorRetryAttempts(0); + try { + druidDataSource.getConnection(2000); + log.info("{} -> 数据源连接成功", dataSourceInfo.getKey()); + return druidDataSource; + } catch (SQLException throwables) { + log.error("数据源 {} 连接失败,用户名:{},密码 {}",dataSourceInfo.getUrl(),dataSourceInfo.getUserName(),dataSourceInfo.getPassword()); + return null; + } + } +} diff --git a/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/holder/DynamicDataSourceHolder.java b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/holder/DynamicDataSourceHolder.java new file mode 100644 index 0000000..9d435a8 --- /dev/null +++ b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/holder/DynamicDataSourceHolder.java @@ -0,0 +1,42 @@ +package com.muyu.many.datasource.config.holder; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.Assert; + +/** + * 数据源切换处理 + * + * @author Dongzl + */ +@Slf4j +public class DynamicDataSourceHolder { + /** + * 保存动态数据源名称 + */ + private static final ThreadLocal DYNAMIC_DATASOURCE_KEY = new ThreadLocal<>(); + + /** + * 设置/切换数据源,决定当前线程使用哪个数据源 + */ + public static void setDynamicDataSourceKey(String key){ + log.info("数据源切换为:{}",key); + DYNAMIC_DATASOURCE_KEY.set(key); + } + + /** + * 获取动态数据源名称,默认使用mater数据源 + */ + public static String getDynamicDataSourceKey(){ + String key = DYNAMIC_DATASOURCE_KEY.get(); + Assert.notNull(key, "请携带数据标识"); + return key; + } + + /** + * 移除当前数据源 + */ + public static void removeDynamicDataSourceKey(){ + log.info("移除数据源:{}",DYNAMIC_DATASOURCE_KEY.get()); + DYNAMIC_DATASOURCE_KEY.remove(); + } +} diff --git a/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/role/DynamicDataSource.java b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/role/DynamicDataSource.java new file mode 100644 index 0000000..f338b66 --- /dev/null +++ b/muyu-modules/muyu-many-datasource/src/main/java/com/muyu/many/datasource/config/role/DynamicDataSource.java @@ -0,0 +1,31 @@ +package com.muyu.many.datasource.config.role; + +import com.muyu.many.datasource.config.holder.DynamicDataSourceHolder; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +import java.util.Map; + +/** + * 动态数据源 + * 调用AddDefineDataSource组件的addDefineDynamicDataSource()方法,获取原来targetdatasources的map,并将新的数据源信息添加到map中,并替换targetdatasources中的map + * 切换数据源时可以使用@DataSource(value = "数据源名称"),或者DynamicDataSourceContextHolder.setContextKey("数据源名称") + * @author Dongzl + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DynamicDataSource extends AbstractRoutingDataSource { + //备份所有数据源信息,备份的是个 指针!!! + private Map defineTargetDataSources; + + /** + * 决定当前线程使用哪个数据源 + */ + @Override + protected Object determineCurrentLookupKey() { + return DynamicDataSourceHolder.getDynamicDataSourceKey(); + } +} diff --git a/muyu-modules/muyu-many-datasource/src/main/resources/banner.txt b/muyu-modules/muyu-many-datasource/src/main/resources/banner.txt new file mode 100644 index 0000000..0dd5eee --- /dev/null +++ b/muyu-modules/muyu-many-datasource/src/main/resources/banner.txt @@ -0,0 +1,2 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} diff --git a/muyu-modules/muyu-many-datasource/src/main/resources/bootstrap.yml b/muyu-modules/muyu-many-datasource/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..cac2c7f --- /dev/null +++ b/muyu-modules/muyu-many-datasource/src/main/resources/bootstrap.yml @@ -0,0 +1,30 @@ +# Tomcat +server: + port: 9206 + +# Spring +spring: + application: + # 应用名称 + name: muyu-many-datasource + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 127.0.0.1:8848 + namespace: jinmo + config: + # 配置中心地址 + server-addr: 127.0.0.1:8848 + namespace: jinmo + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} +logging: + level: + com.muyu.many.datasource.mapper: DEBUG diff --git a/muyu-modules/muyu-many-datasource/src/main/resources/logback.xml b/muyu-modules/muyu-many-datasource/src/main/resources/logback.xml new file mode 100644 index 0000000..732d269 --- /dev/null +++ b/muyu-modules/muyu-many-datasource/src/main/resources/logback.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + diff --git a/muyu-modules/pom.xml b/muyu-modules/pom.xml index 6a377cc..5225db4 100644 --- a/muyu-modules/pom.xml +++ b/muyu-modules/pom.xml @@ -15,6 +15,7 @@ muyu-file muyu-net-working muyu-customer-business + muyu-many-datasource muyu-modules