读写分离-sharding

This commit is contained in:
khalil
2025-01-07 19:11:13 +08:00
parent fcdad55e4e
commit 41e055c4ea
12 changed files with 206 additions and 110 deletions

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -20,8 +20,8 @@
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId>
<version>${sharding-jdbc-core.version}</version>
<artifactId>shardingsphere-jdbc</artifactId>
<version>${sharding-jdbc.version}</version>
</dependency>
</dependencies>

View File

@@ -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<RuleConfiguration> ruleConfigs = new ArrayList<>();
ruleConfigs.add(getRuleConfig());
ruleConfigs.add(getReadWriteRuleConfig());
ruleConfigs.add(getShardingRuleConfig());
ruleConfigs.add(getSingleRuleConfig());
Map<String, DataSource> dataSourceMap = new HashMap<>(2);
dataSourceMap.put("ds", dataSource);
Map<String, DataSource> 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<String, AlgorithmConfiguration> algorithmConfigMap = new HashMap<>(1);
algorithmConfigMap.put("weight_lb", new AlgorithmConfiguration("WEIGHT", algorithmProps));
return new ReadwriteSplittingRuleConfiguration(Collections.singleton(dataSourceGroupConfig), algorithmConfigMap);
}
private ShardingRuleConfiguration getShardingRuleConfig() {
//table和分表策略分开
Collection<ShardingAutoTableRuleConfiguration> autoTableConfigs = new ArrayList<>();
// 动态评论按动态id分表 .community_dynamic_comment_${0..9}

View File

@@ -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

View File

@@ -72,7 +72,7 @@
<alipay-sdk-java.version>3.7.110.ALL</alipay-sdk-java.version>
<google-api-services-androidpublisher.version>v3-rev24-1.24.1</google-api-services-androidpublisher.version>
<payermax-server.version>1.0.12</payermax-server.version>
<sharding-jdbc-core.version>5.4.1</sharding-jdbc-core.version>
<sharding-jdbc.version>5.5.1</sharding-jdbc.version>
<commons-lang.version>2.6</commons-lang.version>
<tencentcloud-sdk-java.version>3.1.781</tencentcloud-sdk-java.version>
<tencentcloud-cos-sdk-java.version>5.6.179</tencentcloud-cos-sdk-java.version>

View File

@@ -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

View File

@@ -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