官方文档
https://shardingsphere.apache.org/document/legacy/3.x/document/cn/manual/sharding-jdbc/usage/read-write-splitting/
一、环境
1.软件环境
SpringBoot2.3 + MyBatis-Plus + Sharding-jdbc+MySQL读写分离实验
2.MySQL环境
CentOS7虚拟机,MySQL一主一从,提前准备好主从,确保主从同步没问题。
主库:192.168.140.152
从库:192.168.140.151
二、Java
1.配置
maven依赖
核心部分
<dependencies>
<!--集成springmvc框架并实现自动配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions><!-- 去掉springboot默认配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入log4j2依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.29</version>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!-- for spring namespace -->
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
application.yml
server:
port: 9999
spring:
application:
name: xxoo
main:
allow-bean-definition-overriding: true #设置为true,表示后发现的bean会覆盖之前相同名称的bean。
# datasource:
# driver-class-name:
# url: jdbc:mysql://192.168.140.141:3306/xxoo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
# data-username: root
# data-password: 123456
sharding:
jdbc:
datasource:
names: master,salve #主从数据源
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver #数据库新的驱动,下面连接url一定要加区时
url: jdbc:mysql://192.168.140.152:3306/xxoo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
salve:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.140.151:3306/xxoo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
config: #读写分离配置
masterslave:
name: ms
master-data-source-name: master #主数据库配置
slave-data-source-names: salve #从数据库配置(多个以逗号隔开)
#load-balance-algorithm-type: round_robin # 提供轮询与随机(random),这里选择用轮询,
props:
sql:
show: true #打印sql日志
#mybatis plus 设置
mybatis-plus:
mapper-locations: classpath*:mapper/*Mapper.xml
global-config:
# 关闭MP3.0自带的banner
banner: false
db-config:
#主键类型 0:"数据库ID自增",1:"该类型为未设置主键类型", 2:"用户输入ID",3:"全局唯一ID (数字类型唯一ID)", 4:"全局唯一ID UUID",5:"字符串全局唯一ID (idWorker 的字符串表示)";
id-type: ASSIGN_ID
# 默认数据库表下划线命名
table-underline: true
configuration:
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
#log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 返回类型为Map,显示null对应的字段
call-setters-on-nulls: true
#enable swagger
swagger:
enable: true
这一行必定配上
spring.application.main.allow-bean-definition-overriding=true
数据源可以使用DruidDataSource ,sharding-jdbc 不care你用的啥
启动后,会报错:
org.springframework.dao.InvalidDataAccessApiUsageException: ConnectionCallback; isValid; nested exception is java.sql.SQLFeatureNotSupportedException: isValid
是Spring Boot 2.3数据源健康检查引起。解决办法是继承 DataSourceHealthContributorAutoConfiguration 重写 createIndicator 方法
需要如下写个配置类,即可。
@Configuration
public class DataSourceHealthConfig extends DataSourceHealthContributorAutoConfiguration {
@Value("${spring.datasource.dbcp2.validation-query:select 1}")
private String defaultQuery;
public DataSourceHealthConfig(Map<String, DataSource> dataSources, ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
super(dataSources, metadataProviders);
}
@Override
protected AbstractHealthIndicator createIndicator(DataSource source) {
DataSourceHealthIndicator indicator = (DataSourceHealthIndicator) super.createIndicator(source);
if (!StringUtils.hasText(indicator.getQuery())) {
indicator.setQuery(defaultQuery);
}
return indicator;
}
}
无需其他配置,对用户透明,select就走从库,增删改就走主库:
--------->NbBase Started <---------
19:52:07.090 [RMI TCP Connection(1)-192.168.140.1] INFO ShardingSphere-SQL - Rule Type: master-slave
19:52:07.091 [RMI TCP Connection(1)-192.168.140.1] INFO ShardingSphere-SQL - SQL: select 1 ::: DataSources: salve
19:52:08.744 [RMI TCP Connection(3)-192.168.140.1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
19:52:08.744 [RMI TCP Connection(3)-192.168.140.1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
19:52:08.750 [RMI TCP Connection(3)-192.168.140.1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 5 ms
20:10:31.191 [http-nio-9999-exec-3] INFO ShardingSphere-SQL - Rule Type: master-slave
20:10:31.191 [http-nio-9999-exec-3] INFO ShardingSphere-SQL - SQL: SELECT id,name,age FROM user WHERE id=? ::: DataSources: salve
20:10:34.406 [http-nio-9999-exec-4] INFO ShardingSphere-SQL - Rule Type: master-slave
20:10:34.406 [http-nio-9999-exec-4] INFO ShardingSphere-SQL - SQL: SELECT id,name,age FROM user WHERE id=? ::: DataSources: salve
20:10:44.030 [http-nio-9999-exec-7] INFO ShardingSphere-SQL - Rule Type: master-slave
20:10:44.030 [http-nio-9999-exec-7] INFO ShardingSphere-SQL - SQL: INSERT INTO user ( name,
age ) VALUES ( ?,
? ) ::: DataSources: master