From 41e055c4ea70e2a7cd06692596b9e19022f21ac7 Mon Sep 17 00:00:00 2001 From: khalil Date: Tue, 7 Jan 2025 19:11:13 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=BB=E5=86=99=E5=88=86=E7=A6=BB-sharding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../accompany/admin/config/JdbcConfig.java | 6 +-- .../src/main/resources/application-native.yml | 42 ++++++++++------- .../flowteam/admin/config/JdbcConfig.java | 5 +- .../src/main/resources/application-native.yml | 42 ++++++++++------- .../core/config/DataSourceConfig.java | 27 +++++++++++ .../core/config/MybatisPlusConfig.java | 16 +++---- .../accompany-sharding-service/pom.xml | 4 +- .../sharding/config/ShardingSphereConfig.java | 46 +++++++++++++++---- .../src/main/resources/application-native.yml | 42 ++++++++++------- accompany-dependencies/pom.xml | 2 +- .../src/main/resources/application-native.yml | 42 ++++++++++------- .../src/main/resources/application-native.yml | 42 ++++++++++------- 12 files changed, 206 insertions(+), 110 deletions(-) create mode 100644 accompany-base/accompany-core/src/main/java/com/accompany/core/config/DataSourceConfig.java diff --git a/accompany-admin/accompany-admin-web/src/main/java/com/accompany/admin/config/JdbcConfig.java b/accompany-admin/accompany-admin-web/src/main/java/com/accompany/admin/config/JdbcConfig.java index e35f1abaa..7bbe212d7 100644 --- a/accompany-admin/accompany-admin-web/src/main/java/com/accompany/admin/config/JdbcConfig.java +++ b/accompany-admin/accompany-admin-web/src/main/java/com/accompany/admin/config/JdbcConfig.java @@ -1,6 +1,6 @@ package com.accompany.admin.config; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; @@ -16,9 +16,9 @@ import javax.sql.DataSource; public class JdbcConfig { @Bean - public JdbcTemplate jdbcTemplate(@Autowired DataSource dataSource) { + public JdbcTemplate jdbcTemplate(@Qualifier("shardingDataSource") DataSource shardingDataSource) { JdbcTemplate jdbcTemplate = new JdbcTemplate(); - jdbcTemplate.setDataSource(dataSource); + jdbcTemplate.setDataSource(shardingDataSource); return jdbcTemplate; } } diff --git a/accompany-admin/accompany-admin-web/src/main/resources/application-native.yml b/accompany-admin/accompany-admin-web/src/main/resources/application-native.yml index af24ed4ff..d4b013d5f 100644 --- a/accompany-admin/accompany-admin-web/src/main/resources/application-native.yml +++ b/accompany-admin/accompany-admin-web/src/main/resources/application-native.yml @@ -1,22 +1,30 @@ #MySQL数据库配置 spring: - datasource: - url: jdbc:mysql://124.156.164.187:3306/peko?useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false - username: root - password: anan@dev## - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.zaxxer.hikari.HikariDataSource - hikari: - minimum-idle: 10 - maximum-pool-size: 20 - connection-test-query: select 1 - data: - mongodb: - host: 124.156.164.187 - port: 27017 - username: peko - password: peko@mongo@dev#! - database: peko + dynamic-datasource: + master: + poolName: master + jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false + username: root + password: anan@dev## + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-test-query: select 1 + max-lifetime: 7000 + slave: + poolName: slave + jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false + username: root + password: anan@dev## + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-test-query: select 1 + max-lifetime: 7000 redis: host: 124.156.164.187 port: 6200 diff --git a/accompany-admin/accompany-flow-team-admin-web/src/main/java/com/accompany/flowteam/admin/config/JdbcConfig.java b/accompany-admin/accompany-flow-team-admin-web/src/main/java/com/accompany/flowteam/admin/config/JdbcConfig.java index 61993e820..589c75abf 100644 --- a/accompany-admin/accompany-flow-team-admin-web/src/main/java/com/accompany/flowteam/admin/config/JdbcConfig.java +++ b/accompany-admin/accompany-flow-team-admin-web/src/main/java/com/accompany/flowteam/admin/config/JdbcConfig.java @@ -1,6 +1,7 @@ package com.accompany.flowteam.admin.config; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; @@ -16,9 +17,9 @@ import javax.sql.DataSource; public class JdbcConfig { @Bean - public JdbcTemplate jdbcTemplate(@Autowired DataSource dataSource) { + public JdbcTemplate jdbcTemplate(@Qualifier("shardingDataSource") DataSource shardingDataSource) { JdbcTemplate jdbcTemplate = new JdbcTemplate(); - jdbcTemplate.setDataSource(dataSource); + jdbcTemplate.setDataSource(shardingDataSource); return jdbcTemplate; } } diff --git a/accompany-admin/accompany-flow-team-admin-web/src/main/resources/application-native.yml b/accompany-admin/accompany-flow-team-admin-web/src/main/resources/application-native.yml index 184d22ee7..ac414f458 100644 --- a/accompany-admin/accompany-flow-team-admin-web/src/main/resources/application-native.yml +++ b/accompany-admin/accompany-flow-team-admin-web/src/main/resources/application-native.yml @@ -1,22 +1,30 @@ #MySQL数据库配置 spring: - datasource: - url: jdbc:mysql://124.156.164.187:3306/peko?useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false - username: root - password: anan@dev## - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.zaxxer.hikari.HikariDataSource - hikari: - minimum-idle: 10 - maximum-pool-size: 20 - connection-test-query: select 1 - data: - mongodb: - host: 124.156.164.187 - port: 27017 - username: peko - password: peko@mongo@dev#! - database: peko + dynamic-datasource: + master: + poolName: master + jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false + username: root + password: anan@dev## + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-test-query: select 1 + max-lifetime: 7000 + slave: + poolName: slave + jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false + username: root + password: anan@dev## + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-test-query: select 1 + max-lifetime: 7000 redis: host: 124.156.164.187 port: 6200 diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/core/config/DataSourceConfig.java b/accompany-base/accompany-core/src/main/java/com/accompany/core/config/DataSourceConfig.java new file mode 100644 index 000000000..07f41234c --- /dev/null +++ b/accompany-base/accompany-core/src/main/java/com/accompany/core/config/DataSourceConfig.java @@ -0,0 +1,27 @@ +package com.accompany.core.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfig { + + @Primary + @Bean(name = "masterDataSource") + @ConfigurationProperties(prefix = "spring.dynamic-datasource.master") + public DataSource masterDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean(name = "slaveDataSource") + @ConfigurationProperties(prefix = "spring.dynamic-datasource.slave") + public DataSource slaveDataSource() { + return DataSourceBuilder.create().build(); + } + +} diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/core/config/MybatisPlusConfig.java b/accompany-base/accompany-core/src/main/java/com/accompany/core/config/MybatisPlusConfig.java index e27b0a829..d4f803020 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/core/config/MybatisPlusConfig.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/core/config/MybatisPlusConfig.java @@ -49,15 +49,13 @@ public class MybatisPlusConfig { return interceptor; } - @Autowired - private DataSource dataSource; - @Primary @Bean("sqlSessionFactory") - @DependsOn({"pageInterceptor"}) - public MybatisSqlSessionFactoryBean sqlSessionFactoryBean(Interceptor pageInterceptor, MybatisPlusInterceptor mybatisPlusInterceptor){ + @DependsOn({"shardingDataSource", "pageInterceptor"}) + public MybatisSqlSessionFactoryBean sqlSessionFactoryBean(@Qualifier("shardingDataSource") DataSource shardingDataSource, + Interceptor pageInterceptor, MybatisPlusInterceptor mybatisPlusInterceptor){ MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); - sqlSessionFactoryBean.setDataSource(dataSource); + sqlSessionFactoryBean.setDataSource(shardingDataSource); sqlSessionFactoryBean.setMapperLocations(ResourceUtil.getPathMatchingResource(mapperLocations)); sqlSessionFactoryBean.setPlugins(pageInterceptor, mybatisPlusInterceptor); return sqlSessionFactoryBean; @@ -77,9 +75,9 @@ public class MybatisPlusConfig { } @Bean("mybatisplusTransactionManager") - @DependsOn({"dataSource"}) - public PlatformTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) { - return new DataSourceTransactionManager(dataSource); + @DependsOn({"shardingDataSource"}) + public PlatformTransactionManager transactionManager(@Qualifier("shardingDataSource") DataSource shardingDataSource) { + return new DataSourceTransactionManager(shardingDataSource); } } \ No newline at end of file diff --git a/accompany-base/accompany-sharding/accompany-sharding-service/pom.xml b/accompany-base/accompany-sharding/accompany-sharding-service/pom.xml index a3cd72a23..36a7f50fb 100644 --- a/accompany-base/accompany-sharding/accompany-sharding-service/pom.xml +++ b/accompany-base/accompany-sharding/accompany-sharding-service/pom.xml @@ -20,8 +20,8 @@ org.apache.shardingsphere - shardingsphere-jdbc-core - ${sharding-jdbc-core.version} + shardingsphere-jdbc + ${sharding-jdbc.version} diff --git a/accompany-base/accompany-sharding/accompany-sharding-service/src/main/java/com/accompany/sharding/config/ShardingSphereConfig.java b/accompany-base/accompany-sharding/accompany-sharding-service/src/main/java/com/accompany/sharding/config/ShardingSphereConfig.java index 27519a2e9..20da7bef3 100644 --- a/accompany-base/accompany-sharding/accompany-sharding-service/src/main/java/com/accompany/sharding/config/ShardingSphereConfig.java +++ b/accompany-base/accompany-sharding/accompany-sharding-service/src/main/java/com/accompany/sharding/config/ShardingSphereConfig.java @@ -6,14 +6,17 @@ import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import org.apache.ibatis.plugin.Interceptor; import org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory; -import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration; +import org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration; import org.apache.shardingsphere.infra.config.mode.ModeConfiguration; import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; import org.apache.shardingsphere.mode.repository.standalone.StandalonePersistRepositoryConfiguration; +import org.apache.shardingsphere.readwritesplitting.config.ReadwriteSplittingRuleConfiguration; +import org.apache.shardingsphere.readwritesplitting.config.rule.ReadwriteSplittingDataSourceGroupRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration; +import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -40,27 +43,35 @@ import java.util.*; public class ShardingSphereConfig { @Autowired - private DataSource dataSource; + @Qualifier("masterDataSource") + private DataSource masterDataSource; + + @Autowired + @Qualifier("slaveDataSource") + private DataSource slaveDataSource; @Bean("shardingDataSource") public DataSource shardingDataSource() throws SQLException { List ruleConfigs = new ArrayList<>(); - ruleConfigs.add(getRuleConfig()); + ruleConfigs.add(getReadWriteRuleConfig()); + ruleConfigs.add(getShardingRuleConfig()); + ruleConfigs.add(getSingleRuleConfig()); - Map dataSourceMap = new HashMap<>(2); - dataSourceMap.put("ds", dataSource); + Map dataSourceMap = new HashMap<>(2,1); + dataSourceMap.put("ds", masterDataSource); + dataSourceMap.put("ds_slave", slaveDataSource); ModeConfiguration modeConfig = new ModeConfiguration("Standalone", new StandalonePersistRepositoryConfiguration("JDBC", new Properties())); //是否打印执行的sql语句 Properties properties = new Properties(); - properties.setProperty("sql-show", "false"); + properties.setProperty("sql-show", "true"); return ShardingSphereDataSourceFactory.createDataSource(modeConfig, dataSourceMap, ruleConfigs, properties); } @Bean("shardingSqlSessionFactory") @DependsOn({"shardingDataSource", "pageInterceptor"}) - public MybatisSqlSessionFactoryBean sqlSessionFactoryBean(DataSource shardingDataSource, + public MybatisSqlSessionFactoryBean sqlSessionFactoryBean(@Qualifier("shardingDataSource") DataSource shardingDataSource, Interceptor pageInterceptor, MybatisPlusInterceptor mybatisPlusInterceptor) { MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(shardingDataSource); @@ -77,7 +88,26 @@ public class ShardingSphereConfig { return new DataSourceTransactionManager(shardingDataSource); } - private ShardingRuleConfiguration getRuleConfig() { + private SingleRuleConfiguration getSingleRuleConfig() { + // 创建单表规则配置 + SingleRuleConfiguration ruleConfig = new SingleRuleConfiguration(); + ruleConfig.setTables(List.of("ds.*")); + ruleConfig.setDefaultDataSource("ds"); + return ruleConfig; + } + + private ReadwriteSplittingRuleConfiguration getReadWriteRuleConfig() { + ReadwriteSplittingDataSourceGroupRuleConfiguration dataSourceGroupConfig = new ReadwriteSplittingDataSourceGroupRuleConfiguration( + "ds", "ds", Arrays.asList("ds", "ds_slave"), "weight_lb"); + Properties algorithmProps = new Properties(); + algorithmProps.setProperty("ds_slave", "3"); + algorithmProps.setProperty("ds", "1"); + Map algorithmConfigMap = new HashMap<>(1); + algorithmConfigMap.put("weight_lb", new AlgorithmConfiguration("WEIGHT", algorithmProps)); + return new ReadwriteSplittingRuleConfiguration(Collections.singleton(dataSourceGroupConfig), algorithmConfigMap); + } + + private ShardingRuleConfiguration getShardingRuleConfig() { //table和分表策略分开 Collection autoTableConfigs = new ArrayList<>(); // 动态评论按动态id分表 .community_dynamic_comment_${0..9} diff --git a/accompany-business/accompany-business-web/src/main/resources/application-native.yml b/accompany-business/accompany-business-web/src/main/resources/application-native.yml index 907e0f5ae..36611175c 100644 --- a/accompany-business/accompany-business-web/src/main/resources/application-native.yml +++ b/accompany-business/accompany-business-web/src/main/resources/application-native.yml @@ -1,22 +1,30 @@ #MySQL数据库配置 spring: - datasource: - url: jdbc:mysql://124.156.164.187:3306/peko?useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false - username: root - password: anan@dev## - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.zaxxer.hikari.HikariDataSource - hikari: - minimum-idle: 10 - maximum-pool-size: 20 - connection-test-query: select 1 - data: - mongodb: - host: 124.156.164.187 - port: 27017 - username: peko - password: peko@mongo@dev#! - database: peko + dynamic-datasource: + master: + poolName: master + jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false + username: root + password: anan@dev## + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-test-query: select 1 + max-lifetime: 7000 + slave: + poolName: slave + jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false + username: root + password: anan@dev## + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-test-query: select 1 + max-lifetime: 7000 redis: host: 124.156.164.187 port: 6200 diff --git a/accompany-dependencies/pom.xml b/accompany-dependencies/pom.xml index 7458e32f3..889dc9083 100644 --- a/accompany-dependencies/pom.xml +++ b/accompany-dependencies/pom.xml @@ -72,7 +72,7 @@ 3.7.110.ALL v3-rev24-1.24.1 1.0.12 - 5.4.1 + 5.5.1 2.6 3.1.781 5.6.179 diff --git a/accompany-oauth2/accompany-oauth2-web/src/main/resources/application-native.yml b/accompany-oauth2/accompany-oauth2-web/src/main/resources/application-native.yml index 303e36736..a2a9aaa1d 100644 --- a/accompany-oauth2/accompany-oauth2-web/src/main/resources/application-native.yml +++ b/accompany-oauth2/accompany-oauth2-web/src/main/resources/application-native.yml @@ -1,22 +1,30 @@ #MySQL数据库配置 spring: - datasource: - url: jdbc:mysql://124.156.164.187:3306/peko?useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false - username: root - password: anan@dev## - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.zaxxer.hikari.HikariDataSource - hikari: - minimum-idle: 10 - maximum-pool-size: 20 - connection-test-query: select 1 - data: - mongodb: - host: 124.156.164.187 - port: 27017 - username: peko - password: peko@mongo@dev#! - database: peko + dynamic-datasource: + master: + poolName: master + jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false + username: root + password: anan@dev## + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-test-query: select 1 + max-lifetime: 7000 + slave: + poolName: slave + jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false + username: root + password: anan@dev## + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-test-query: select 1 + max-lifetime: 7000 redis: host: 124.156.164.187 port: 6200 diff --git a/accompany-scheduler/accompany-scheduler-web/src/main/resources/application-native.yml b/accompany-scheduler/accompany-scheduler-web/src/main/resources/application-native.yml index 184d22ee7..ac414f458 100644 --- a/accompany-scheduler/accompany-scheduler-web/src/main/resources/application-native.yml +++ b/accompany-scheduler/accompany-scheduler-web/src/main/resources/application-native.yml @@ -1,22 +1,30 @@ #MySQL数据库配置 spring: - datasource: - url: jdbc:mysql://124.156.164.187:3306/peko?useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false - username: root - password: anan@dev## - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.zaxxer.hikari.HikariDataSource - hikari: - minimum-idle: 10 - maximum-pool-size: 20 - connection-test-query: select 1 - data: - mongodb: - host: 124.156.164.187 - port: 27017 - username: peko - password: peko@mongo@dev#! - database: peko + dynamic-datasource: + master: + poolName: master + jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false + username: root + password: anan@dev## + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-test-query: select 1 + max-lifetime: 7000 + slave: + poolName: slave + jdbcUrl: jdbc:mysql://124.156.164.187:3306/peko?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&tinyInt1isBit=false&useSSL=false + username: root + password: anan@dev## + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-test-query: select 1 + max-lifetime: 7000 redis: host: 124.156.164.187 port: 6200