yubin 1 mese fa
parent
commit
d92d6cf7ef

+ 8 - 0
mall-service/pom.xml

@@ -184,6 +184,14 @@
             <artifactId>engagelab-sdk-java</artifactId>
             <version>0.0.15</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
+            <version>4.1.1</version>
+        </dependency>
+
+
     </dependencies>
 
     <build>

+ 124 - 0
mall-service/src/main/java/com/txz/mall/configurer/ShardingSphereConfig.java

@@ -0,0 +1,124 @@
+package com.txz.mall.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.beans.factory.annotation.Value;
+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 {
+
+    @Value("${sharding.datasource.ds0.driver-class-name}")
+    private String ds0DriverClassName;
+    
+    @Value("${sharding.datasource.ds0.jdbc-url}")
+    private String ds0JdbcUrl;
+    
+    @Value("${sharding.datasource.ds0.username}")
+    private String ds0Username;
+    
+    @Value("${sharding.datasource.ds0.password}")
+    private String ds0Password;
+    
+    @Value("${sharding.datasource.ds1.driver-class-name}")
+    private String ds1DriverClassName;
+    
+    @Value("${sharding.datasource.ds1.jdbc-url}")
+    private String ds1JdbcUrl;
+    
+    @Value("${sharding.datasource.ds1.username}")
+    private String ds1Username;
+    
+    @Value("${sharding.datasource.ds1.password}")
+    private String ds1Password;
+    
+    @Value("${sharding.datasource.dsdefault.driver-class-name}")
+    private String dsDefaultDriverClassName;
+    
+    @Value("${sharding.datasource.dsdefault.jdbc-url}")
+    private String dsDefaultJdbcUrl;
+    
+    @Value("${sharding.datasource.dsdefault.username}")
+    private String dsDefaultUsername;
+    
+    @Value("${sharding.datasource.dsdefault.password}")
+    private String dsDefaultPassword;
+
+    @Bean("shardingDataSource")
+    @Primary
+    public DataSource shardingDataSource() throws SQLException {
+        Map<String, DataSource> dataSourceMap = new HashMap<>();
+
+        HikariDataSource dataSource0 = new HikariDataSource();
+        dataSource0.setDriverClassName(ds0DriverClassName);
+        dataSource0.setJdbcUrl(ds0JdbcUrl);
+        dataSource0.setUsername(ds0Username);
+        dataSource0.setPassword(ds0Password);
+        dataSourceMap.put("ds0", dataSource0);
+
+        HikariDataSource dataSource1 = new HikariDataSource();
+        dataSource1.setDriverClassName(ds1DriverClassName);
+        dataSource1.setJdbcUrl(ds1JdbcUrl);
+        dataSource1.setUsername(ds1Username);
+        dataSource1.setPassword(ds1Password);
+        dataSourceMap.put("ds1", dataSource1);
+
+        HikariDataSource dataSourceFault = new HikariDataSource();
+        dataSourceFault.setDriverClassName(dsDefaultDriverClassName);
+        dataSourceFault.setJdbcUrl(dsDefaultJdbcUrl);
+        dataSourceFault.setUsername(dsDefaultUsername);
+        dataSourceFault.setPassword(dsDefaultPassword);
+        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
mall-service/src/main/java/com/txz/mall/configurer/UserIdShardingAlg.java

@@ -0,0 +1,32 @@
+package com.txz.mall.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";
+        }
+    }
+}

+ 33 - 2
mall-service/src/main/resources/bootstrap.properties

@@ -40,7 +40,7 @@ spring.cloud.nacos.config.file-extension=properties
 #spring.cloud.nacos.config.ext-config[2].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.extension-configs[2]=${spring.application.name}-${spring.profiles.active}.properties
 
 #spring.cloud.nacos.config.extension-configs[3]=xxljob-${spring.profiles.active}.properties
 dubbo.protocol.serialization=kryo
@@ -111,4 +111,35 @@ xxl.job.accessToken=${${spring.profiles.active}.accessToken}
 xxl.job.executor.ip=
 xxl.job.executor.port=4444
 xxl.job.executor.logpath=/var/logs/xxljob/${spring.application.name}/jobhandler
-xxl.job.executor.logretentiondays=4
+xxl.job.executor.logretentiondays=4
+
+
+
+
+jbs.url=http://vip.cellocation.com/cell/fdhbyshf.php
+spring.datasource.type=com.zaxxer.hikari.HikariDataSource
+spring.datasource.hikari.connection-timeout=30000
+spring.datasource.hikari.minimum-idle=4
+#spring.datasource.hikari.maximum-pool-size=15
+spring.datasource.hikari.auto-commit=true
+spring.datasource.hikari.idle-timeout=60000
+spring.datasource.hikari.pool-name=DatebookHikariCP
+spring.datasource.hikari.max-lifetime=28740000
+spring.datasource.hikari.connection-test-query=SELECT 1
+
+
+
+sharding.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
+sharding.datasource.ds0.jdbc-url=jdbc:mysql://124.222.152.234:3306/cif_0?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
+sharding.datasource.ds0.username=root
+sharding.datasource.ds0.password=hy123456
+
+sharding.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
+sharding.datasource.ds1.jdbc-url=jdbc:mysql://124.222.152.234:3306/cif_1?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
+sharding.datasource.ds1.username=root
+sharding.datasource.ds1.password=hy123456
+
+sharding.datasource.dsdefault.driver-class-name=com.mysql.jdbc.Driver
+sharding.datasource.dsdefault.jdbc-url=jdbc:mysql://124.222.152.234:3306/cif?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
+sharding.datasource.dsdefault.username=root
+sharding.datasource.dsdefault.password=hy123456

+ 1 - 1
mall-service/src/main/resources/logback.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration debug="false">
     <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
-    <property name="LOG_HOME" value="/var/logs/mall" />
+    <property name="LOG_HOME" value="./mall" />
     <!-- 控制台输出 -->
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">