SpringBoot整合Sharding-JDBC实现MySQL8读写分离

一.前言

这是一个基于SpringBoot整合Sharding-JDBC实现读写分离的极简教程,笔者使用到的技术及版本如下:

  • SpringBoot 2.5.2
  • MyBatis-Plus 3.4.3
  • Sharding-JDBC 4.1.1
  • MySQL8集群(看笔者前一篇文章有部署教程)

二.项目目录结构

SpringBoot整合Sharding-JDBC实现MySQL8读写分离_第1张图片

三.pom文件



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.5.2
         
    
    xyz.hcworld
    sharding-jdbc-demo
    0.0.1-SNAPSHOT
    sharding-jdbc-demo
    多数据源切换实例
    
        1.8
    
    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            com.baomidou
            mybatis-plus-boot-starter
            3.4.3
        
        
        
            mysql
            mysql-connector-java
            runtime
        
        
        
            org.apache.shardingsphere
            sharding-jdbc-spring-boot-starter
            4.1.1
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                        
                            org.projectlombok
                            lombok
                        
                    
                
            
        
    


四.配置文件(基于YAML)及SQL建表语句

spring:
  main:
    allow-bean-definition-overriding: true
  #显示sql
  shardingsphere:
    props:
      sql:
        show: true
    masterslave:
      #配置主从名称
      name: ms
      #置主库master,负责数据的写入
      master-data-source-name: ds1
      #配置从库slave节点
      slave-data-source-names: ds2,ds3
      #配置slave节点的负载均衡均衡策略,采用轮询机制,有两种算法:round_robin(轮询)和random(随机)
      load-balance-algorithm-type: round_robin
    sharding:
      #配置默认数据源ds1 默认数据源,主要用于写
      default-data-source-name: ds1
    # 配置数据源
    datasource:
      names: ds1,ds2,ds3
      #master-ds1数据库连接信息
      ds1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://192.168.2.142:3307/sharding-jdbc-db?useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: 123456
        maxPoolSize: 100
        minPoolSize: 5
      #slave-ds2数据库连接信息
      ds2:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://192.168.2.142:3308/sharding-jdbc-db?useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: 123456
        maxPoolSize: 100
        minPoolSize: 5
      #slave-ds3数据库连接信息
      ds3:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://192.168.2.142:3309/sharding-jdbc-db?useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: 123456
        maxPoolSize: 100
        minPoolSize: 5
#mybatis-plus配置
mybatis-plus:
  type-aliases-package: xyz.hcworld.demo.model
  mapper-locations: classpath*:/mapper/**Mapper.xml
CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nickname` varchar(100) DEFAULT NULL,
  `password` varchar(100) DEFAULT NULL,
  `sex` int(11) DEFAULT NULL,
  `birthday` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

五.Mapper.xml文件及Mapper接口





    
        INSERT INTO t_user(nickname,PASSWORD,sex,birthday) VALUES(#{nickname},#{password},#{sex},#{birthday})
    

    


package xyz.hcworld.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Component;
import xyz.hcworld.demo.model.User;

import java.util.List;

/**
 * @ClassName: UserMapper
 * @Author: 张红尘
 * @Date: 2021-07-20
 * @Version: 1.0
 */
@Component
public interface UserMapper  extends BaseMapper {


    void addUser(User user);


    List findUsers();
}

六 .Controller及Mocel文件

package xyz.hcworld.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import xyz.hcworld.demo.mapper.UserMapper;
import xyz.hcworld.demo.model.User;

import java.security.SecureRandom;
import java.util.List;

/**
 * @ClassName: UserController
 * @Author: 张红尘
 * @Date: 2021-07-20
 * @Version: 1.0
 */
@RestController
@RequestMapping("/api/user")
public class UserController {
    @Autowired
    private UserMapper userMapper;

    @PostMapping("/save")
    public String addUser() {
        User user = new User();
        user.setNickname("zhangsan" + new SecureRandom().nextInt());
        user.setPassword("123456");
        user.setSex(1);
        user.setBirthday("1997-12-03");
        userMapper.addUser(user);
        return user.toString();
    }

    @GetMapping("/findUsers")
    public List findUsers() {
        return userMapper.findUsers();
    }
}
package xyz.hcworld.demo.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * @ClassName: User
 * @Author: 张红尘
 * @Date: 2021-07-20
 * @Version: 1.0
 */
@Data
@TableName("t_user")
public class User {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    private String nickname;

    private String password;

    private Integer sex;

    private String birthday;
}

七.结果

从结果可以看出,写入操作全部通过ds1数据库(master)数据库完成,而读操作因为设置了轮询的缘故,由ds2(slaver)、ds3(slaver2)数据库完成。这样就实现了基于一主二从的数据库集群的读写分离操作。

SpringBoot整合Sharding-JDBC实现MySQL8读写分离_第2张图片

八.Sharding-JDBC不同版本上的配置

网上Sharding-JDBC的教程多为4.0.0.RC1版本,笔者使用的是最新的4.1.1所以
在该部分数据库地址在4.1.1为jdbc-url在4.0.0.RC1上需要改为url否则会启动失败

jdbc-url: jdbc:mysql://XXXX/XXXX

且网上教程多为properties文件,笔者将其转变为YAML文件更加能直观感受

项目下载

GitHub:https://github.com/z875479694h/sharding-jdbc-demo

到此这篇关于SpringBoot整合Sharding-JDBC实现MySQL8读写分离的文章就介绍到这了,更多相关SpringBoot Sharding-JDBC MySQL8读写分离内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(SpringBoot整合Sharding-JDBC实现MySQL8读写分离)