Sharding - JDBC + Spring boot 实现MySQL读写分离

前提

        spring boot 整合 sharding-jdbc 实现 mysql数据库读写分离功能的前提在于已经配置好mysql集群的主从复制。如果还未配置,可以查看 MySQL 主从复制 这篇文章。

ShardingJDBC 功能架构图

        在进行编码前,我们可以先观察功能架构图,了解shardingJDBC的大致原理。我们可以清晰的看到sharding-jdbc不是一个单独的服务,而是将其作为代码的一部分。

Sharding - JDBC + Spring boot 实现MySQL读写分离_第1张图片

功能实现

创建项目

        直接创建一个spring boot 项目,在依赖中添加相关依赖。



        
        
            org.apache.shardingsphere
            sharding-jdbc-spring-boot-starter
            4.0.0-RC1
        

        
            org.apache.shardingsphere
            sharding-core-common
            4.0.0-RC1
        

        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            2.1.4
        

        
            mysql
            mysql-connector-java
        

        
            com.alibaba
            druid-spring-boot-starter
            1.1.21
        

        
            org.projectlombok
            lombok
            true
        


    

 application.yml

        在配置文件中配置shardingJDBC信息;通过sharding jdbc 对数据源进行管理;需要注意的是在配置过程中需要设置默认数据源,主要用于写;如果不配置就会把三个节点都当作从slave节点,新增操作则会出错。

server:
  port: 8085

spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    # 参数配置 ,显示SQL
    props:
      sql:
        show: true
    # 配置数据源
    datasource:
      # 给每个数据源取别名 任意取
      names: ds1,ds2,ds3
      # 给master-ds1配置数据库连接信息
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.26.128:3306/myslave?useSSL=false&useUnicode=true&characterEncoding=utf-8
        username: root
        password: 123456
        maxPoolSize: 100
        minPoolSize: 5
      ds2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.26.129:3306/myslave?useSSL=false&useUnicode=true&characterEncoding=utf-8
        username: root
        password: 123456
        maxPoolSize: 100
        minPoolSize: 5
      ds3:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.26.129:3306/myslave?useSSL=false&useUnicode=true&characterEncoding=utf-8
        username: root
        password: 123456
        maxPoolSize: 100
        minPoolSize: 5
    #配置默认数据源ds1
    sharding:
      # 默认数据源,主要用于写,注意一定要配置读写分离;如果不配置就会把三个节点都当作从slave节点,新增,修改和删除会出错。
      default-data-source-name: ds1
    # 配置数据源的读写分离;前提需要做数据库的主从复制;可以不写,会按照默认随机策略
    masterslave:
      # 配置主从名称,任意取名字
      name: ms
      # 配置主库 ,负责数据的写入
      master-data-source-name: ds1
      # 配置从库
      slave-data-source-names: ds2,ds3
      # 配置 slave 节点的负载均衡策略 :轮询机制
      load-balance-algorithm-type: round_robin

mybatis:
  mapper-locations: classpath:mapper/*.xml

业务代码

@Data
public class User {
    private Integer id;

    private String nickname;

    private String password;

    private Integer age;

    private Integer sex;

    private String birthday;
}
@Mapper
public interface UserMapper {

    @Insert("insert into user(nickname,password,sex,birthday) values(#{nickname},#{password},#{sex},#{birthday})")
    void addUser(User user);

    @Select("select * from user")
    List findUsers();
}
@RestController
public class UserController {

    @Autowired
    private UserMapper userMapper;

    @RequestMapping("/selectUsers")
    public List selectUsers() {
        return userMapper.findUsers();
    }

    @RequestMapping("/save")
    public String save() {
        User user = new User();
        user.setNickname("张三" + new Random().nextInt());
        user.setPassword("123");
        user.setAge(22);
        user.setSex(1);
        user.setBirthday("2021-9-22");
        userMapper.addUser(user);
        return "success";
    }

效果

        访问插入接口以及查询接口,可以查看控制台的相关打印信息。

Sharding - JDBC + Spring boot 实现MySQL读写分离_第2张图片

 

你可能感兴趣的:(#,spring,boot,集成相关,spring,boot)