前言
在MySQL 主从同步结合 MyBatis Plus 读写分离,企业级数据层架构分分钟搞定(一)! - 掘金 (juejin.cn) 中详细介绍了搭建MySQL 主从同步的各个步骤,把最后的测试留在这里与读写分离结合做测试。
读写分离
读写分离是建立在多库的基础上,通常来说数据库都是读多写少,所以在数据库读写压力比较大的项目中会将读写操作进行分离,在主库(master)上进行写操作,在从库(slave)上进行读操作。如果一个主库或从库还不足以承担住压力,还可以增加数量,通过负载均衡分担压力,极大的提升效率。
动手实践
目前有很多开源的读写分离组件都有开发者在使用,我使用 MyBatis-Plus 也有好几年的时间,比较熟悉了,就用 MyBatis-Plus 及官方推荐的一个组件做一个示例。
示例版本
工具 | 版本 |
---|---|
SpringBoot | 2.3.0.RELEASE |
MySQL | 8.0.15 |
MyBatis Plus | 3.5.0 |
dynamic-datasource | 3.5.0 |
1、引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
2、修改 application.yml 配置文件
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://192.168.1.123:3306/today?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
slave:
url: jdbc:mysql://192.168.1.123:3307/today?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
3、业务层(其它层不需要做额外配置,省略)
在查询的方法加上注解 @DS("slave"),注解参数的值为 application.yml 配置文件中数据库的名字,在相对应的库上操作,没有此注解的方法使用默认数据源。
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, UserDO> implements UserService {
@Override
@DS("slave")
public Page<UserDO> page(Integer pageNum, Integer pageSize, String nickname) {
Page<UserDO> page = new Page<>(pageNum, pageSize);
page = page(page, new LambdaQueryWrapper<UserDO>()
.like(StringUtils.isNotBlank(nickname), UserDO::getNickname, nickname)
.eq(UserDO::getIsDeleted, 0)
);
return page;
}
@Override
public boolean add(UserDO userDO) {
return save(userDO);
}
}
同样,也是简简单单的几步读写分离就配置完成了。接下来结合主从同步做一个完整的测试。
全流程测试
1、关闭从库(slave)服务
net stop mysql-slave
2、请求添加数据接口
3、启动从库(slave)服务,可以看到数据已经同步过来了
net start mysql-slave
4、关闭主库(master)服务
net stop mysql-master
5、请求查询数据接口
以上就是“MySQL 主从同步结合 MyBatis Plus 读写分离”架构的基本骨架搭建测试,在生产环境中远比这要复杂得多,但都可以根据这套骨架去延伸扩展,满足复杂的业务需求。