这篇文章给大家分享的是有关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 有哪些核心配置呢?这里以分片引擎为例介绍最常用的几个配置项,而与读写分离、数据脱敏、编排治理相关的配置项我们会在介绍具体的应用场景时再做展开。
ShardingRuleConfiguration
DataSource是我们使用ShardingSphere的入口,创建DataSource的过程中使用到了一个ShardingDataSourceFactory类,这个工厂类的构造函数中需要传入一个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实际上是一个空接口,存在一系列的实现类,其中的每个实现类都代表一种分片策略:
在这些具体的分片策略中,通常需要指定一个分片列 shardingColumn 以及一个或多个分片算法 ShardingAlgorithm。
KeyGeneratorConfiguration
可以想象,对于一个自增列而言,KeyGeneratorConfiguration 中首先需要指定一个列名 column。同时,因为 ShardingSphere 中内置了一批自增列的实现机制(例如雪花算法 SNOWFLAKE 以及通用唯一识别码 UUID),所以需要通过一个 type 配置项进行指定
ShardingSphere提供了4种配置方式。用于不同的使用场景:
Java代码配置
Yaml配置
Spring命名空间配置
Spring Boot配置
[详细配置看官网](https://shardingsphere.apache.org/document/legacy/4.x/document/cn/manual/sharding-jdbc/configuration/ "详细配置看官网")
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获取连接。
感谢各位的阅读!关于“ShardingSphere中配置体系是如何设计的”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。