ShardingSphere学习:04-ShardingSphere中的配置体系是如何设计的?

什么是行表达式?

行表达式是 ShardingSphere 中用于实现简化和统一配置信息的一种工具,在日常开发过程中应用得非常广泛。 它的使用方式非常直观,只需要在配置中使用 ${expression} 或 $->{expression} 表达式即可。

基于行表达式语法,${begin..end} 表示的是一个从"begin"到"end"的范围区间,而多个 ${expression} 之间可以用"."符号进行连接,代表多个表达式数值之间的一种笛卡尔积关系。

类似场景也可以使用枚举的方式来列举所有可能值。行表达式也提供了 ${[enum1, enum2,…, enumx]} 语法来表示枚举值,所以"ds${0..1}.user${0..1}"的效果等同于"ds${[0,1]}.user${[0,1]}"。

由于 ${expression} 与 Spring 本身的属性文件占位符冲突,而 Spring 又是目前主流的开发框架,因此在正式环境中建议你使用 $->{expression} 来进行配置。

ShardingSphere有哪些核心配置?

对于分库分表、读写分离操作而言,配置的主要任务是完成各种规则的创建和初始化。配置是整个ShardingSphere的核心,也是我们日常开发过程中的抓药工作。可以说,只要我们掌握了ShardingSphere的核心配置项,就相当于掌握了这个框架的使用方法。那么,ShardingSphere 有哪些核心配置呢?这里以分片引擎为例介绍最常用的几个配置项,而与读写分离、数据脱敏、编排治理相关的配置项我们会在介绍具体的应用场景时再做展开。

ShardingRuleConfiguration

DataSource是我们使用ShardingSphere的入口,创建DataSource的过程中使用到了一个ShardingDataSourceFactory类,这个工厂类的构造函数中需要传入一个ShardingRuleConfiguration对象。显然,从命名上看,这个ShardingRuleConfiguration就是用于分片规则的配置入口。

ShardingRuleConfiguration中所需要配置的规则比较多,下面通过一张图例来进行简单说明

ShardingRuleConfiguration中的配置项列表

事实上,对于ShardingRuleConfiguration而言,必须要设置的只有一个配置项,即TableRuleConfiguration。

TableRuleConfiguration

从命名上看,TableRuleConfiguration是表分片规则配置,但事实上,这个类同时包含了对分库和分表两种场景的设置,TableRuleConfiguration包含很多重要的配置项:

  • actualDataNodes:代表真实的数据节点,由数据源名+表名组成,支持行表达式。例如:ds${0..1}.user${0..1}
  • databaseShardingStrategyConfig:代表分表策略,如果不设置也会使用默认分表策略,这里的默认分表策略同样来自ShardingRuleConfiguration中的defaultTableShardingStrategyConfig配置
  • keyGeneratorConfig:代表分布式环境下的自增列生成器配置,ShardingSphere中集成了雪花算法等分布式ID的生成器实现。

ShardingStrategyConfiguration

dataBaseShardingStrategyConfig和tableShardingStrategyConfig的类型都是一个ShardingStrategyConfiguration对象。在ShardingSphere中,ShardingStrategyConfiguration实际上是一个空接口,存在一系列的实现类,其中的每个实现类都代表一种分片策略:

ShardingStrategyConfiguration接口

在这些具体的分片策略中,通常需要指定一个分片列 shardingColumn 以及一个或多个分片算法 ShardingAlgorithm。

KeyGeneratorConfiguration

可以想象,对于一个自增列而言,KeyGeneratorConfiguration 中首先需要指定一个列名 column。同时,因为 ShardingSphere 中内置了一批自增列的实现机制(例如雪花算法 SNOWFLAKE 以及通用唯一识别码 UUID),所以需要通过一个 type 配置项进行指定

ShardingSphere提供了哪些配置方式?

ShardingSphere提供了4种配置方式。用于不同的使用场景:

  • Java代码配置
  • Yaml配置
  • Spring命名空间配置
  • Spring Boot配置

[详细配置看官网](https://shardingsphere.apache.org/document/legacy/4.x/document/cn/manual/sharding-jdbc/configuration/ "详细配置看官网")

ShardingSphere的配置体系是如何实现的?

ShardingRuleConfiguration配置体系

对于ShardingSphere而言,配置体系的作用本质上就是用来初始化DataSource等JDBC对象。例如,ShardingDataSourceFactory就是基于传入的数据源Map、ShardingRuleConfiguration以及Properties来创建一个ShardingDataSource对象:

public final class ShardingDataSourceFactory {

    public static DataSource createDataSource(
            final Map<String, DataSource> dataSourceMap, final ShardingRuleConfiguration shardingRuleConfig, final Properties props) throws SQLException {
        return new ShardingDataSource(dataSourceMap, new ShardingRule(shardingRuleConfig, dataSourceMap.keySet()), props);
	} 
}

在 ShardingSphere 中,所有规则配置类都实现了一个顶层接口 RuleConfiguration。RuleConfiguration 是一个空接口,ShardingRuleConfiguration 就是这个接口的实现类之一,专门用来处理分片引擎的应用场景。下面这段代码就是 ShardingRuleConfiguration 类的实现过程:

public final class ShardingRuleConfiguration implements RuleConfiguration {
    //表分片规则列表
    private Collection<TableRuleConfiguration> tableRuleConfigs = new LinkedList<>();
    //绑定表规则列表
    private Collection<String> bindingTableGroups = new LinkedList<>();
    //广播表规则列表
    private Collection<String> broadcastTables = new LinkedList<>();
    //默认数据源
    private String defaultDataSourceName;
    //默认分库策略
    private ShardingStrategyConfiguration defaultDatabaseShardingStrategyConfig;
    //默认分表策略
    private ShardingStrategyConfiguration defaultTableShardingStrategyConfig;
    //默认自增列值生成器
    private KeyGeneratorConfiguration defaultKeyGeneratorConfig;
    //读写分离规则
    private Collection<MasterSlaveRuleConfiguration> masterSlaveRuleConfigs = new LinkedList<>();
    //数据脱敏规则
    private EncryptRuleConfiguration encryptRuleConfig;
}

可以看到,ShardingRuleConfiguration 中包含的就是一系列的配置类定义,通过前面的内容介绍,我们已经明白了这些配置类的作用和使用方法。其中,核心的 TableRuleConfiguration 定义也比较简单,主要包含了逻辑表、真实数据节点以及分库策略和分表策略的定义:

public final class TableRuleConfiguration {
    //逻辑表
    private final String logicTable;
    //真实数据节点
    private final String actualDataNodes;
    //分库策略
    private ShardingStrategyConfiguration databaseShardingStrategyConfig;
    //分表策略
    private ShardingStrategyConfiguration tableShardingStrategyConfig;
    //自增列生成器
    private KeyGeneratorConfiguration keyGeneratorConfig;

    public TableRuleConfiguration(final String logicTable) {
        this(logicTable, null);
    }

    public TableRuleConfiguration(final String logicTable, final String actualDataNodes) {
        Preconditions.checkArgument(!Strings.isNullOrEmpty(logicTable), "LogicTable is required.");
        this.logicTable = logicTable;
        this.actualDataNodes = actualDataNodes;
    }
}

无论采用哪种配置方式,所有的配置项都是在这些核心配置类的基础之上进行封装和转换。最终生成ShardingRuleConfiguration,然后通过ShardingDataSourceFatory生成ShardingDataSource获取连接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章