1、技术架构
项目总体技术选型
SpringBoot2.0.6 + shardingsphere4.0.0-RC1 + Maven3.5.4 + MySQL + lombok(插件)
2、项目说明
场景:如果实际项目中Mysql是 Master-Slave (主从)部署的,那么数据保存到Master库,Master库数据同步数据到Slave库,数据读取到Slave库,
这样可以减缓数据库的压力。
3、数据库设计
我们这个项目中Mysql服务器并没有实现主从部署,而是同一个服务器建立两个库,一个当做Master库,一个当做Slave库。所以这里是不能实现的功能就是Master库
新增数据主动同步到Slave库。这样也更有利于我们测试看效果。
Master库
Slave库
从两幅图中可以看出,我这里在同一个服务器建两个数据库来模拟主从数据库。为了方便看测试效果,这里主从数据库中的数据是不一样的。
1、pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <packaging>pom</packaging> <modules> <module>db-read-write</module> <module>sub-table</module> <module>sub-table-read-write</module> <module>sub-db-table</module> <module>sub-db-table-read-write</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath/> </parent> <groupId>com.jincou.sharding.sphere</groupId> <artifactId>spring-boot-sharding-sphere</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-sharding-sphere</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <mybatis-spring-boot>2.0.1</mybatis-spring-boot> <druid>1.1.16</druid> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis-spring-boot}</version> </dependency> <!--mybatis驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--druid数据源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid}</version> </dependency> <!--shardingsphere最新版本--> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC1</version> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-namespace</artifactId> <version>4.0.0-RC1</version> </dependency> <!--lombok实体工具--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>2、application.properties
server.port=8088 #指定mybatis信息 mybatis.config-location=classpath:mybatis-config.xml spring.shardingsphere.datasource.names=master,slave0 # 数据源 主库 spring.shardingsphere.datasource.master.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver spring.shardingsphere.datasource.master.url=jdbc:mysql://localhost:3306/master?characterEncoding=utf-8 spring.shardingsphere.datasource.master.username=root spring.shardingsphere.datasource.master.password=root # 数据源 从库 spring.shardingsphere.datasource.slave0.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.slave0.driver-class-name=com.mysql.jdbc.Driver spring.shardingsphere.datasource.slave0.url=jdbc:mysql://localhost:3306/slave?characterEncoding=utf-8 spring.shardingsphere.datasource.slave0.username=root spring.shardingsphere.datasource.slave0.password=root # 读写分离 spring.shardingsphere.masterslave.load-balance-algorithm-type=round_robin spring.shardingsphere.masterslave.name=ms spring.shardingsphere.masterslave.master-data-source-name=master spring.shardingsphere.masterslave.slave-data-source-names=slave0 #打印sql spring.shardingsphere.props.sql.show=trueSharding-JDBC可以通过Java,YAML,Spring命名空间和Spring Boot Starter四种方式配置,开发者可根据场景选择适合的配置方式。具体可以看官网。
3、UserController
package com.oujiong.controller; import com.oujiong.entity.User; import com.oujiong.service.UserService; 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.RestController; /** * @Description: 接口测试 * * @author xub * @date 2019/8/24 下午6:31 */ @RestController public class UserController { @Autowired private UserService userService; /** * @Description: 保存用户 */ @PostMapping("save-user") public Object saveUser() { return userService.saveOne(new User("小小", "女", 3)); } /** * @Description: 获取用户列表 */ @GetMapping("list-user") public Object listUser() { return userService.list(); } }1、读数据 我们可以发现读取的数据是Slave库的数据。我们再来看控制台打印的SQL。可以看到读操作是Slave库。
2、写数据 请求: localhost:8088/save-user?name=小小&sex=女&age=3
查看Mater数据库 发现Master数据库已经多了一条数据了,再看控制台打印的SQL。
这个时候如果去看Slave库的话这条新增的数据是没有的,因为没有同步过去。
