ShardingSphere 使用 ShardingJdbc 与 mybatis plus实现分库分表及读写分离
本文为博主原创,未经允许不得转载:
目录:
一. 官网及git 地址
二. Apache ShardingSphere 简介
三.spring boot + mybaits plus +sharding jdbc 实现分库分表及读写分离
一. 官网及git 地址
官网:https://shardingsphere.apache.org/
git: https://github.com/apache/shardingsphere
分库分表,分库不分表及分表不分库,读写分离等 应用 gitee demo:https://gitee.com/xiangbaxiang/sharding-jdbc
二. Apache ShardingSphere 简介
Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
Apache ShardingSphere 旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 关系型数据库当今依然占有巨大市场份额,是企业核心系统的基石,未来也难于撼动,我们更加注重在原有基础上提供增量,而非颠覆。
Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。 开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,仍在不断增加中。
ShardingSphere 已于2020年4月16日成为 Apache 软件基金会的顶级项目。
ShardingSphere-JDBC :定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。
ShardingSphere-Proxy :定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前提供 MySQL 和 PostgreSQL(兼容 openGauss 等基于 PostgreSQL 的数据库)版本,它可以使用任何兼容 MySQL/PostgreSQL 协议的访问客户端
三.spring boot + mybaits plus +sharding jdbc 实现分库分表及读写分离
3.1 创建spring 项目,并修改pom 文件
<?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>sharding-jdbc</artifactId> <version>1.0-SNAPSHOT</version> <properties> <java.version>1.8</java.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> </parent> <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> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--Mybatis-Plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.1</version> </dependency> <!--shardingsphere start--> <!-- for spring boot --> <dependency> <groupId>io.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>3.1.0</version> </dependency> <!-- for spring namespace --> <dependency> <groupId>io.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-namespace</artifactId> <version>3.1.0</version> </dependency> <!--shardingsphere end--> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>utf8</encoding> <compilerArgument>-XDignore.symbol.file=true -Xlint</compilerArgument> <testCompilerArgument>-XDignore.symbol.file=true -Xlint</testCompilerArgument> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.0.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </pluginManagement> </build> </project>
3.2 增加实体类:
package com.sharding.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @Data @EqualsAndHashCode(callSuper = true) @Accessors(chain = true) @TableName("user") public class User extends Model<User> { /** * 主键Id */ private int id; /** * 名称 */ private String name; /** * 年龄 */ private int age; }
3.3 mapper层
package com.sharding.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.sharding.entity.User; public interface UserMapper extends BaseMapper<User> { }
3.4 service层
package com.sharding.service; import com.baomidou.mybatisplus.extension.service.IService; import com.sharding.entity.User; import java.util.List; public interface UserService extends IService<User> { /** * 保存用户信息 * @param entity * @return */ @Override boolean save(User entity); /** * 查询全部用户信息 * @return */ List<User> getUserList() }
3.5 service层实现类
package com.sharding.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.sharding.entity.User; import com.sharding.mapper.UserMapper; import com.sharding.service.UserService; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public boolean save(User entity) { return super.save(entity); } @Override public List<User> getUserList() { return baseMapper.selectList(Wrappers.<User>lambdaQuery()); } }
3.6 controller 层:
package com.sharding.controller; import com.sharding.entity.User; import com.sharding.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/select") public List<User> select() { return userService.getUserList(); } @GetMapping("/insert") public Boolean insert(User user) { return userService.save(user); } }
3.7 创建分片数据库
CREATE DATABASE IF NOT EXISTS `ds1`; USE `ds1`; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user_0 -- -------------------------- -- DROP TABLE IF EXISTS `user_0`; CREATE TABLE `user_0` ( `id` INT (11) NOT NULL, `name` VARCHAR (255) DEFAULT NULL, `age` INT (11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4; -- ---------------------------- -- Table structure for user_1 -- -------------------------- -- DROP TABLE IF EXISTS `user_1`; CREATE TABLE `user_1` ( `id` INT (11) NOT NULL, `name` VARCHAR (255) DEFAULT NULL, `age` INT (11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4; SET FOREIGN_KEY_CHECKS = 1; CREATE DATABASE IF NOT EXISTS `ds0` ; USE `ds0`; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user_0 -- -------------------------- -- DROP TABLE IF EXISTS `user_0`; CREATE TABLE `user_0` ( `id` INT (11) NOT NULL, `name` VARCHAR (255) DEFAULT NULL, `age` INT (11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4; -- ---------------------------- -- Table structure for user_1 -- -------------------------- -- DROP TABLE IF EXISTS `user_1`; CREATE TABLE `user_1` ( `id` INT (11) NOT NULL, `name` VARCHAR (255) DEFAULT NULL, `age` INT (11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
3.8 增加分库分表配置文件
# 数据源 ds0,ds1 sharding.jdbc.datasource.names=ds0,ds1 # 第一个数据库 sharding.jdbc.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.ds0.jdbc-url=jdbc:mysql://localhost:3306/ds0?characterEncoding=utf-8&&serverTimezone=GMT%2B8 sharding.jdbc.datasource.ds0.username=root sharding.jdbc.datasource.ds0.password=zengjian # 第二个数据库 sharding.jdbc.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource sharding.jdbc.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.ds1.jdbc-url=jdbc:mysql://localhost:3306/ds1?characterEncoding=utf-8&&serverTimezone=GMT%2B8 sharding.jdbc.datasource.ds1.username=root sharding.jdbc.datasource.ds1.password=zengjian # 水平拆分的数据库(表) 配置分库 + 分表策略 行表达式分片策略 # 分库策略 sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=id sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds$->{id % 2} # 分表策略 其中user为逻辑表 分表主要取决于age行 sharding.jdbc.config.sharding.tables.user.actual-data-nodes=ds$->{0..1}.user_$->{0..1} sharding.jdbc.config.sharding.tables.user.table-strategy.inline.sharding-column=age # 分片算法表达式 sharding.jdbc.config.sharding.tables.user.table-strategy.inline.algorithm-expression=user_$->{age % 2} # 主键 UUID 18位数 如果是分布式还要进行一个设置 防止主键重复 #sharding.jdbc.config.sharding.tables.user.key-generator-column-name=id # 打印执行的数据库以及语句 sharding.jdbc.config.props..sql.show=true spring.main.allow-bean-definition-overriding=true
3.9 读写分离配置
#shardingsphere 读写分离,master-slave,可以一主多从 sharding.jdbc.datasource.names=ds-master,ds-slave0 #主库 sharding.jdbc.datasource.ds-master.type=com.zaxxer.hikari.HikariDataSource sharding.jdbc.datasource.ds-master.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.ds-master.jdbc-url=jdbc:mysql://112.125.26.67:3306/shop_ds_master?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8 sharding.jdbc.datasource.ds0.username=root sharding.jdbc.datasource.ds0.password=zengjian #从库0 sharding.jdbc.datasource.ds-slave0.type=com.zaxxer.hikari.HikariDataSource sharding.jdbc.datasource.ds-slave0.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.ds-slave0.jdbc-url=jdbc:mysql://112.125.26.66:3306/shop_ds_master?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8 sharding.jdbc.datasource.ds-slave0.username=root sharding.jdbc.datasource.ds-slave0.password=zengjian #从库1 #spring.shardingsphere.datasource.ds-slave1.type=com.zaxxer.hikari.HikariDataSource #spring.shardingsphere.datasource.ds-slave1.driver-class-name=com.mysql.cj.jdbc.Driver #spring.shardingsphere.datasource.ds-slave1.jdbc-url=jdbc:mysql://112.125.26.68:3306/shop_ds_slave1?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8 #spring.shardingsphere.datasource.ds-slave1.username=root #spring.shardingsphere.datasource.ds-slave1.password=root #读写分离主从规则设置,当有2个以上从库时,从库读采用轮询的负载均衡机制 sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin sharding.jdbc.config.masterslave.name=ms sharding.jdbc.config.masterslave.master-data-source-name=ds-master sharding.jdbc.config.masterslave.slave-data-source-names=ds-slave0
分库分表,分库不分表及分表不分库,读写分离等 应用 gitee demo:https://gitee.com/xiangbaxiang/sharding-jdbc
如果对你有帮助,希望走过路过的,高抬贵手点个赞