shardingJDBC源码流程及实现可插拔的SPI机制

上篇博客已经知道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源码总结的核心流程:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值