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标注及对应配置类决定的。标注和对应的配置类如下:
名称 | 标注 | 配置类 |
数据分片规则 | !SHARDING | YamlShardingRuleConfiguration |
权限规则 | !AUTHORITY | YamlAuthorityRuleConfiguration |
变更数据捕获规则 | !CDC | YamlCDCRuleConfiguration |
数据库发现规则 | !DB_DISCOVERY | YamlDatabaseDiscoveryRuleConfiguration |
数据加密规则 | !ENCRYPT | YamlEncryptRuleConfiguration |
数据脱敏规则 | !MASK | YamlMaskRuleConfiguration |
读写分离规则 | !READWRITE_SPLITTING | YamlReadwriteSplittingRuleConfiguration |
SQL解析规则 | !SQL_PARSER | YamlSQLParserRuleConfiguration |
SQl翻译规则 | !SQL_TRANSLATOR | YamlSQLTranslatorRuleConfiguration |
影子库规则 | !SHADOW | YamlShadowRuleConfiguration |
数据分片路由缓存规则 | !SHARDING_CACHE | YamlShardingCacheRuleConfiguration |
单表规则 | !SINGLE | YamlSingleRuleConfiguration |
流量规则 | !TRAFFIC | YamlTrafficRuleConfiguration |
事务规则 | !TRANSACTION | YamlTransactionRuleConfiguration |
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;
以上为本篇分享的全部内容。
关于本篇内容你有什么自己的想法或独到见解,欢迎在评论区一起交流探讨下吧。