分库分表 (3)---ShardingSphere 实现读写分离
有关 ShardingSphere 概念前面写了两篇博客:
1, 分库分表 (1) --- 理论
2, 分库分表 (2) --- ShardingSphere(理论)
下面就这个项目做个整体简单介绍, 并在文章最下方附上项目 GitHub 地址.
一, 项目概述
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 库
从两幅图中可以看出, 我这里在同一个服务器建两个数据库来模拟主从数据库. 为了方便看测试效果, 这里主从数据库中的数据是不一样的.
二, 核心代码
说明 完整的代码会放到 GitHub 上, 这里只放一些核心代码.
- 1,pom.xml
- <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>
- <!--lombok 实体工具 -->
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- </dependency>
- </dependencies>
- 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=123456
- # 数据源 从库
- 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=123456
- # 读写分离
- 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=true
Sharding-JDBC 可以通过 Java,YAML,Spring 命名空间和 Spring Boot Starter 四种方式配置, 开发者可根据场景选择适合的配置方式. 具体可以看官网.
- 3,UserController
- @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 库的话这条新增的数据是没有的, 因为没有同步过去.
GitHub 地址:
参考
1,ShardingSphere 中文文档
2,ShardingSphere 官网 https://shardingsphere.apache.org/
3,Shardingsphere GitHub 库 https://github.com/apache/incubator-shardingsphere
我相信, 无论今后的道路多么坎坷, 只要抓住今天, 迟早会在奋斗中尝到人生的甘甜. 抓住人生中的一分一秒, 胜过虚度中的一月一年!(18)
来源: https://www.cnblogs.com/qdhxhz/p/11656205.html