zoukankan      html  css  js  c++  java
  • Spring Boot 集成 ShardingSphere 实现读写分离

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/15049016.html

    Project Directory

    Maven Dependency

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>helloshardingsphere</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.12.RELEASE</version>
            <relativePath/>
        </parent>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.4.3.1</version>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.2.6</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.shardingsphere</groupId>
                <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
                <version>4.1.1</version>
            </dependency>
    
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>3.4.1</version>
            </dependency>
    
            <dependency>
                <groupId>org.freemarker</groupId>
                <artifactId>freemarker</artifactId>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>

    DB Schema

    schema.sql

    CREATE TABLE `tb_user` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `username` varchar(30) DEFAULT NULL,
      `password` varchar(30) DEFAULT NULL,
      `age` int(10) unsigned DEFAULT NULL,
      `create_by` varchar(30) NOT NULL,
      `update_by` varchar(30) NOT NULL,
      `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
      `update_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    -- Master insert
    INSERT INTO `tb_user` (`id`, `username`, `password`, `age`, `create_by`, `update_by`, `create_time`, `update_time`)
    VALUES
        (1, 'sphere', 'sphere', 18, 'admin', 'admin', '2021-07-01 00:00:00.000', '2021-07-01 00:00:00.000');
    
    
    -- Slave insert
    INSERT INTO `tb_user` (`id`, `username`, `password`, `age`, `create_by`, `update_by`, `create_time`, `update_time`)
    VALUES
        (1, 'sphere', 'sphere', 18, 'admin', 'admin', '2021-07-01 00:00:00.000', '2021-07-01 00:00:00.000');

    application.properties

    server.port=8080
    
    logging.level.org.fool=debug
    
    mybatis.mapper-locations=classpath:mapper/**/*.xml
    
    spring.shardingsphere.datasource.names=master,slave0
    # master
    spring.shardingsphere.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
    spring.shardingsphere.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.shardingsphere.datasource.master.url=jdbc:mysql://localhost:3306/test_master?characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    spring.shardingsphere.datasource.master.username=root
    spring.shardingsphere.datasource.master.password=123456
    # slave
    spring.shardingsphere.datasource.slave0.type=com.alibaba.druid.pool.DruidDataSource
    spring.shardingsphere.datasource.slave0.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.shardingsphere.datasource.slave0.url=jdbc:mysql://localhost:3306/test_slave?characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    spring.shardingsphere.datasource.slave0.username=root
    spring.shardingsphere.datasource.slave0.password=123456
    # R/W Splitting
    spring.shardingsphere.masterslave.load-balance-algorithm-type=round_robin
    spring.shardingsphere.masterslave.name=test_master_slave
    spring.shardingsphere.masterslave.master-data-source-name=master
    spring.shardingsphere.masterslave.slave-data-source-names=slave0
    spring.shardingsphere.props.sql.show=true

    Note: 这里为了方便查看测试效果,并没有实现主从部署,而是在同一个服务器实例中创建两个数据库来模拟主从数据库。

    MyBatis-Plus Code Generator

    Note: User.java、UserMapper.java、UserMapper.xml 运行 CodeGenerator 的 main 方法后自动生成。

    参考 Spring Boot 集成 MyBatis-Plus

    SRC

    Application.java

    package org.fool.shardingsphere;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @MapperScan("org.fool.shardingsphere.mapper")
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }

    UserService.java

    package org.fool.shardingsphere.service;
    
    import com.baomidou.mybatisplus.core.toolkit.Wrappers;
    import lombok.extern.slf4j.Slf4j;
    import org.fool.shardingsphere.entity.User;
    import org.fool.shardingsphere.mapper.UserMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import java.util.List;
    
    @Service
    @Slf4j
    public class UserService {
        @Autowired
        private UserMapper userMapper;
    
        @Transactional(rollbackFor = Exception.class)
        public int addUser(User user) {
            user.setCreateBy("admin");
            user.setUpdateBy("admin");
            log.info("user: {}", user);
    
            return userMapper.insert(user);
        }
    
    
        public List<User> getAllUsers() {
            return userMapper.selectList(Wrappers.lambdaQuery());
        }
    }

    UserController.java

    package org.fool.shardingsphere.controller;
    
    import lombok.extern.slf4j.Slf4j;
    import org.fool.shardingsphere.entity.User;
    import org.fool.shardingsphere.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    import java.util.Random;
    
    @RestController
    @Slf4j
    public class UserController {
        @Autowired
        private UserService userService;
    
        @GetMapping("/get")
        public List<User> get() {
            return userService.getAllUsers();
        }
    
        @PostMapping("/add/{count}")
        public String add(@PathVariable int count) {
            int result = 0;
            for (int i = 0; i < count; i++) {
                User user = new User();
                user.setUsername("username" + i);
                user.setPassword("password" + i);
                user.setAge(new Random().nextInt(100));
                result += userService.addUser(user);
            }
    
            return result == count ? "SUCCESS" : "FAILURE";
        }
    }

    Test

    add

    curl --location --request POST 'http://localhost:8080/add/5'

    Note: add to master

    get

    curl --location --request GET 'http://localhost:8080/get'

    Note: get from slave

    Reference

    https://shardingsphere.apache.org/document/legacy/4.x/document/cn/manual/sharding-jdbc/configuration/config-spring-boot


    欢迎点赞关注和收藏

    强者自救 圣者渡人
  • 相关阅读:
    u-boot 移植 --->5、友善之臂Tiny210底板王网卡驱动移植
    Linux 驱动框架---驱动中的中断
    Linux 驱动框架---驱动中的并发
    Linux 驱动框架---platform驱动框架
    Linux内核实现透视---软中断&Tasklet
    Linux内核实现透视---硬中断
    u-boot 移植 --->4、Tiny210核心板的DDR初始化下详解
    redis缓存的安装和使用
    ArrayList、LinkedList、Vector的区别
    Java中的IO流系统详解
  • 原文地址:https://www.cnblogs.com/agilestyle/p/15049016.html
Copyright © 2011-2022 走看看