Mr.qian 1 неделя назад
Родитель
Сommit
32eca30b50

+ 87 - 0
cif-service/src/main/java/com/txz/cif/configurer/ShardingSphereConfig.java

@@ -0,0 +1,87 @@
+package com.txz.cif.configurer;
+
+import com.zaxxer.hikari.HikariDataSource;
+import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;
+import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration;
+import org.apache.shardingsphere.api.config.sharding.strategy.StandardShardingStrategyConfiguration;
+import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+@Configuration
+public class ShardingSphereConfig {
+
+    @Bean("shardingDataSource")
+    @Primary
+    public DataSource shardingDataSource() throws SQLException {
+        Map<String, DataSource> dataSourceMap = new HashMap<>();
+
+        HikariDataSource dataSource0 = new HikariDataSource();
+        dataSource0.setDriverClassName("com.mysql.jdbc.Driver");
+        dataSource0.setJdbcUrl("jdbc:mysql://124.222.152.234:3306/cif_0?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false");
+        dataSource0.setUsername("root");
+        dataSource0.setPassword("hy123456");
+        dataSourceMap.put("ds0", dataSource0);
+
+        HikariDataSource dataSource1 = new HikariDataSource();
+        dataSource1.setDriverClassName("com.mysql.jdbc.Driver");
+        dataSource1.setJdbcUrl("jdbc:mysql://124.222.152.234:3306/cif_1?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false");
+        dataSource1.setUsername("root");
+        dataSource1.setPassword("hy123456");
+        dataSourceMap.put("ds1", dataSource1);
+
+        HikariDataSource dataSourceFault = new HikariDataSource();
+        dataSourceFault.setDriverClassName("com.mysql.jdbc.Driver");
+        dataSourceFault.setJdbcUrl("jdbc:mysql://124.222.152.234:3306/cif?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false");
+        dataSourceFault.setUsername("root");
+        dataSourceFault.setPassword("hy123456");
+        dataSourceMap.put("dsdefault", dataSourceFault);
+
+        if (dataSourceMap.isEmpty()) {
+            throw new IllegalArgumentException("数据源配置不能为空");
+        }
+
+        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
+        
+        shardingRuleConfig.getTableRuleConfigs().add(getAccountFlowTableRuleConfiguration());
+        
+        shardingRuleConfig.getTableRuleConfigs().add(getFlowTableRuleConfiguration());
+        
+        shardingRuleConfig.getTableRuleConfigs().add(getRedEnvelopeTableRuleConfiguration());
+        
+        shardingRuleConfig.setDefaultDataSourceName("dsdefault");
+
+        Properties props = new Properties();
+        props.setProperty("sql.show", "true");
+
+        return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, props);
+    }
+
+    private TableRuleConfiguration getAccountFlowTableRuleConfiguration() {
+        TableRuleConfiguration result = new TableRuleConfiguration("c_account_flow", "ds$->{0..1}.c_account_flow_$->{0..3}");
+        result.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new UserIdShardingAlg()));
+        result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new UserIdShardingAlg()));
+        return result;
+    }
+
+    private TableRuleConfiguration getFlowTableRuleConfiguration() {
+        TableRuleConfiguration result = new TableRuleConfiguration("c_flow", "ds$->{0..1}.c_flow_$->{0..3}");
+        result.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new UserIdShardingAlg()));
+        result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new UserIdShardingAlg()));
+        return result;
+    }
+
+    private TableRuleConfiguration getRedEnvelopeTableRuleConfiguration() {
+        TableRuleConfiguration result = new TableRuleConfiguration("c_red_envelope", "ds$->{0..1}.c_red_envelope_$->{0..3}");
+        result.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new UserIdShardingAlg()));
+        result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new UserIdShardingAlg()));
+        return result;
+    }
+}

+ 32 - 0
cif-service/src/main/java/com/txz/cif/configurer/UserIdShardingAlg.java

@@ -0,0 +1,32 @@
+package com.txz.cif.configurer;
+
+import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
+
+import java.util.Collection;
+
+public class UserIdShardingAlg implements PreciseShardingAlgorithm<String> {
+    
+    @Override
+    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
+        String userId = String.valueOf(shardingValue.getValue());
+        String last4Digits = userId;
+        if (userId.length() >= 4) {
+            last4Digits = userId.substring(userId.length() - 4);
+        }
+        
+        long shardValue = Long.parseLong(last4Digits);
+        
+        String logicTableName = shardingValue.getLogicTableName();
+        if ("c_account_flow".equals(logicTableName) || "c_flow".equals(logicTableName) || "c_red_envelope".equals(logicTableName)) {
+            String dataSource = "ds" + (shardValue % 2);
+            if (availableTargetNames.contains(dataSource)) {
+                return dataSource;
+            }
+            // 兜底
+            return availableTargetNames.iterator().next();
+        } else {
+            return "dsdefault";
+        }
+    }
+}

+ 9 - 60
cif-service/src/main/resources/bootstrap.properties

@@ -21,24 +21,25 @@ spring.cloud.nacos.config.prefix=cif
 spring.cloud.nacos.config.file-extension=properties
 spring.web.resources.add-mappings=true
 spring.main.allow-circular-references=true
+spring.main.allow-bean-definition-overriding=true
 springfox.documentation.enabled=false
-#spring.cloud.nacos.config.ext-config[0].data-id=minio-${spring.profiles.active}.properties
+#spring.cloud.nacos.config.ext-config[0].data-user_id=minio-${spring.profiles.active}.properties
 #spring.cloud.nacos.config.ext-config[0].refresh=true
-#spring.cloud.nacos.config.ext-config[0].data-id=mq-${spring.profiles.active}.properties
+#spring.cloud.nacos.config.ext-config[0].data-user_id=mq-${spring.profiles.active}.properties
 #spring.cloud.nacos.config.ext-config[0].refresh=true
-#spring.cloud.nacos.config.ext-config[1].data-id=redis-${spring.profiles.active}.properties
+#spring.cloud.nacos.config.ext-config[1].data-user_id=redis-${spring.profiles.active}.properties
 #spring.cloud.nacos.config.ext-config[1].refresh=true
-#spring.cloud.nacos.config.ext-config[2].data-id=xxljob-${spring.profiles.active}.properties
+#spring.cloud.nacos.config.ext-config[2].data-user_id=xxljob-${spring.profiles.active}.properties
 #spring.cloud.nacos.config.ext-config[2].refresh=true
-#spring.cloud.nacos.config.ext-config[3].data-id=alipay-${spring.profiles.active}.properties
+#spring.cloud.nacos.config.ext-config[3].data-user_id=alipay-${spring.profiles.active}.properties
 #spring.cloud.nacos.config.ext-config[3].refresh=true
 spring.cloud.nacos.config.extension-configs[0]=mq-${spring.profiles.active}.properties
 spring.cloud.nacos.config.extension-configs[1]=redis-${spring.profiles.active}.properties
 #spring.cloud.nacos.config.extension-configs[2]=${spring.application.name}-${spring.profiles.active}.properties
 
-#spring.cloud.nacos.config.ext-config[5].data-id=rconsult-${spring.profiles.active}.properties
+#spring.cloud.nacos.config.ext-config[5].data-user_id=rconsult-${spring.profiles.active}.properties
 #spring.cloud.nacos.config.ext-config[5].refresh=true
-#spring.cloud.nacos.config.ext-config[3].data-id=minio-${spring.profiles.active}.properties
+#spring.cloud.nacos.config.ext-config[3].data-user_id=minio-${spring.profiles.active}.properties
 #spring.cloud.nacos.config.ext-config[3].refresh=true
 
 dubbo.scan.base-packages=com.txz.${spring.application.name}.dubbo.impl
@@ -149,7 +150,7 @@ spring.datasource.hikari.connection-test-query=SELECT 1
 #logging.level.com.txz.cif.dao=debug
 #logging.level.com.alibaba.nacos.client.naming=error
 
-
+spring.shardingsphere.enabled=false
 
 spring.datasource.hikari.read-only=false
 #spring.datasource.hikari.connection-timeout=60000
@@ -179,56 +180,4 @@ tfpay.callbackurl=https://www.google.com
 tfpay.paymenturl=https://api.tfpay.org
 tfpay.withdrawurl=https://apiot.tfpay.org
 
-
-# Sharding-JDBC??
-spring.shardingsphere.datasource.names=ds0,ds1,ds-default
-
-# ???0??
-spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
-spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
-spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://124.222.152.234:3306/cif_0?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
-spring.shardingsphere.datasource.ds0.username=root
-spring.shardingsphere.datasource.ds0.password=hy123456
-
-# ???1??
-spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
-spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
-spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://124.222.152.234:3306/cif_1?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
-spring.shardingsphere.datasource.ds1.username=root
-spring.shardingsphere.datasource.ds1.password=hy123456
-
-# ???????
-spring.shardingsphere.datasource.ds-default.type=com.zaxxer.hikari.HikariDataSource
-spring.shardingsphere.datasource.ds-default.driver-class-name=com.mysql.jdbc.Driver
-spring.shardingsphere.datasource.ds-default.jdbc-url=jdbc:mysql://124.222.152.234:3306/cif?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
-spring.shardingsphere.datasource.ds-default.username=root
-spring.shardingsphere.datasource.ds-default.password=hy123456
-
-# c_account_flow??????
-spring.shardingsphere.sharding.tables.c_account_flow.actual-data-nodes=ds$->{0..1}.c_account_flow_$->{0..1}
-spring.shardingsphere.sharding.tables.c_account_flow.database-strategy.inline.sharding-column=user_id
-spring.shardingsphere.sharding.tables.c_account_flow.database-strategy.inline.algorithm-expression=ds$->{user_id % 2}
-spring.shardingsphere.sharding.tables.c_account_flow.table-strategy.inline.sharding-column=id
-spring.shardingsphere.sharding.tables.c_account_flow.table-strategy.inline.algorithm-expression=c_account_flow_$->{id % 2}
-
-
-# c_flow??????
-spring.shardingsphere.sharding.tables.c_flow.actual-data-nodes=ds$->{0..1}.c_flow_$->{0..1}
-spring.shardingsphere.sharding.tables.c_flow.database-strategy.inline.sharding-column=user_id
-spring.shardingsphere.sharding.tables.c_flow.database-strategy.inline.algorithm-expression=ds$->{user_id % 2}
-spring.shardingsphere.sharding.tables.c_flow.table-strategy.inline.sharding-column=id
-spring.shardingsphere.sharding.tables.c_flow.table-strategy.inline.algorithm-expression=c_flow_$->{id % 2}
-
-# c_red_envelope??????
-spring.shardingsphere.sharding.tables.c_red_envelope.actual-data-nodes=ds$->{0..1}.c_red_envelope_$->{0..1}
-spring.shardingsphere.sharding.tables.c_red_envelope.database-strategy.inline.sharding-column=user_id
-spring.shardingsphere.sharding.tables.c_red_envelope.database-strategy.inline.algorithm-expression=ds$->{user_id % 2}
-spring.shardingsphere.sharding.tables.c_red_envelope.table-strategy.inline.sharding-column=id
-spring.shardingsphere.sharding.tables.c_red_envelope.table-strategy.inline.algorithm-expression=c_red_envelope_$->{id % 2}
-
-# ?????
-spring.shardingsphere.sharding.default-data-source-name=ds-default
-
-spring.shardingsphere.props.sql.show=true
-
 management.health.db.enabled=false