Skip to content

Commit

Permalink
perf($Starter): support switching dynamic data source on runtime base…
Browse files Browse the repository at this point in the history
…d on SQL
  • Loading branch information
johnnymillergh committed Jun 27, 2021
1 parent bab526a commit 7dbcfc9
Show file tree
Hide file tree
Showing 36 changed files with 502 additions and 127 deletions.
15 changes: 12 additions & 3 deletions auth-center/src/main/resources/application-development-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,18 @@ spring:
devtools:
add-properties: true
datasource:
url: jdbc:mysql://maf-mysql-server-master-development-docker:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
dynamic:
datasource:
master:
url: jdbc:mysql://maf-mysql-server-master-development-docker:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
url: jdbc:mysql://maf-mysql-server-slave-development-docker:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_r
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: maf-redis-development-docker
port: 6379
Expand Down
15 changes: 12 additions & 3 deletions auth-center/src/main/resources/application-development-local.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,18 @@ spring:
devtools:
add-properties: true
datasource:
url: jdbc:mysql://localhost:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
dynamic:
datasource:
master:
url: jdbc:mysql://localhost:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
url: jdbc:mysql://localhost:3307/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_r
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: localhost
port: 6379
Expand Down
15 changes: 12 additions & 3 deletions auth-center/src/main/resources/application-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,18 @@ spring:
devtools:
add-properties: false
datasource:
url: jdbc:mysql://maf-mysql-server-master-production:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
dynamic:
datasource:
master:
url: jdbc:mysql://maf-mysql-server-master-production:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
url: jdbc:mysql://maf-mysql-server-slave-production:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_r
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: maf-redis-production
port: 6379
Expand Down
15 changes: 12 additions & 3 deletions auth-center/src/main/resources/application-stage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,18 @@ spring:
devtools:
add-properties: false
datasource:
url: jdbc:mysql://maf-mysql-server-master-stage:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
dynamic:
datasource:
master:
url: jdbc:mysql://maf-mysql-server-master-stage:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
url: jdbc:mysql://maf-mysql-server-slave-stage:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_r
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: maf-redis-stage
port: 6379
Expand Down
15 changes: 12 additions & 3 deletions auth-center/src/main/resources/application-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,18 @@ spring:
devtools:
add-properties: false
datasource:
url: jdbc:mysql://maf-mysql-server-master-test:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
dynamic:
datasource:
master:
url: jdbc:mysql://maf-mysql-server-master-test:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
url: jdbc:mysql://maf-mysql-server-slave-test:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_r
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: maf-redis-test
port: 6379
Expand Down
1 change: 0 additions & 1 deletion auth-center/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ spring:
ip-address: ${spring.cloud.client.ip-address}
health-check-critical-timeout: 15s
datasource:
name: muscle_and_fitness
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
Expand Down
3 changes: 2 additions & 1 deletion docker/.env
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ JAVA_TOOL_OPTIONS="-Xms128m -Xmx128m -Dspring.profiles.active=${SPRING_ENVIRONME
##################################################
MAF_MYSQL_ROOT_PASSWORD=jm@mysql
MAF_MYSQL_DATABASE=muscle_and_fitness
MAF_MYSQL_USER=maf_mysql_rw
MAF_MYSQL_USER_RW=maf_mysql_rw
MAF_MYSQL_USER_R=maf_mysql_r
MAF_MYSQL_PASSWORD=maf@mysql
MAF_ELASTICSEARCH_PASSWORD=maf@elasticsearch
MAF_TIMEZONE=Asia/Hong_Kong
Expand Down
4 changes: 2 additions & 2 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ services:
MYSQL_ROOT_HOST: "%"
MYSQL_ROOT_PASSWORD: ${MAF_MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MAF_MYSQL_DATABASE}
MYSQL_USER: ${MAF_MYSQL_USER}
MYSQL_USER: ${MAF_MYSQL_USER_RW}
MYSQL_PASSWORD: ${MAF_MYSQL_PASSWORD}
TZ: ${MAF_TIMEZONE}
ports:
Expand Down Expand Up @@ -39,7 +39,7 @@ services:
MYSQL_ROOT_HOST: "%"
MYSQL_ROOT_PASSWORD: ${MAF_MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MAF_MYSQL_DATABASE}
MYSQL_USER: ${MAF_MYSQL_USER}
MYSQL_USER: ${MAF_MYSQL_USER_R}
MYSQL_PASSWORD: ${MAF_MYSQL_PASSWORD}
ports:
- "3307:3306"
Expand Down
15 changes: 12 additions & 3 deletions maf-mis/src/main/resources/application-development-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,18 @@ spring:
devtools:
add-properties: true
datasource:
url: jdbc:mysql://maf-mysql-server-master-development-docker:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
dynamic:
datasource:
master:
url: jdbc:mysql://maf-mysql-server-master-development-docker:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
url: jdbc:mysql://maf-mysql-server-slave-development-docker:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_r
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: maf-redis-development-docker
port: 6379
Expand Down
15 changes: 12 additions & 3 deletions maf-mis/src/main/resources/application-development-local.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,18 @@ spring:
devtools:
add-properties: true
datasource:
url: jdbc:mysql://localhost:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
dynamic:
datasource:
master:
url: jdbc:mysql://localhost:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
url: jdbc:mysql://localhost:3307/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_r
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: localhost
port: 6379
Expand Down
15 changes: 12 additions & 3 deletions maf-mis/src/main/resources/application-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,18 @@ spring:
devtools:
add-properties: false
datasource:
url: jdbc:mysql://maf-mysql-server-master-production:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
dynamic:
datasource:
master:
url: jdbc:mysql://maf-mysql-server-master-production:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
url: jdbc:mysql://maf-mysql-server-slave-production:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_r
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: maf-redis-production
port: 6379
Expand Down
15 changes: 12 additions & 3 deletions maf-mis/src/main/resources/application-stage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,18 @@ spring:
devtools:
add-properties: false
datasource:
url: jdbc:mysql://maf-mysql-server-master-stage:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
dynamic:
datasource:
master:
url: jdbc:mysql://maf-mysql-server-master-stage:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
url: jdbc:mysql://maf-mysql-server-slave-stage:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_r
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: maf-redis-stage
port: 6379
Expand Down
15 changes: 12 additions & 3 deletions maf-mis/src/main/resources/application-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,18 @@ spring:
devtools:
add-properties: false
datasource:
url: jdbc:mysql://maf-mysql-server-master-test:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
dynamic:
datasource:
master:
url: jdbc:mysql://maf-mysql-server-master-test:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_rw
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
url: jdbc:mysql://maf-mysql-server-slave-test:3306/muscle_and_fitness?useSSL=true&useUnicode=true
username: maf_mysql_r
password: maf@mysql
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: maf-redis-test
port: 6379
Expand Down
1 change: 0 additions & 1 deletion maf-mis/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ spring:
ip-address: ${spring.cloud.client.ip-address}
health-check-critical-timeout: 15s
datasource:
name: muscle_and_fitness
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
Expand Down
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
<spring-boot-admin-starter-client.version>2.4.1</spring-boot-admin-starter-client.version>
<druid-spring-boot-starter.version>1.2.6</druid-spring-boot-starter.version>
<mybatis-plus-boot-starter.version>3.4.3.1</mybatis-plus-boot-starter.version>
<dynamic-datasource-spring-boot-starter.version>3.4.0</dynamic-datasource-spring-boot-starter.version>
<hutool-all.version>5.7.2</hutool-all.version>
<guava.version>30.0-jre</guava.version>
<knife4j.version>2.0.8</knife4j.version>
Expand Down
5 changes: 5 additions & 0 deletions spring-cloud-starter/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,11 @@
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${dynamic-datasource-spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.jmsoftware.maf.springcloudstarter;

import com.jmsoftware.maf.springcloudstarter.aspect.ExceptionControllerAdvice;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.jmsoftware.maf.springcloudstarter.aspect.CommonExceptionControllerAdvice;
import com.jmsoftware.maf.springcloudstarter.aspect.DatabaseExceptionControllerAdvice;
import com.jmsoftware.maf.springcloudstarter.aspect.WebRequestLogAspect;
import com.jmsoftware.maf.springcloudstarter.configuration.*;
import com.jmsoftware.maf.springcloudstarter.controller.CommonController;
Expand All @@ -17,10 +19,9 @@
import com.jmsoftware.maf.springcloudstarter.service.impl.CommonServiceImpl;
import com.jmsoftware.maf.springcloudstarter.sftp.SftpConfiguration;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.condition.SearchStrategy;
import org.apache.ibatis.exceptions.PersistenceException;
import org.mybatis.spring.MyBatisSystemException;
import org.springframework.boot.autoconfigure.condition.*;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
Expand Down Expand Up @@ -71,9 +72,16 @@ public void postConstruct() {

@Bean
@ConditionalOnMissingBean
public ExceptionControllerAdvice exceptionControllerAdvice() {
log.warn("Initial bean: '{}'", ExceptionControllerAdvice.class.getSimpleName());
return new ExceptionControllerAdvice();
public CommonExceptionControllerAdvice exceptionControllerAdvice() {
log.warn("Initial bean: '{}'", CommonExceptionControllerAdvice.class.getSimpleName());
return new CommonExceptionControllerAdvice();
}

@Bean
@ConditionalOnClass({MyBatisSystemException.class, MybatisPlusException.class, PersistenceException.class})
public DatabaseExceptionControllerAdvice databaseExceptionControllerAdvice() {
log.warn("Initial bean: '{}'", DatabaseExceptionControllerAdvice.class.getSimpleName());
return new DatabaseExceptionControllerAdvice();
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,11 @@

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.jmsoftware.maf.common.bean.ResponseBodyBean;
import com.jmsoftware.maf.common.exception.BaseException;
import com.jmsoftware.maf.springcloudstarter.util.RequestUtil;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.apache.ibatis.exceptions.PersistenceException;
import org.mybatis.spring.MyBatisSystemException;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
Expand Down Expand Up @@ -40,7 +37,7 @@
**/
@Slf4j
@RestControllerAdvice
public class ExceptionControllerAdvice {
public class CommonExceptionControllerAdvice {
/**
* <p>Exception handler.</p>
* <p><strong>ATTENTION</strong>: In this method, <strong><em>cannot throw any exception</em></strong>.</p>
Expand Down Expand Up @@ -171,37 +168,6 @@ public ResponseBodyBean<?> handleException(HttpServletRequest request, HttpServl
null);
}

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(MyBatisSystemException.class)
public ResponseBodyBean<?> handleMyBatisSystemException(HttpServletRequest request,
MyBatisSystemException exception) {
requestLog(request);
log.error("MyBatisSystemException message: {}", exception.getMessage());
return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR,
String.format("MyBatisSystemException message: %s",
removeLineSeparator(exception.getMessage())));
}

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(MybatisPlusException.class)
public ResponseBodyBean<?> handleMybatisPlusException(HttpServletRequest request, MybatisPlusException exception) {
requestLog(request);
log.error("MybatisPlusException message: {}", exception.getMessage());
return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR,
String.format("MybatisPlusException message: %s",
removeLineSeparator(exception.getMessage())));
}

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(PersistenceException.class)
public ResponseBodyBean<?> handlePersistenceException(HttpServletRequest request, PersistenceException exception) {
requestLog(request);
log.error("PersistenceException message: {}", exception.getMessage());
return ResponseBodyBean.ofStatus(HttpStatus.INTERNAL_SERVER_ERROR,
String.format("PersistenceException message: %s",
removeLineSeparator(exception.getMessage())));
}

@ExceptionHandler(UndeclaredThrowableException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResponseBodyBean<?> handleError(UndeclaredThrowableException exception) {
Expand Down
Loading

0 comments on commit 7dbcfc9

Please sign in to comment.