From 5ba4a42e5fc2e101ed19f9390e3f32ddf5fd197e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johnny=20Miller=20=28=E9=94=BA=E4=BF=8A=29?= Date: Sat, 2 Apr 2022 13:29:01 +0800 Subject: [PATCH] perf($ShardingSphere): integrate with ShardingSphere BREAKING CHANGE: remove dependency `dynamic-datasource-spring-boot-starter` [skip ci] --- .../src/main/resources/application.yml | 64 ++++++++++++++++++- auth-center/pom.xml | 16 ++--- pom.xml | 3 +- spring-cloud-starter/pom.xml | 6 +- .../database/DataSourceConfiguration.java | 45 ++++--------- .../database/MyBatisPlusConfiguration.java | 51 ++------------- 6 files changed, 94 insertions(+), 91 deletions(-) diff --git a/auth-center/auth-center-bootstrap/src/main/resources/application.yml b/auth-center/auth-center-bootstrap/src/main/resources/application.yml index 1977683c..ed038aa3 100644 --- a/auth-center/auth-center-bootstrap/src/main/resources/application.yml +++ b/auth-center/auth-center-bootstrap/src/main/resources/application.yml @@ -49,6 +49,68 @@ spring: # `file-size-threshold` specifies the size threshold after which files will be written to disk. # The default is 0. We set it as 0 too. file-size-threshold: 0 + shardingsphere: + datasource: + master0: + name: master0 + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/muscle_and_fitness_00?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + master1: + name: master1 + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/muscle_and_fitness_01?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + slave0: + name: slave0 + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3307/muscle_and_fitness_00?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + slave1: + name: slave1 + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3307/muscle_and_fitness_01?useSSL=true&useUnicode=true + username: maf_mysql_r + password: maf@mysql + quartz: + name: quartz + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/QUARTZ_DB?useSSL=true&useUnicode=true + username: maf_mysql_rw + password: maf@mysql + names: master0,slave0,master1,slave1,quartz + sharding: + master-slave-rules: + master0: + slave-data-source-names: slave0 + master-data-source-name: master0 + master1: + slave-data-source-names: slave1 + master-data-source-name: master1 + default-database-strategy: + inline: + algorithm-expression: master$->{id % 2} + sharding-column: id + tables: + user: + table-strategy: + inline: + sharding-column: id + algorithm-expression: "user_$->{String.format(\"%04d\", new BigDecimal(id).abs().divideAndRemainder(2)[1].longValue())}" + key-generator: + column: id + type: SNOWFLAKE + actual-data-nodes: "master$->{0..1}.user_$->{(0..1).collect{String.format(\"%04d\", it)}}" + props: + sql-show: true logging: config: classpath:logback-configuration/logback-${spring.profiles.active}.xml @@ -61,7 +123,7 @@ maf: context-path: ${server.servlet.context-path} group-id: @project.groupId@ project-parent-artifact-id: @project.parent.artifactId@ - project-artifact-id: @project.artifactId@ + project-artifact-id: @project.parent.artifactId@ version: @project.version@ description: @project.description@ jdk-version: @java.version@ diff --git a/auth-center/pom.xml b/auth-center/pom.xml index 1602e3c4..40e04d40 100644 --- a/auth-center/pom.xml +++ b/auth-center/pom.xml @@ -124,19 +124,19 @@ - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus-boot-starter.version} + mysql + mysql-connector-java + runtime com.baomidou - dynamic-datasource-spring-boot-starter - ${dynamic-datasource-spring-boot-starter.version} + mybatis-plus-boot-starter + ${mybatis-plus-boot-starter.version} - mysql - mysql-connector-java - runtime + org.apache.shardingsphere + shardingsphere-jdbc-core-spring-boot-starter + ${shardingsphere.version} diff --git a/pom.xml b/pom.xml index 10cf92e0..04897258 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ 2.6.2 3.5.1 3.5.1 - 4.1.1 + 5.1.0 5.7.21 31.0.1-jre 1.6.6 @@ -181,6 +181,7 @@ + ${project.artifactId}-${git.commit.id.abbrev}-${project.version} diff --git a/spring-cloud-starter/pom.xml b/spring-cloud-starter/pom.xml index dae03df0..ee249881 100644 --- a/spring-cloud-starter/pom.xml +++ b/spring-cloud-starter/pom.xml @@ -163,9 +163,9 @@ provided - com.baomidou - dynamic-datasource-spring-boot-starter - ${dynamic-datasource-spring-boot-starter.version} + org.apache.shardingsphere + shardingsphere-jdbc-core-spring-boot-starter + ${shardingsphere.version} provided diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceConfiguration.java index c37c0b37..512398fb 100644 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceConfiguration.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/DataSourceConfiguration.java @@ -1,19 +1,18 @@ package com.jmsoftware.maf.springcloudstarter.database; -import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; -import com.baomidou.dynamic.datasource.plugin.MasterSlaveAutoRoutingPlugin; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceCreatorAutoConfiguration; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import lombok.val; +import org.quartz.core.QuartzScheduler; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.autoconfigure.quartz.QuartzDataSource; import org.springframework.boot.autoconfigure.quartz.QuartzTransactionManager; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Primary; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; @@ -26,40 +25,24 @@ **/ @Slf4j @RequiredArgsConstructor -@ConditionalOnClass({MybatisPlusAutoConfiguration.class, DynamicDataSourceCreatorAutoConfiguration.class}) +@ConditionalOnClass({MybatisPlusAutoConfiguration.class, QuartzScheduler.class}) public class DataSourceConfiguration { - private final DynamicRoutingDataSource dynamicRoutingDataSource; - - /** - * Primary data source. Had to configure DynamicRoutingDataSource as primary. Otherwise - * MasterSlaveAutoRoutingPlugin will not be able to be injected datasource correctly. - * - * @return the data source - * @see MasterSlaveAutoRoutingPlugin - */ @Bean - @Primary - public DataSource primaryDataSource() { - log.info("Setting 'DynamicRoutingDataSource' as 'primaryDataSource', {}", dynamicRoutingDataSource); - return dynamicRoutingDataSource; + @ConfigurationProperties("spring.shardingsphere.datasource.quartz") + @ConditionalOnProperty(prefix = "spring.quartz", name = "job-store-type", havingValue = "jdbc") + public DataSourceProperties quartzDataSourceProperties() { + val quartzDataSourceProperties = new DataSourceProperties(); + log.info("Setting up quartzDataSourceProperties: {}", quartzDataSourceProperties.getName()); + return quartzDataSourceProperties; } @Bean @QuartzDataSource @ConditionalOnProperty(prefix = "spring.quartz", name = "job-store-type", havingValue = "jdbc") - public DataSource quartzDataSource() { - val quartzDataSource = dynamicRoutingDataSource.getDataSource(DataSourceEnum.QUARTZ.getDataSourceName()); - log.info("Setting up quartzDataSource from 'DynamicRoutingDataSource', quartzDataSource: {}", - quartzDataSource.hashCode()); - return quartzDataSource; - } - - @Bean - @Primary - public PlatformTransactionManager primaryPlatformTransactionManager(@Qualifier("primaryDataSource") DataSource primaryDataSource) { - log.info("Setting up the central interface in Spring's imperative transaction infrastructure " + - "'PlatformTransactionManager'. primaryDataSource: {}", primaryDataSource); - return new DataSourceTransactionManager(primaryDataSource); + public DataSource quartzDataSource(DataSourceProperties quartzDataSourceProperties) { + val dataSource = quartzDataSourceProperties.initializeDataSourceBuilder().build(); + log.info("Setting up quartzDataSource: {}", dataSource); + return dataSource; } @Bean diff --git a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusConfiguration.java b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusConfiguration.java index 4c4bf1d4..73e29cbf 100644 --- a/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusConfiguration.java +++ b/spring-cloud-starter/src/main/java/com/jmsoftware/maf/springcloudstarter/database/MyBatisPlusConfiguration.java @@ -1,8 +1,5 @@ package com.jmsoftware.maf.springcloudstarter.database; -import com.baomidou.dynamic.datasource.plugin.MasterSlaveAutoRoutingPlugin; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourcePropertiesCustomizer; -import com.baomidou.dynamic.datasource.support.DdConstants; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; @@ -16,7 +13,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; import org.springframework.core.annotation.Order; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -28,11 +24,11 @@ @Slf4j @Configuration @EnableTransactionManagement -@Import({ - DataSourceConfiguration.class -}) +//@Import({ +// DataSourceConfiguration.class +//}) +@ConditionalOnClass({MybatisPlusAutoConfiguration.class}) @MapperScan("com.jmsoftware.maf.springcloudstarter.*.repository") -@ConditionalOnClass({MybatisPlusAutoConfiguration.class, MasterSlaveAutoRoutingPlugin.class}) public class MyBatisPlusConfiguration { private static final String MESSAGE_TEMPLATE = "Initial bean: '{}'"; @@ -80,48 +76,9 @@ public Interceptor mybatisPlusInterceptor( return mybatisPlusInterceptor; } - /** - * Register master-slave auto routing plugin interceptor. Mybatis-Plus doesn't support non-master-slave - * datasource yet. - * - * @return the interceptor - * @see DdConstants - */ - @Bean - @Order(2) - public Interceptor masterSlaveAutoRoutingPlugin() { - log.warn(MESSAGE_TEMPLATE, MasterSlaveAutoRoutingPlugin.class.getSimpleName()); - return new MasterSlaveAutoRoutingPlugin(); - } - @Bean public CommonMetaObjectHandler commonMetaObjectHandler() { log.warn(MESSAGE_TEMPLATE, CommonMetaObjectHandler.class.getSimpleName()); return new CommonMetaObjectHandler(); } - - /** - * Dynamic data source properties customizer. Set global configuration for dynamic data source. - * - * @return the dynamic data source properties customizer - */ - @Bean - public DynamicDataSourcePropertiesCustomizer dynamicDataSourcePropertiesCustomizer() { - return properties -> { - val cpuCoreCount = Runtime.getRuntime().availableProcessors(); - val minIdle = cpuCoreCount * 2 + 1; - val maxPoolSize = cpuCoreCount * 3; - val hikari = properties.getHikari(); - hikari.setConnectionTestQuery("SELECT 1"); - hikari.setIdleTimeout(30000L); - hikari.setMaxPoolSize(maxPoolSize); - hikari.setMinIdle(minIdle); - hikari.setIsAutoCommit(true); - hikari.setMaxLifetime(120000L); - hikari.setConnectionTimeout(30000L); - log.warn("Hikari connection pool enhanced by current cpuCoreCount: {}, initial size: {}, min idle: {}" + - ", max active: {}", - cpuCoreCount, minIdle, minIdle, maxPoolSize); - }; - } }