【源码】Sharding-JDBC源码分析之Yaml分片配置原理(二)

Sharding-JDBC系列

1、Sharding-JDBC分库分表的基本使用

2、Sharding-JDBC分库分表之SpringBoot分片策略

3、Sharding-JDBC分库分表之SpringBoot主从配置

4、SpringBoot集成Sharding-JDBC-5.3.0分库分表

5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表

6、【源码】Sharding-JDBC源码分析之JDBC

7、【源码】Sharding-JDBC源码分析之SPI机制

8、【源码】Sharding-JDBC源码分析之Yaml分片配置文件解析原理

9、【源码】Sharding-JDBC源码分析之Yaml分片配置原理(一)

10、【源码】Sharding-JDBC源码分析之Yaml分片配置原理(二)

前言

在上一篇   介绍了分片配置文件的根配置项分别为:

databaseName: #数据库名,String类型
dataSources: #数据源,Map<String, Map<String, Object>>类型
rules: # 规则,Collection<YamlRuleConfiguration>类型
props: # 属性,Properties类型
mode: # 模式,YamlModeConfiguration类型

限于篇幅,上篇【源码】Sharding-JDBC源码分析之Yaml分片配置原理(一)-CSDN博客只分析了dataSources的配置,本篇继续分析rules等配置信息。

【源码】Sharding-JDBC源码分析之Yaml分片配置文件解析原理-CSDN博客中介绍了通过SnakeYaml创建Yaml对象解析分片配置文件时,会先调用YamlRuleConfigurationShortcuts的getYamlShortcuts()方法,返回yaml的标注及对应的配置类,然后封装成TypeDescription,添加到SnakeYaml的Constructor中。

YamlRuleConfigurationShortcuts回顾

YamlRuleConfigurationShortcuts的源码如下:

package org.apache.shardingsphere.infra.yaml.config.shortcut;

/**
 * Yaml规则配置快捷方式
 */
public final class YamlRuleConfigurationShortcuts implements ShardingSphereYamlShortcuts {
    
    @SuppressWarnings("rawtypes")
    @Override
    @SneakyThrows(ReflectiveOperationException.class)
    public Map<String, Class<?>> getYamlShortcuts() {
        // 获取所有的规则配置转换器
        Collection<YamlRuleConfigurationSwapper> swappers = ShardingSphereServiceLoader.getServiceInstances(YamlRuleConfigurationSwapper.class);
        Map<String, Class<?>> result = new HashMap<>(swappers.size(), 1);
        for (YamlRuleConfigurationSwapper each : swappers) {
            // 获取YamlRuleConfigurationSwapper第一个实现接口的第一个泛型的类型
            Class<?> yamlRuleConfigurationClass = Class.forName(((ParameterizedType) each.getClass().getGenericInterfaces()[0]).getActualTypeArguments()[0].getTypeName());
            // 添加规则标识名字及对应规则配置类。如!SHARDING:YamlShardingRuleConfiguration
            result.put(String.format("!%s", each.getRuleTagName()), yamlRuleConfigurationClass);
        }
        return result;
    }
}

2.1)通过Java SPI获取YamlRuleConfigurationSwapper,该类为规则配置转换器,可以进行XxxRuleConfiguration和YamlXxxConfiguration的转换。如ShardingTableRuleConfiguration和YamlTableRuleConfiguration的转换。该类有18个实现类。如下:

导入shardingsphere5.3.1包时,默认引入如下实现13个类:

2.2)遍历YamlRuleConfigurationSwapper集合,获取YamlRuleConfigurationSwapper的第一个实现接口的第一个泛型的类型,执行YamlRuleConfigurationSwapper.getRuleTagName()获取规则标识名称,添加到Map集合中,最终返回Map集合。

rules配置

在YamlRootConfiguration中rules的类型为Collection<YamlRuleConfiguration>,通过YamlRuleConfigurationShortcuts返回的Yaml标注及对应配置类都实现了YamlRuleConfiguration接口。所以rules的配置是由YamlRuleConfigurationShortcuts返回的Yaml标注及对应配置类决定的。标注和对应的配置类如下:

名称标注配置类
数据分片规则!SHARDINGYamlShardingRuleConfiguration
权限规则!AUTHORITYYamlAuthorityRuleConfiguration
变更数据捕获规则!CDCYamlCDCRuleConfiguration
数据库发现规则!DB_DISCOVERYYamlDatabaseDiscoveryRuleConfiguration
数据加密规则!ENCRYPTYamlEncryptRuleConfiguration
数据脱敏规则!MASKYamlMaskRuleConfiguration
读写分离规则!READWRITE_SPLITTINGYamlReadwriteSplittingRuleConfiguration
SQL解析规则!SQL_PARSERYamlSQLParserRuleConfiguration
SQl翻译规则!SQL_TRANSLATORYamlSQLTranslatorRuleConfiguration
影子库规则!SHADOWYamlShadowRuleConfiguration
数据分片路由缓存规则!SHARDING_CACHEYamlShardingCacheRuleConfiguration
单表规则!SINGLEYamlSingleRuleConfiguration
流量规则!TRAFFICYamlTrafficRuleConfiguration
事务规则!TRANSACTIONYamlTransactionRuleConfiguration

ShardingSphere不同版本对应的rules配置规则会有变更,具体的配置,可查看对应版本的源码。

由于可配置信息太多,以下以数据分片规则配置为例。

数据分片规则配置

4.1 数据分片配置

通过以上的分析,对于数据分片规则,配置时,使用!SHARDING标签标识,配置示例见官网:数据分片 :: ShardingSphere

4.2 YamlShardingRuleConfiguration

以上的官网配置为最新版本5.5的数据分片配置,以下的源码为5.3的版本。

数据分片规则配置对应的Yaml解析类为YamlShardingRuleConfiguration,源码如下:

package org.apache.shardingsphere.sharding.yaml.config;

/**
 * 数据分片规则配置
 */
@Getter
@Setter
public final class YamlShardingRuleConfiguration implements YamlRuleConfiguration {

    // 分片表规则配置
    private Map<String, YamlTableRuleConfiguration> tables = new LinkedHashMap<>();

    // 自动表规则配置
    private Map<String, YamlShardingAutoTableRuleConfiguration> autoTables = new LinkedHashMap<>();

    // 绑定表规则
    private Collection<String> bindingTables = new LinkedList<>();

    // 广播表规则
    private Collection<String> broadcastTables = new LinkedList<>();

    // 默认数据库分片策略配置
    private YamlShardingStrategyConfiguration defaultDatabaseStrategy;

    // 默认表分片策略配置
    private YamlShardingStrategyConfiguration defaultTableStrategy;

    // 默认的分布式主键生成策略
    private YamlKeyGenerateStrategyConfiguration defaultKeyGenerateStrategy;

    // 默认审计策略配置
    private YamlShardingAuditStrategyConfiguration defaultAuditStrategy;

    // 分片算法配置
    private Map<String, YamlAlgorithmConfiguration> shardingAlgorithms = new LinkedHashMap<>();

    // 分布式主键生成器算法配置
    private Map<String, YamlAlgorithmConfiguration> keyGenerators = new LinkedHashMap<>();

    // 分片审计算法配置
    private Map<String, YamlAlgorithmConfiguration> auditors = new LinkedHashMap<>();

    // 默认分片键
    private String defaultShardingColumn;
    
    @Override
    public Class<ShardingRuleConfiguration> getRuleConfigurationType() {
        return ShardingRuleConfiguration.class;
    }
}

在实际项目中,可以结合所使用的版本的源码进行配置。其中属性名对应yaml配置中的key,类型为对应yaml配置中的值的信息。

props配置

props的类型为Properties类型,该类为java.util包中的类,继承Hashtable,是线程安全的。核心源码如下:

package java.util;

public class Properties extends Hashtable<Object,Object> {

    private static final Unsafe UNSAFE = Unsafe.getUnsafe();

    private transient volatile ConcurrentHashMap<Object, Object> map;
    // 省略其他
}

props的配置信息为key:value,其中可配置的信息见属性配置 :: ShardingSphere

mode配置

mode为Apache ShardingSphere 为不同的运行模式提供了不同的元数据持久化方式,详见:元数据持久化仓库 :: ShardingSphere。通俗的理解,mode的配置是用于持久化存储当前系统配置的分片策略等信息,即存储Yaml中配置的信息,包括数据源中对应的dataSourceClassName对应的默认的配置信息。

6.1 源码分析

mode的类型为YamlModeConfiguration,YamlModeConfiguration的源码如下:

package org.apache.shardingsphere.infra.yaml.config.pojo.mode;

/**
 * 模型配置
 */
@Getter
@Setter
public final class YamlModeConfiguration implements YamlConfiguration {

    // 类型
    private String type;

    // 持久化存储配置
    private YamlPersistRepositoryConfiguration repository;
}

持久化存储配置YamlPersistRepositoryConfiguration的源码如下:

package org.apache.shardingsphere.infra.yaml.config.pojo.mode;

/**
 * 持久存储化配置
 */
@Getter
@Setter
public final class YamlPersistRepositoryConfiguration implements YamlConfiguration {

    // 类型
    private String type;

    // 属性
    private Properties props = new Properties();
}

6.2 配置示例

mode:
  type: Standalone
  repository:
    type: JDBC
    props:
      provider: mysql
      jdbc_url: jdbc:mysql://localhost:3306/shardingjdbctest?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
      username: root
      password: 123456

如以上配置,设置为单例模式,持久化类型为JDBC,配置了mysql数据库信息,则会在对应的数据库中自动创建一个repository表,表中Yaml的配置信息。

表信息如下:

小结

限于篇幅,本篇先分享到这里。结合上一篇配置信息,以下做一个小结:

1)分片配置文件通过SnakeYaml解析成YamlRootConfiguration对象;

分片配置文件中可以配置的根key为:

databaseName: #数据库名,String类型,默认为logic_db
dataSources: #数据源,Map<String, Map<String, Object>>类型
rules: # 规则,Collection<YamlRuleConfiguration>类型
props: # 属性,Properties类型
mode: # 模式,YamlModeConfiguration类型

2)dataSources数据源配置,类型为Map<String, Map<String, Object>>,可配置多个;

2.1)dataSources必现配置dataSourceClassName,根据不同的dataSourceClassName,可以设置对应属性配置。默认有:com.mchange.v2.c3p0.ComboPooledDataSource、
com.zaxxer.hikari.HikariDataSource等;

2.2)对于url、username、password等基础配置项,不同的dataSourceClass有对应的兼容性配置项;

2.3)不同的dataSourceClass添加了不同的默认配置项;

具体的配置项可参考:C3P0DataSourcePoolMetaData、HikariDataSourcePoolMetaData等

3)rules规则配置,类型为Collection<YamlRuleConfiguration>,可配置多个。规则的配置是通过Yaml的标注匹配对应的配置类。详见正文的rules配置信息;

3.1)通过YamlRuleConfigurationShortcuts的getYamlShortcuts()方法,使用Java SPI获取系统中定义的所有YamlRuleConfigurationSwapper。遍历YamlRuleConfigurationSwapper,从实现类中获取对应规则的标签及配置类;

3.2)将3.1)中的标签和配置类封装成TypeDescription添加到SnakeYaml中。及对应的标签会解析为对应的配置类;

详见:

【源码】Sharding-JDBC源码分析之Yaml分片配置文件解析原理-CSDN博客

Yaml及解析框架SnakeYaml简介及TypeDescription的使用和原理-CSDN博客

不同的ShardingSphere版本对应的rules配置信息可能会有不同,在实际项目中,可以结合使用的版本的源码进行配置。

4)props配置,类型为java.util.Properties,该类继承Hashtable,线程安全的Map类。可配置的信息见:属性配置 :: ShardingSphere

5)mode配置,类型为YamlModeConfiguration。该模式配置用于持久化存储Yaml等配置信息,可配置信息见:元数据持久化仓库 :: ShardingSphere

以上为本篇分享的全部内容。

关于本篇内容你有什么自己的想法或独到见解,欢迎在评论区一起交流探讨下吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值