上篇博客已经知道shardingjdbc相关的分片策略、绑定表以及广播表等功能,这篇博客整理的是读写分离,spi机制实现自定义分片键的生成策略以及核心源码流程
读写分离
shardingJDBC的读写分离是基于mysql的主从复制,通过写主库读从库来提升系统的性能,mysql的主从搭建请参考CSDN这篇博文,shardingJDBC读写分离的配置如下:(配置的库和表都请参考CSDN)
#读写分离
spring.shardingsphere.datasource.names=m1,s1
# 配置第 1 个数据源:主库
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://192.168.43.11:3306/mdemo?serverTimezone=UTC
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=123456
# 配置第 2 个数据源:从库
spring.shardingsphere.datasource.s1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.s1.url=jdbc:mysql://192.168.43.12:3306/mdemo?serverTimezone=UTC
spring.shardingsphere.datasource.s1.username=root
spring.shardingsphere.datasource.s1.password=123456
#读写分离规则
spring.shardingsphere.sharding.master-slave-rules.ms0.master-data-source-name=m1
spring.shardingsphere.sharding.master-slave-rules.ms0.slave-data-source-names[0]=s1
#配置读写分离的表分片
spring.shardingsphere.sharding.tables.user.actual-data-nodes=ms0.user
#雪花算法配置
spring.shardingsphere.sharding.tables.user.key-generator.column=id
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE
spring.shardingsphere.sharding.tables.user.key-generator.props.worker.id=1
spring.shardingsphere.props.sql.show=true
spring.main.allow-bean-definition-overriding=true
配置完成向user表插入数据写入主库,查询user表的数据会从从库查询。这就是shardingjdbc的分库分表,很简单吧。
@Test
public void insertMasterslaveUser() {
for (int i = 0; i < 20; i++) {
User user = new User();
user.setAge(i);
user.setName("jjjj" + i);
userMapper.insert(user);
}
}
@Test
public void queryUser () {
List<User> users = userMapper.selectList(null);
users.forEach(user -> System.out.println(user));
}
插入sql部分日志插入的数据库为主库m1
查询的真实数据库为从库s1
SPI可拓展机制实现自定义生成分片键的策略
根据SPI的特性,需要在resources下创建META-INF/services目录并创建org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator文件,文件内容为自定义的实现类的包路径名
MyShardingKeyGenerator实现了ShardingKeyGenerator
@Log4j2
public class MyShardingKeyGenerator implements ShardingKeyGenerator {
@Getter
@Setter
Properties properties = new Properties();
@Override
public Comparable<?> generateKey() {
String property = properties.getProperty("mykey.offset", "10");
log.info("property: {}" + property);
Long key = System.currentTimeMillis() + new Random().nextInt(Integer.valueOf(property));
log.info("key: {}" + key);
return key;
}
@Override
public String getType() {
return "MyKey";
}
}
在inline的配置基础上修改分片键为MyKey
#使用自定义的主键生成策略
spring.shardingsphere.sharding.tables.user.key-generator.column=user_id
spring.shardingsphere.sharding.tables.user.key-generator.type=MyKey
spring.shardingsphere.sharding.tables.user.key-generator.props.mykey.offset=88
如此就通过spi机制实现自定义自动生成主键的算法,测试:
@Test
public void testUser() {
for (int i = 0; i < 20; i++) {
User user = new User();
user.setAge(i);
user.setId(Long.valueOf(new Random().nextInt(100)));
user.setName("jjjj" + i);
user.setUstatus(String.valueOf(new Random().nextInt(2)+1));
userMapper.insert(user);
}
}
结果:
核心源码流程
在看源码流程之前,仔细思考并总结下shardingJDBC的使用示例,我们只需要根据需求配置shardingjdbc的数据源和分片策略,就可以完成对应的数据库分库分表的操作。相当于shardingjdbc为我们封装了真实的数据库操作,我们只需要关心shardingjdbc相关的操作使用就可以完成分库分表操作,而它的底层源码为分库分表做了所有的事情。下图是博主通过demo debug源码总结的核心流程: