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

news2025/1/12 12:17:06

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;

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2040121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

奥运奖牌窥视

1 前言 2024巴黎奥运会已经闭幕了&#xff0c;中国队创纪录地获得了海外举办的奥运会的最佳成绩&#xff0c;我们来个管中窥豹&#xff0c;看看中国队从哪些项目中取得了奖牌。 2 奖牌组成 游泳真是大项&#xff0c;小项数量众多&#xff0c;比如个人自由泳就有100m、200m、4…

经纬恒润亮相第四届焉知汽车年会,功能安全赋能域控

8月初&#xff0c;第四届焉知汽车年会在上海举行。此次年会围绕当下智能电动汽车的热点和焦点&#xff0c;聚焦于智能汽车场景应用、车载通信、激光雷达、智能座舱、功能安全、电驱动系统等多个领域&#xff0c;汇聚了来自OEM、科技公司、零部件供应商、测试认证机构、政府院校…

顾客账单管理和台账-SAAS 本地化及未来之窗行业应用跨平台架构

一、客户账单对客户和企业的帮助 为您的企业客户打造便捷新体验&#xff01;现在&#xff0c;企业客户做账消费后&#xff0c;可自行下载账单。这一创新举措不仅大大减少了公司售后的压力&#xff0c;更能助力企业客户提升办公效率。想象一下&#xff0c;无需繁琐的沟通与等待…

论文阅读:一种基于凸规划的高效有向最密子图发现方法 | SIGMOD 2022

论文概述 这篇论文的主题是研究如何在有向图中找到密度最高的子图&#xff0c;这个问题被称为有向最密子图&#xff08;Directed Densest Subgraph, DDS&#xff09;问题。该问题在许多应用中非常重要&#xff0c;如社交网络分析、社区发现、假粉丝检测等。论文提出了一种基于…

【前端面试】挖掘做过的nextJS项目(上)

为什么使用nextJS 需求: 快速搭建宣传官网 1.适应pc、移动端 2.基本的路由跳转 3.页面渲染优化 4.宣传的图片、视频资源的加载优化 5.seo优化 全栈react web应用、 tailwind css原子工具的支持&#xff0c;方便书写响应式ui app router(React 服务器组件)支持服务器渲…

灵活易用的树莓派相机和计算机,降低了3D冰川建模的成本!

利兹大学的研究人员正在监测秘鲁的凯尔卡亚冰帽&#xff0c;这是世界上仅有的几个热带冰帽之一。 在欧洲成功进行试验之后&#xff0c;利兹大学地理学院​​​​​​​的研究人员正在安第斯山脉和喜马拉雅山脉使用树莓派计算机和树莓派高品质相机&#xff0c;建立低成本、长期…

Springboot权限管理系统

1、基于SpringBoot Mybatis Plus SaToken Thymeleaf Layui的后台管理系统 2、接入Sa-Token&#xff0c;支持菜单权限 数据库支持 MySQL、Oracle、sqlServer 等主流数据库 3、提供代码生成器&#xff0c;基本增删改查无需编写&#xff0c;可快速完成开发任务。 4、后台接口R…

从行为面试问题(behavioral questions)看中美程序员差异。

中美程序员在职场中的工作状态和职能、福利等有很大区别&#xff0c;从面试中的BQ轮就可见一斑。 中美程序员的面试轮差异&#xff1f; 国内的面试轮在不同公司间差异很大&#xff0c;但总体的问题类型包含笔试面试&#xff08;算法题、概念题、项目深挖、职业目标、职场文化…

Leetcode JAVA刷刷站(27)移除元素

一、题目概述 二、思路方向 为了解决这个问题&#xff0c;你可以使用双指针的方法来原地移除所有等于 val 的元素&#xff0c;并返回不等于 val 的元素数量。 三、代码实现 public class Solution { public int removeElement(int[] nums, int val) { int left 0; // 左指…

结构开发笔记(四):solidworks软件(三):绘制36x36方块摄像头示意体

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141187797 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

【中国数据库前世今生】数据存储管理的起源与现代数据库发展启蒙

记录开启本篇的目的: 作为1名练习时长2年半的DBA&#xff0c;工作大部分时间都在和数据库打交道&#xff0c;包括Oracle,Mysql,Postgresql,Opengauss等国内外数据库。但是对数据库的发展史却知之甚少。 正好腾讯云开发者社区正在热播:【纪录片】中国数据库前世今生,借此机会了解…

C语言 | Leetcode C语言题解之第337题打家劫舍III

题目&#xff1a; 题解&#xff1a; struct SubtreeStatus {int selected;int notSelected; };struct SubtreeStatus dfs(struct TreeNode *node) {if (!node) {return (struct SubtreeStatus){0, 0};}struct SubtreeStatus l dfs(node->left);struct SubtreeStatus r df…

ubuntu22.04不生成core文件

一、检查服务器的core文件是否打开 ulimit -a //查看时候打开core 如果core file size 是0就是关闭的&#xff01;服务一般都是关闭的&#xff01;将他打开即可&#xff01; ulimit -c size//设置core file的大小&#xff0c;自定义 此时打开就可以生成了core文件了&#xff…

C语言 | Leetcode C语言题解之第336题回文对

题目&#xff1a; 题解&#xff1a; #define SIZE 9470 #define N 168000 #define P 13331typedef unsigned long long ULL; ULL p[301];//p[i]存储P^ivoid init()//初始化p进制次幂数组 {int i;p[0]1;for(i1;i<300;i){p[i]p[i-1]*P;} }int** palindromePairs(char**words,…

node异常:npm ERR! gyp verb check python checking Python executable “python2“ in t

node异常:npm ERR! gyp verb check python checking Python executable "python2" in t node异常&#xff1a; npm ERR! gyp verb check python checking for Python executable "python2" in t降低版本&#xff1a;npm install -g npm6.14.4 欢迎关注&a…

设计模式六大原则(一)--单一职责原则

GPT-4o (OpenAI) 单一职责原则&#xff08;Single Responsibility Principle&#xff0c;SRP&#xff09;是面向对象设计中的一条基本原则。该原则的核心思想是&#xff1a;一个类应该只有一个引起它变化的原因。换句话说&#xff0c;一个类应该只有一个职责&#xff08;即一个…

【嵌入式操作系统(Linux篇)】知识点期末复习(2)

以下是关于嵌入式操作系统&#xff08;Linux篇&#xff09;的知识点总结版 目录 ​ part 1 Linux系统基础 1、嵌入式OS(EOS): 2、嵌入式操作系统的特点 3、嵌入式Linnx的优势 4、Linnx是什么&#xff1f;是一种UNIX操作系统的克隆 5、Linux操作系统整体介绍. (1)Lin…

智能外呼机器人助力电销

在接回一家公司的电话时&#xff0c;听着员工那动听的声音&#xff0c;你或许会猜到电话那头是个清纯美丽的女孩&#xff0c;其实&#xff0c;打电话给你的只是一个机器人。外呼智能机器人开启了智能人机交互时代。 1、情绪稳定 每个电话都可以用最佳的声音和答案与客户进行沟…

SpringBoot响应式编程(2)WebFlux入门

一、概述 1.1简介 简单来说&#xff0c;Webflux 是响应式编程的框架&#xff0c;与其对等的概念是 SpringMVC。两者的不同之处在于 Webflux 框架是异步非阻塞的&#xff0c;其可以通过较少的线程处理高并发请求。 WebFlux&#xff1a;底层完全基于nettyreactorspringweb 完成…

深入解析 vue 3 获取响应式数据

Vue 3 引入了一个全新的响应式系统&#xff0c;其中最核心的就是 reactive 和 ref。它们是实现响应式数据的基础&#xff0c;用于创建可以自动跟踪变化并更新视图的对象和变量。 1. reactive&#xff1a;响应式对象 1、概念 reactive 是用于创建响应式对象的 API。它接收一个…