From 896dbdeb404bb9ff572a375f537a8a3b43f73e85 Mon Sep 17 00:00:00 2001 From: Lucky <641787296@qq.com> Date: Tue, 21 May 2019 23:57:40 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E6=B7=BB=E5=8A=A0=E6=96=B0?= =?UTF-8?q?=E7=89=B9=E6=80=A7=E3=80=82pigx=20=E5=8A=A8=E6=80=81=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E6=95=B0=E6=8D=AE=E6=BA=90=EF=BC=8C=E4=B8=BA=E5=90=8E?= =?UTF-8?q?=E6=9C=9F=E6=8F=90=E4=BE=9BOnline=E5=BC=80=E5=8F=91=E3=80=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=90=8C=E6=AD=A5=E4=BB=A5=E5=8F=8A=E8=AF=BB?= =?UTF-8?q?=E5=86=99=E5=88=86=E7=A6=BB=E5=81=9A=E5=87=86=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pigx-common/pigx-common-bom/pom.xml | 5 + pigx-common/pigx-common-datasource/pom.xml | 106 ++++++++++++++++++ .../DataSourceAutoConfiguration.java | 16 +++ .../annotation/EnableDynamicDataSource.java | 20 ++++ .../config/DruidDataSourceProperties.java | 2 +- .../datasource}/config/DynamicDataSource.java | 4 +- .../config/DynamicDataSourceConfig.java | 15 ++- .../config/DynamicDatasourceInterceptor.java | 43 +++++++ .../support}/DataSourceConstants.java | 2 +- .../DynamicDataSourceContextHolder.java | 20 +++- .../main/resources/META-INF/spring.factories | 2 + pigx-common/pom.xml | 1 + 12 files changed, 221 insertions(+), 15 deletions(-) create mode 100644 pigx-common/pigx-common-datasource/pom.xml create mode 100644 pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DataSourceAutoConfiguration.java create mode 100644 pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/annotation/EnableDynamicDataSource.java rename {pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen => pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource}/config/DruidDataSourceProperties.java (89%) rename {pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen => pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource}/config/DynamicDataSource.java (75%) rename {pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen => pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource}/config/DynamicDataSourceConfig.java (96%) create mode 100644 pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DynamicDatasourceInterceptor.java rename {pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util => pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/support}/DataSourceConstants.java (90%) rename {pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util => pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/support}/DynamicDataSourceContextHolder.java (54%) create mode 100644 pigx-common/pigx-common-datasource/src/main/resources/META-INF/spring.factories diff --git a/pigx-common/pigx-common-bom/pom.xml b/pigx-common/pigx-common-bom/pom.xml index 1421909af..d75cfa8b2 100644 --- a/pigx-common/pigx-common-bom/pom.xml +++ b/pigx-common/pigx-common-bom/pom.xml @@ -47,6 +47,11 @@ pigx-common-gateway ${pigx.version} + + com.pig4cloud + pigx-common-datasource + ${pigx.version} + com.pig4cloud pigx-common-job diff --git a/pigx-common/pigx-common-datasource/pom.xml b/pigx-common/pigx-common-datasource/pom.xml new file mode 100644 index 000000000..b2d9e0a6c --- /dev/null +++ b/pigx-common/pigx-common-datasource/pom.xml @@ -0,0 +1,106 @@ + + + + pigx-common + com.pig4cloud + 3.0.0 + + 4.0.0 + + com.pig4cloud + pigx-common-datasource + + jar + + pigx 动态切换数据源,为后期提供Online在线开发、读写分离、数据同步做好准备 + + + + org.springframework.boot + spring-boot-starter-jdbc + + + javax.servlet + javax.servlet-api + + + org.springframework + spring-webmvc + + + + com.pig4cloud + pigx-common-core + + + + + com.pig4cloud + pigx-common-data + + + + com.baomidou + mybatis-plus-boot-starter + + + mysql + mysql-connector-java + + + + com.alibaba + druid-spring-boot-starter + + + + com.pig4cloud + pigx-common-core + + + + com.pig4cloud + pigx-common-swagger + + + + com.pig4cloud + pigx-common-security + + + com.pig4cloud + pigx-common-log + + + + velocity + org.apache.velocity + ${velocity.version} + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-undertow + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + com.spotify + docker-maven-plugin + + + + \ No newline at end of file diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DataSourceAutoConfiguration.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DataSourceAutoConfiguration.java new file mode 100644 index 000000000..8729bc376 --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DataSourceAutoConfiguration.java @@ -0,0 +1,16 @@ +package com.pig4cloud.pigx.common.datasource; + +import com.pig4cloud.pigx.common.datasource.config.DruidDataSourceProperties; +import lombok.AllArgsConstructor; +import org.springframework.boot.context.properties.EnableConfigurationProperties; + +/** + * @author Lucky + * @date 2019-05-18 + *

+ * DbAcess 自动配置类 + */ +@AllArgsConstructor +@EnableConfigurationProperties({DruidDataSourceProperties.class}) +public class DataSourceAutoConfiguration { +} diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/annotation/EnableDynamicDataSource.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/annotation/EnableDynamicDataSource.java new file mode 100644 index 000000000..99ebdbd6d --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/annotation/EnableDynamicDataSource.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.common.datasource.annotation; + +import com.pig4cloud.pigx.common.datasource.config.DynamicDataSourceConfig; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +/** + * @author Lucky + * @date 2019-05-18 + *

+ * 开启动态数据源 + */ +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@Import({DynamicDataSourceConfig.class}) +public @interface EnableDynamicDataSource { +} diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/DruidDataSourceProperties.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DruidDataSourceProperties.java similarity index 89% rename from pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/DruidDataSourceProperties.java rename to pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DruidDataSourceProperties.java index d80228ef8..efb00821c 100644 --- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/DruidDataSourceProperties.java +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DruidDataSourceProperties.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pigx.codegen.config; +package com.pig4cloud.pigx.common.datasource.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/DynamicDataSource.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DynamicDataSource.java similarity index 75% rename from pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/DynamicDataSource.java rename to pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DynamicDataSource.java index 252b8d87f..557b5d236 100644 --- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/DynamicDataSource.java +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DynamicDataSource.java @@ -1,6 +1,6 @@ -package com.pig4cloud.pigx.codegen.config; +package com.pig4cloud.pigx.common.datasource.config; -import com.pig4cloud.pigx.codegen.util.DynamicDataSourceContextHolder; +import com.pig4cloud.pigx.common.datasource.support.DynamicDataSourceContextHolder; import lombok.extern.slf4j.Slf4j; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/DynamicDataSourceConfig.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DynamicDataSourceConfig.java similarity index 96% rename from pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/DynamicDataSourceConfig.java rename to pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DynamicDataSourceConfig.java index 88bf9ca93..b0d0d22df 100644 --- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/DynamicDataSourceConfig.java +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DynamicDataSourceConfig.java @@ -1,8 +1,13 @@ -package com.pig4cloud.pigx.codegen.config; +package com.pig4cloud.pigx.common.datasource.config; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import javax.annotation.PostConstruct; import com.alibaba.druid.pool.DruidDataSource; import com.mysql.cj.jdbc.Driver; -import com.pig4cloud.pigx.codegen.util.DataSourceConstants; +import com.pig4cloud.pigx.common.datasource.support.DataSourceConstants; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jasypt.encryption.StringEncryptor; @@ -14,12 +19,6 @@ import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.TransactionManagementConfigurer; -import javax.annotation.PostConstruct; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - /** * @author lengleng * @date 2019-03-31 diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DynamicDatasourceInterceptor.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DynamicDatasourceInterceptor.java new file mode 100644 index 000000000..af25dc51d --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DynamicDatasourceInterceptor.java @@ -0,0 +1,43 @@ +package com.pig4cloud.pigx.common.datasource.config; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import com.pig4cloud.pigx.common.datasource.support.DynamicDataSourceContextHolder; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.lang.Nullable; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +/** + * @author lengleng + * @date 2019-05-18 + *

+ * 动态数据源拦截器 + */ +@Slf4j +@Component +@AllArgsConstructor +public class DynamicDatasourceInterceptor implements HandlerInterceptor { + private final RedisTemplate redisTemplate; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(String.class)); + HashOperations vo = redisTemplate.opsForHash(); +// String dbName = vo.get("db_route_key", 1); + DynamicDataSourceContextHolder.setDataSourceType(1); + log.info("数据源切换:{}", 1); + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, + @Nullable Exception ex) { + DynamicDataSourceContextHolder.clearDataSourceType(); + } + +} diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/DataSourceConstants.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/support/DataSourceConstants.java similarity index 90% rename from pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/DataSourceConstants.java rename to pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/support/DataSourceConstants.java index 9bc663d87..7c9502ad6 100644 --- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/DataSourceConstants.java +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/support/DataSourceConstants.java @@ -1,4 +1,4 @@ -package com.pig4cloud.pigx.codegen.util; +package com.pig4cloud.pigx.common.datasource.support; /** * @author lengleng diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/DynamicDataSourceContextHolder.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/support/DynamicDataSourceContextHolder.java similarity index 54% rename from pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/DynamicDataSourceContextHolder.java rename to pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/support/DynamicDataSourceContextHolder.java index 4e0c2d546..d082585d4 100644 --- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/DynamicDataSourceContextHolder.java +++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/support/DynamicDataSourceContextHolder.java @@ -1,25 +1,39 @@ -package com.pig4cloud.pigx.codegen.util; +package com.pig4cloud.pigx.common.datasource.support; import lombok.experimental.UtilityClass; /** * @author lengleng - * @date 2019-03-31 + * @date 2019-05-18 *

- * 保存上线文中数据库路由 + * 根据当前线程来选择具体的数据源 */ @UtilityClass public class DynamicDataSourceContextHolder { private final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); + /** + * 提供给AOP去设置当前的线程的数据源的信息 + * + * @param dataSourceType + */ public void setDataSourceType(Integer dataSourceType) { CONTEXT_HOLDER.set(dataSourceType); } + /** + * 提供给AbstractRoutingDataSource的实现类,通过key选择数据源 + * + * @return + */ public Integer getDataSourceType() { return CONTEXT_HOLDER.get(); } + /** + * 使用默认的数据源 + * + */ public void clearDataSourceType() { CONTEXT_HOLDER.remove(); } diff --git a/pigx-common/pigx-common-datasource/src/main/resources/META-INF/spring.factories b/pigx-common/pigx-common-datasource/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..15efe41d9 --- /dev/null +++ b/pigx-common/pigx-common-datasource/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.pig4cloud.pigx.common.datasource.DataSourceAutoConfiguration \ No newline at end of file diff --git a/pigx-common/pom.xml b/pigx-common/pom.xml index e4603a538..4148d1937 100644 --- a/pigx-common/pom.xml +++ b/pigx-common/pom.xml @@ -44,5 +44,6 @@ pigx-common-swagger pigx-common-transaction pigx-common-autopoi + pigx-common-datasource