ShardingSphere 已于2020年4月16日成为 Apache 软件基金会的顶级项目
Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
Apache ShardingSphere 定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 它通过关注不变,进而抓住事物本质。关系型数据库当今依然占有巨大市场,是各个公司核心业务的基石,未来也难于撼动,我们目前阶段更加关注在原有基础上的增量,而非颠覆。
Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、多数据副本、数据加密、影子库压测等功能,以及对 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。 开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,而且仍在不断增加中。
springboot2.x + Mybatis + Durid + sharding jdbc 为例
此不分库分表案例实战, 此项目为入门级别,理解概念,流程原理,分库分表无非就是配置的问题。下文附属官网地址、中文地址、分库分表项目实战gitbub地址
1. 创建一个spring boot 项目
2..pom.xml 添加依赖
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.0.1
mysql
mysql-connector-java
com.alibaba
druid-spring-boot-starter
1.1.16
org.apache.shardingsphere
sharding-jdbc-spring-boot-starter
4.0.0-RC1
com.fasterxml.jackson.core
jackson-databind
com.fasterxml.jackson.core
jackson-annotations
com.fasterxml.jackson.core
jackson-annotations
2.9.8
2. Application 添加扫描mapper 注解 @MapperScan
@SpringBootApplication(scanBasePackages = "com.cxytiandi")
@MapperScan(basePackages = {"com.cxytiandi.sharding.mapper"})
public class ShardingTableApplication {
public static void main(String[] args) {
SpringApplication.run(ShardingTableApplication.class, args);
}
}
3. 创建 User UserService UserMapper UerController
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/add01")
public Object add01() {
for (long i = 1; i < 20; i++) {
User user = new User();
user.setId(i);
user.setCity("深圳"+i);
user.setName("李四"+i);
userService.add(user);
}
return "success";
}
}
@Service
public class UserService{
@Autowired
private UserMapper userMapper;
public int add(User user) {
return userMapper.addUser(user);
}
}
public interface UserMapper {
int addUser(User user);
}
public class User {
@JsonProperty("id")
@JsonInclude(JsonInclude.Include.NON_NULL)
private Long id;
@JsonProperty("city")
@JsonInclude(JsonInclude.Include.NON_NULL)
private String city = "";
@JsonProperty("name")
@JsonInclude(JsonInclude.Include.NON_NULL)
private String name = "";
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
4. 添加 UserMapper.xml 文件
INSERT INTO user (
id, city, name
)
VALUES (
#{id,jdbcType=INTEGER},
#{city,jdbcType=VARCHAR},
#{name,jdbcType=VARCHAR}
)
5.application.properties 文件配置,根据自己习惯.yml
server.port=8084
#配置扫描xml 文件路径
mybatis.mapper-locations=classpath:META-INF/mapper/*.xml
spring.shardingsphere.datasource.names=master
# 数据源
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://192.xxx.xxx.xxx:3306/db01?characterEncoding=utf-8
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=root
# 分表配置
spring.shardingsphere.sharding.tables.user.actual-data-nodes=master.user_${0..3}
# 自定义分表算法
#spring.shardingsphere.sharding.tables.user.table-strategy.standard.sharding-column=id
#spring.shardingsphere.sharding.tables.user.table-strategy.standard.precise-algorithm-class-name=com.cxytiandi.sharding.algorithm.MyPreciseShardingAlgorithm
#分片策略 行表达式分片策略 inline
# inline 表达式
spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression=user_${id.longValue() % 4}
添加数据的日志信息
6. guthub 项目分库分表读写分离项目实战
https://github.com/yinjihuan/sharding-jdbc
7.Sharding 中午官网
https://shardingsphere.apache.org/document/current/cn/overview/
8. Shading 英文官网
https://shardingsphere.apache.org/document/current/en/overview/