ShardingSphere實現讀寫分離
有關ShardingSphere概念前面寫了兩篇博客:
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地址
:https://github.com/yudiandemingzi/spring-boot-sharding-sphere
參考
我相信,無論今后的道路多么坎坷,只要抓住今天,遲早會在奮斗中嘗到人生的甘甜。抓住人生中的一分一秒,勝過虛度中的一月一年!(18)