From 5b18c5a8c26194474b65b180c6e87e180a03c646 Mon Sep 17 00:00:00 2001
From: heheng <475597332@qq.com>
Date: 星期五, 18 四月 2025 14:08:03 +0800
Subject: [PATCH] sharding版本

---
 hazmat-admin/src/main/resources/application-dev.yml                                                 |    2 
 hazmat-framework/pom.xml                                                                            |   12 ++
 hazmat-common/src/main/java/com/gkhy/hazmat/common/enums/DataSourceType.java                        |    6 +
 hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DynamicDataSourceContextHolder.java |    2 
 hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DruidConfig.java                    |   21 ++++
 hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/properties/ShardingProperties.java  |   15 +++
 hazmat-admin/src/main/resources/application-sharding-dev.yml                                        |   66 ++++++++++++++++
 hazmat-framework/src/main/java/com/gkhy/hazmat/framework/aspectj/DataSourceAspect.java              |   74 ++++++++++++++++++
 pom.xml                                                                                             |    6 +
 hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DynamicDataSource.java              |    1 
 hazmat-admin/src/main/resources/application.yml                                                     |    4 
 11 files changed, 201 insertions(+), 8 deletions(-)

diff --git a/hazmat-admin/src/main/resources/application-dev.yml b/hazmat-admin/src/main/resources/application-dev.yml
index 6b2a6c3..231b1b1 100644
--- a/hazmat-admin/src/main/resources/application-dev.yml
+++ b/hazmat-admin/src/main/resources/application-dev.yml
@@ -5,7 +5,7 @@
     druid:
       # 主库数据源
       master:
-        url: jdbc:mysql://192.168.2.16:7006/hazmat_manage?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true
+        url: jdbc:mysql://192.168.2.29:7006/hazmat_manage?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true
         username: root
         password: 2farwL3yPXfbH2AP
       # 从库数据源
diff --git a/hazmat-admin/src/main/resources/application-sharding-dev.yml b/hazmat-admin/src/main/resources/application-sharding-dev.yml
new file mode 100644
index 0000000..b5c5e32
--- /dev/null
+++ b/hazmat-admin/src/main/resources/application-sharding-dev.yml
@@ -0,0 +1,66 @@
+# 数据源
+dataSources:
+  sharding:
+    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://192.168.2.29:7006/hazmat_manage?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+    username: root
+    password: 2farwL3yPXfbH2AP
+    maxTotal: 100
+#  ds_1:
+#    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
+#    driverClassName: com.mysql.cj.jdbc.Driver
+#    url: jdbc:mysql://localhost:3306/ry-order2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+#    username: root
+#    password: root
+#    maxTotal: 100
+rules:
+  - !SHARDING
+    tables:
+      hz_hazmat:
+        actualDataNodes: sharding.hz_hazmat_$->{0..19}
+        tableStrategy:
+          standard:
+            shardingColumn: company_id
+            shardingAlgorithmName: hz_hazmat_inline
+      hz_hazmat_flow:
+        actualDataNodes: sharding.hz_hazmat_flow_$->{0..19}
+        tableStrategy:
+          standard:
+            shardingColumn: company_id
+            shardingAlgorithmName: hz_hazmat_flow_inline
+      hz_product:
+        actualDataNodes: sharding.hz_product_$->{0..19}
+        tableStrategy:
+          standard:
+            shardingColumn: company_id
+            shardingAlgorithmName: hz_product_inline
+      hz_product_flow:
+        actualDataNodes: sharding.hz_product_flow_$->{0..19}
+        tableStrategy:
+          standard:
+            shardingColumn: company_id
+            shardingAlgorithmName: hz_product_flow_inline
+    shardingAlgorithms:
+      hz_hazmat_inline:
+        type: INLINE
+        props:
+          algorithm-expression: hz_hazmat_$->{company_id % 20}
+      hz_hazmat_flow_inline:
+        type: INLINE
+        props:
+          algorithm-expression: hz_hazmat_flow_$->{company_id % 20}
+      hz_product_inline:
+        type: INLINE
+        props:
+          algorithm-expression: hz_product_$->{company_id % 20}
+      hz_product_flow_inline:
+        type: INLINE
+        props:
+          algorithm-expression: hz_product_flow_$->{company_id % 20}
+    keyGenerators:
+      snowflake:
+        type: SNOWFLAKE
+props:
+  sql-show: true  # 是否打印sql
+
diff --git a/hazmat-admin/src/main/resources/application.yml b/hazmat-admin/src/main/resources/application.yml
index 93d1491..9454be8 100644
--- a/hazmat-admin/src/main/resources/application.yml
+++ b/hazmat-admin/src/main/resources/application.yml
@@ -13,7 +13,9 @@
   mvc:
     pathmatch:
       matching-strategy: ant_path_matcher
-
+      #分库分表
+  shardingsphere:
+    configLocation: application-sharding-dev.yml
 server:
   port: 8083
   servlet:
diff --git a/hazmat-common/src/main/java/com/gkhy/hazmat/common/enums/DataSourceType.java b/hazmat-common/src/main/java/com/gkhy/hazmat/common/enums/DataSourceType.java
index 2d1e876..bf2050d 100644
--- a/hazmat-common/src/main/java/com/gkhy/hazmat/common/enums/DataSourceType.java
+++ b/hazmat-common/src/main/java/com/gkhy/hazmat/common/enums/DataSourceType.java
@@ -11,5 +11,9 @@
     /**
      * 从库
      */
-    SLAVE
+    SLAVE,
+    /**
+     * 分库
+     */
+    SHARDING;
 }
diff --git a/hazmat-framework/pom.xml b/hazmat-framework/pom.xml
index c322721..4e06497 100644
--- a/hazmat-framework/pom.xml
+++ b/hazmat-framework/pom.xml
@@ -28,7 +28,16 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
-
+        <!-- 阿里数据库连接池 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
+            <version>5.2.0</version>
+        </dependency>
         <!-- 验证码 -->
         <dependency>
             <groupId>pro.fessional</groupId>
@@ -40,6 +49,7 @@
                 </exclusion>
             </exclusions>
         </dependency>
+
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/aspectj/DataSourceAspect.java b/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/aspectj/DataSourceAspect.java
new file mode 100644
index 0000000..049c2d0
--- /dev/null
+++ b/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/aspectj/DataSourceAspect.java
@@ -0,0 +1,74 @@
+package com.gkhy.hazmat.framework.aspectj;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import com.gkhy.hazmat.common.annotation.DataSource;
+import com.gkhy.hazmat.framework.config.DynamicDataSourceContextHolder;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import com.gkhy.hazmat.common.utils.StringUtils;
+import java.util.Objects;
+
+/**
+ * 多数据源处理
+ * 
+ * @author ruoyi
+ */
+@Aspect
+@Order(1)
+@Component
+public class DataSourceAspect
+{
+    protected Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Pointcut("@annotation(com.gkhy.hazmat.common.annotation.DataSource)"
+            + "|| @within(com.gkhy.hazmat.common.annotation.DataSource)")
+    public void dsPointCut()
+    {
+
+    }
+
+    @Around("dsPointCut()")
+    public Object around(ProceedingJoinPoint point) throws Throwable
+    {
+        DataSource dataSource = getDataSource(point);
+
+        if (ObjectUtil.isNotNull(dataSource))
+        {
+            DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name());
+        }
+
+        try
+        {
+            return point.proceed();
+        }
+        finally
+        {
+            // 销毁数据源 在执行方法之后
+            DynamicDataSourceContextHolder.clearDataSourceType();
+        }
+    }
+
+    /**
+     * 获取需要切换的数据源
+     */
+    public DataSource getDataSource(ProceedingJoinPoint point)
+    {
+        MethodSignature signature = (MethodSignature) point.getSignature();
+        DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class);
+        if (Objects.nonNull(dataSource))
+        {
+            return dataSource;
+        }
+
+        return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class);
+    }
+}
diff --git a/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DruidConfig.java b/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DruidConfig.java
index ee91599..660b8ec 100644
--- a/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DruidConfig.java
+++ b/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DruidConfig.java
@@ -7,16 +7,23 @@
 import com.alibaba.druid.util.Utils;
 import com.gkhy.hazmat.common.enums.DataSourceType;
 import com.gkhy.hazmat.framework.config.properties.DruidProperties;
+import com.gkhy.hazmat.framework.config.properties.ShardingProperties;
+import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Primary;
+import org.springframework.core.io.ClassPathResource;
 
 import javax.servlet.*;
 import javax.sql.DataSource;
+import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -38,7 +45,16 @@
         DruidDataSource dataSource=DruidDataSourceBuilder.create().build();
         return druidProperties.dataSource(dataSource);
     }
-
+    @Bean
+    public DataSource shardingDataSource(ShardingProperties shardingProperties) throws Exception
+    {
+        ClassPathResource classPathResource = new ClassPathResource(shardingProperties.getConfigLocation());
+        InputStream inputStream = classPathResource.getInputStream();
+        File tmpFile = File.createTempFile(shardingProperties.getConfigLocation(), ".tmp");
+        Files.copy(inputStream, tmpFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
+        DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(tmpFile);
+        return dataSource;
+    }
 
 
     @Bean(name="dynamicDataSource")
@@ -46,7 +62,8 @@
     public DynamicDataSource dataSource(DataSource masterDataSource){
         Map<Object,Object> targetDataSources=new HashMap<>();
         targetDataSources.put(DataSourceType.MASTER.name(),masterDataSource);
-        setDataSource(targetDataSources,DataSourceType.SLAVE.name(),"slaveDataSource");
+//        setDataSource(targetDataSources,DataSourceType.SLAVE.name(),"slaveDataSource");
+        setDataSource(targetDataSources, DataSourceType.SHARDING.name(), "shardingDataSource");
         return new DynamicDataSource(masterDataSource,targetDataSources);
     }
 
diff --git a/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DynamicDataSource.java b/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DynamicDataSource.java
index fd48f36..89d2e67 100644
--- a/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DynamicDataSource.java
+++ b/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DynamicDataSource.java
@@ -1,6 +1,5 @@
 package com.gkhy.hazmat.framework.config;
 
-import com.gkhy.hazmat.common.config.DynamicDataSourceContextHolder;
 import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
 
 import javax.sql.DataSource;
diff --git a/hazmat-common/src/main/java/com/gkhy/hazmat/common/config/DynamicDataSourceContextHolder.java b/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DynamicDataSourceContextHolder.java
similarity index 95%
rename from hazmat-common/src/main/java/com/gkhy/hazmat/common/config/DynamicDataSourceContextHolder.java
rename to hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DynamicDataSourceContextHolder.java
index 670b9b2..c1cb9b9 100644
--- a/hazmat-common/src/main/java/com/gkhy/hazmat/common/config/DynamicDataSourceContextHolder.java
+++ b/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/DynamicDataSourceContextHolder.java
@@ -1,4 +1,4 @@
-package com.gkhy.hazmat.common.config;
+package com.gkhy.hazmat.framework.config;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/properties/ShardingProperties.java b/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/properties/ShardingProperties.java
new file mode 100644
index 0000000..2864ce3
--- /dev/null
+++ b/hazmat-framework/src/main/java/com/gkhy/hazmat/framework/config/properties/ShardingProperties.java
@@ -0,0 +1,15 @@
+package com.gkhy.hazmat.framework.config.properties;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class ShardingProperties {
+
+    @Value("${spring.shardingsphere.configLocation}")
+    private String configLocation;
+
+    public String getConfigLocation() {
+        return configLocation;
+    }
+}
diff --git a/pom.xml b/pom.xml
index bb86fd9..c471e05 100644
--- a/pom.xml
+++ b/pom.xml
@@ -210,6 +210,12 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <!-- 分库分表引擎 -->
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
+            <version>5.2.0</version>
+        </dependency>
 
     </dependencies>
 

--
Gitblit v1.9.2