MySQL 主从同步结合 MyBatis Plus 读写分离,企业级数据层架构分分钟搞定(二)!

1,412 阅读2分钟

前言

MySQL 主从同步结合 MyBatis Plus 读写分离,企业级数据层架构分分钟搞定(一)! - 掘金 (juejin.cn) 中详细介绍了搭建MySQL 主从同步的各个步骤,把最后的测试留在这里与读写分离结合做测试。

读写分离

读写分离是建立在多库的基础上,通常来说数据库都是读多写少,所以在数据库读写压力比较大的项目中会将读写操作进行分离,在主库(master)上进行写操作,在从库(slave)上进行读操作。如果一个主库或从库还不足以承担住压力,还可以增加数量,通过负载均衡分担压力,极大的提升效率。

动手实践

目前有很多开源的读写分离组件都有开发者在使用,我使用 MyBatis-Plus 也有好几年的时间,比较熟悉了,就用 MyBatis-Plus 及官方推荐的一个组件做一个示例。

示例版本

工具版本
SpringBoot2.3.0.RELEASE
MySQL8.0.15
MyBatis Plus3.5.0
dynamic-datasource3.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、请求添加数据接口

1644920709706.png

1644921102726.png

3、启动从库(slave)服务,可以看到数据已经同步过来了

net start mysql-slave

1644921209072.png

4、关闭主库(master)服务

net stop mysql-master

5、请求查询数据接口

1644921533949.png

以上就是“MySQL 主从同步结合 MyBatis Plus 读写分离”架构的基本骨架搭建测试,在生产环境中远比这要复杂得多,但都可以根据这套骨架去延伸扩展,满足复杂的业务需求。