From 5332ee8ce3d2ba3635401325f837385cdb2fbc0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Tue, 14 Jan 2025 16:37:41 +0800 Subject: [PATCH] =?UTF-8?q?refactor(common-datasource):=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E5=8A=A8=E6=80=81=E6=95=B0=E6=8D=AE=E6=BA=90=EF=BC=8C?= =?UTF-8?q?=E5=90=8C=E6=94=AF=E6=8C=81=20YAML=20+=20JDBC=20=EF=BC=8C?= =?UTF-8?q?=E5=85=BC=E5=AE=B9Druid=20=E6=A0=87=E5=87=86=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicDataSourceAutoConfiguration.java | 117 ++++++++++-------- .../config/JdbcDynamicDataSourceProvider.java | 76 ++++++------ .../config/MasterDataSourceProvider.java | 72 +++++++++++ 3 files changed, 175 insertions(+), 90 deletions(-) create mode 100644 pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/MasterDataSourceProvider.java diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DynamicDataSourceAutoConfiguration.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DynamicDataSourceAutoConfiguration.java index ccfc83396..2199bf82a 100644 --- a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DynamicDataSourceAutoConfiguration.java +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DynamicDataSourceAutoConfiguration.java @@ -20,7 +20,6 @@ package com.pig4cloud.pigx.common.datasource; import com.baomidou.dynamic.datasource.creator.DataSourceCreator; import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator; import com.baomidou.dynamic.datasource.creator.druid.DruidDataSourceCreator; -import com.baomidou.dynamic.datasource.creator.hikaricp.HikariDataSourceCreator; import com.baomidou.dynamic.datasource.processor.DsJakartaHeaderProcessor; import com.baomidou.dynamic.datasource.processor.DsJakartaSessionProcessor; import com.baomidou.dynamic.datasource.processor.DsProcessor; @@ -31,9 +30,7 @@ import lombok.RequiredArgsConstructor; import org.jasypt.encryption.StringEncryptor; import org.springframework.beans.factory.BeanFactory; import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -56,57 +53,73 @@ import java.util.List; @EnableConfigurationProperties(DruidDataSourceProperties.class) public class DynamicDataSourceAutoConfiguration { - /** - * 获取动态数据源提供者 - * @param defaultDataSourceCreator 默认数据源创建器 - * @param stringEncryptor 字符串加密器 - * @param properties 数据源属性 - * @return 动态数据源提供者 - */ - @Bean - public DynamicDataSourceProvider dynamicDataSourceProvider(DefaultDataSourceCreator defaultDataSourceCreator, - StringEncryptor stringEncryptor, DruidDataSourceProperties properties) { - return new JdbcDynamicDataSourceProvider(defaultDataSourceCreator, stringEncryptor, properties); - } + /** + * 获取动态数据源提供者 + * + * @param defaultDataSourceCreator 默认数据源创建器 + * @param stringEncryptor 字符串加密器 + * @param properties 数据源属性 + * @return 动态数据源提供者 + */ + @Bean + public DynamicDataSourceProvider dynamicDataSourceProvider(DefaultDataSourceCreator defaultDataSourceCreator, + StringEncryptor stringEncryptor, DruidDataSourceProperties properties) { + return new JdbcDynamicDataSourceProvider(defaultDataSourceCreator, stringEncryptor, properties); + } - /** - * 获取默认数据源创建器 - * @param druidDataSourceCreator Druid数据源创建器 - * @return 默认数据源创建器 - */ - @Bean - public DefaultDataSourceCreator defaultDataSourceCreator(DruidDataSourceCreator druidDataSourceCreator) { - DefaultDataSourceCreator defaultDataSourceCreator = new DefaultDataSourceCreator(); - List creators = new ArrayList<>(); - creators.add(druidDataSourceCreator); - defaultDataSourceCreator.setCreators(creators); - return defaultDataSourceCreator; - } + /** + * 主数据源提供程序 + * + * @param defaultDataSourceCreator 默认数据源创建者 + * @param properties 性能 + * @return {@link DynamicDataSourceProvider } + */ + @Bean + public DynamicDataSourceProvider masterDataSourceProvider(DefaultDataSourceCreator defaultDataSourceCreator, DruidDataSourceProperties properties) { + return new MasterDataSourceProvider(defaultDataSourceCreator, properties); + } - /** - * 获取数据源处理器 - * @return 数据源处理器 - */ - @Bean - public DsProcessor dsProcessor(BeanFactory beanFactory) { - DsProcessor lastParamDsProcessor = new LastParamDsProcessor(); - DsProcessor headerProcessor = new DsJakartaHeaderProcessor(); - DsProcessor sessionProcessor = new DsJakartaSessionProcessor(); - DsSpelExpressionProcessor spelExpressionProcessor = new DsSpelExpressionProcessor(); - spelExpressionProcessor.setBeanResolver(new BeanFactoryResolver(beanFactory)); - lastParamDsProcessor.setNextProcessor(headerProcessor); - headerProcessor.setNextProcessor(sessionProcessor); - sessionProcessor.setNextProcessor(spelExpressionProcessor); - return lastParamDsProcessor; - } + /** + * 获取默认数据源创建器 + * + * @param druidDataSourceCreator Druid数据源创建器 + * @return 默认数据源创建器 + */ + @Bean + public DefaultDataSourceCreator defaultDataSourceCreator(DruidDataSourceCreator druidDataSourceCreator) { + DefaultDataSourceCreator defaultDataSourceCreator = new DefaultDataSourceCreator(); + List creators = new ArrayList<>(); + creators.add(druidDataSourceCreator); + defaultDataSourceCreator.setCreators(creators); + return defaultDataSourceCreator; + } - /** - * 获取清除TTL数据源过滤器 - * @return 清除TTL数据源过滤器 - */ - @Bean - public ClearTtlDataSourceFilter clearTtlDsFilter() { - return new ClearTtlDataSourceFilter(); - } + /** + * 获取数据源处理器 + * + * @return 数据源处理器 + */ + @Bean + public DsProcessor dsProcessor(BeanFactory beanFactory) { + DsProcessor lastParamDsProcessor = new LastParamDsProcessor(); + DsProcessor headerProcessor = new DsJakartaHeaderProcessor(); + DsProcessor sessionProcessor = new DsJakartaSessionProcessor(); + DsSpelExpressionProcessor spelExpressionProcessor = new DsSpelExpressionProcessor(); + spelExpressionProcessor.setBeanResolver(new BeanFactoryResolver(beanFactory)); + lastParamDsProcessor.setNextProcessor(headerProcessor); + headerProcessor.setNextProcessor(sessionProcessor); + sessionProcessor.setNextProcessor(spelExpressionProcessor); + return lastParamDsProcessor; + } + + /** + * 获取清除TTL数据源过滤器 + * + * @return 清除TTL数据源过滤器 + */ + @Bean + public ClearTtlDataSourceFilter clearTtlDsFilter() { + return new ClearTtlDataSourceFilter(); + } } diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/JdbcDynamicDataSourceProvider.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/JdbcDynamicDataSourceProvider.java index 0dbed092f..6bf216967 100644 --- a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/JdbcDynamicDataSourceProvider.java +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/JdbcDynamicDataSourceProvider.java @@ -24,6 +24,7 @@ import com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider; import com.pig4cloud.pigx.common.datasource.support.DataSourceConstants; import com.pig4cloud.pigx.common.datasource.util.DsConfTypeEnum; import com.pig4cloud.pigx.common.datasource.util.DsJdbcUrlEnum; +import lombok.extern.slf4j.Slf4j; import org.jasypt.encryption.StringEncryptor; import java.sql.ResultSet; @@ -38,7 +39,9 @@ import java.util.Map; *

* 从数据源中获取 配置信息 */ +@Slf4j public class JdbcDynamicDataSourceProvider extends AbstractJdbcDataSourceProvider { + private static final String SQL_LOG_FILTER = "sqlLogFilter"; private final DruidDataSourceProperties properties; @@ -62,52 +65,49 @@ public class JdbcDynamicDataSourceProvider extends AbstractJdbcDataSourceProvide */ @Override protected Map executeStmt(Statement statement) throws SQLException { - ResultSet rs = statement.executeQuery(properties.getQueryDsSql()); Map map = new HashMap<>(8); - while (rs.next()) { - String name = rs.getString(DataSourceConstants.NAME); - String username = rs.getString(DataSourceConstants.DS_USER_NAME); - String password = rs.getString(DataSourceConstants.DS_USER_PWD); - Integer confType = rs.getInt(DataSourceConstants.DS_CONFIG_TYPE); - String dsType = rs.getString(DataSourceConstants.DS_TYPE); - DataSourceProperty property = new DataSourceProperty(); - property.setUsername(username); - property.setPassword(stringEncryptor.decrypt(password)); + try { + ResultSet rs = statement.executeQuery(properties.getQueryDsSql()); - String url; - // JDBC 配置形式 - DsJdbcUrlEnum urlEnum = DsJdbcUrlEnum.get(dsType); - if (DsConfTypeEnum.JDBC.getType().equals(confType)) { - url = rs.getString(DataSourceConstants.DS_JDBC_URL); - } else { - String host = rs.getString(DataSourceConstants.DS_HOST); - String port = rs.getString(DataSourceConstants.DS_PORT); - String dsName = rs.getString(DataSourceConstants.DS_NAME); - url = String.format(urlEnum.getUrl(), host, port, dsName); + while (rs.next()) { + String name = rs.getString(DataSourceConstants.NAME); + String username = rs.getString(DataSourceConstants.DS_USER_NAME); + String password = rs.getString(DataSourceConstants.DS_USER_PWD); + Integer confType = rs.getInt(DataSourceConstants.DS_CONFIG_TYPE); + String dsType = rs.getString(DataSourceConstants.DS_TYPE); + + DataSourceProperty property = new DataSourceProperty(); + property.setUsername(username); + property.setPassword(stringEncryptor.decrypt(password)); + + String url; + // JDBC 配置形式 + DsJdbcUrlEnum urlEnum = DsJdbcUrlEnum.get(dsType); + if (DsConfTypeEnum.JDBC.getType().equals(confType)) { + url = rs.getString(DataSourceConstants.DS_JDBC_URL); + } else { + String host = rs.getString(DataSourceConstants.DS_HOST); + String port = rs.getString(DataSourceConstants.DS_PORT); + String dsName = rs.getString(DataSourceConstants.DS_NAME); + url = String.format(urlEnum.getUrl(), host, port, dsName); + } + + // Druid Config + DruidConfig druidConfig = new DruidConfig(); + druidConfig.setProxyFilters(SQL_LOG_FILTER); + druidConfig.setValidationQuery(urlEnum.getValidationQuery()); + property.setDruid(druidConfig); + property.setUrl(url); + + map.put(name, property); } - // Druid Config - DruidConfig druidConfig = new DruidConfig(); - druidConfig.setProxyFilters(SQL_LOG_FILTER); - druidConfig.setValidationQuery(urlEnum.getValidationQuery()); - property.setDruid(druidConfig); - property.setUrl(url); - - map.put(name, property); + } catch (Exception e) { + log.warn("动态数据源配置表异常:{}", e.getMessage()); } - // 添加默认主数据源 - DataSourceProperty property = new DataSourceProperty(); - property.setUsername(properties.getUsername()); - property.setPassword(properties.getPassword()); - property.setUrl(properties.getUrl()); - - DruidConfig druidConfig = new DruidConfig(); - druidConfig.setProxyFilters(SQL_LOG_FILTER); - property.setDruid(druidConfig); - map.put(DataSourceConstants.DS_MASTER, property); return map; } diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/MasterDataSourceProvider.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/MasterDataSourceProvider.java new file mode 100644 index 000000000..567fb7862 --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/MasterDataSourceProvider.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.datasource.config; + +import com.baomidou.dynamic.datasource.creator.DataSourceProperty; +import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator; +import com.baomidou.dynamic.datasource.creator.druid.DruidConfig; +import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider; + +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.Map; + +import static com.pig4cloud.pigx.common.datasource.support.DataSourceConstants.DS_MASTER; + +/** + * @author lengleng + * @date 2025/1/14 + *

+ * 保证原有的 druid 配置有效性,只需要增加其他扩展数据源即可 + */ +public class MasterDataSourceProvider extends AbstractDataSourceProvider { + + private static final String SQL_LOG_FILTER = "sqlLogFilter"; + + private final DruidDataSourceProperties properties; + + private final DefaultDataSourceCreator defaultDataSourceCreator; + + public MasterDataSourceProvider(DefaultDataSourceCreator defaultDataSourceCreator, DruidDataSourceProperties properties) { + super(defaultDataSourceCreator); + this.properties = properties; + this.defaultDataSourceCreator = defaultDataSourceCreator; + } + + + /** + * 加载所有数据源 + * + * @return 所有数据源,key为数据源名称 + */ + @Override + public Map loadDataSources() { + Map map = new HashMap<>(); + // 添加默认主数据源 + DataSourceProperty property = new DataSourceProperty(); + property.setUsername(properties.getUsername()); + property.setPassword(properties.getPassword()); + property.setUrl(properties.getUrl()); + + DruidConfig druidConfig = new DruidConfig(); + druidConfig.setProxyFilters(SQL_LOG_FILTER); + property.setDruid(druidConfig); + map.put(DS_MASTER, defaultDataSourceCreator.createDataSource(property)); + return map; + } +}