这篇文章,我们聊聊 shardingsphere jdbc 5.X 路由引擎的设计流程。

img

SQL 路由引擎分支非常多,每一种路由策略都讲完需要很多篇章,笔者觉得也没有必要,所以本文的主轴还是按照「标准分片路由」脉络来讲解。

标准分片路由使用的例子是:

img

1. 内核处理器KernelProcessor

img

shardingsphere 内核处理器在生成「 执行上下文」时,会执行三个操作,分别是: 路由重写创建执行上下文

而路由结果是通过路由引擎生成的 ,见下图:

img

2. 路由执行器 PartialSQLRouteExecutor

img

路由引擎的路由方法内部,第一步是创建「 路由执行器 SQLRouteExecutor」,一般来讲增删改查的操作都会构造 PartialSQLRouteExecutor 执行器

该路由执行器内部需要构造分片算法、配置属性 ,其实也容易理解,要想知道当前执行的 SQL 路由到哪个分片,必须要知道当前 SQL 逻辑表对应的 分片算法信息。

路由执行器 PartialSQLRouteExecutor 在初始化时,会通过 SPI 机制创建 ShardingSQLRouter 对象 。

3. 分片 SQL 路由 ShardingSQLRouter

路由执行器 PartialSQLRouteExecutor 调用 ShardingSQLRouter 的 createRouteContext 的方法。

img

笔者将方法做了简化,本质上做三个事情:

  1. 组装分片条件
  2. 选择并构建「分片路由引擎」
  3. 分片路由引擎调用路由方法

4. 组装分片条件 shardingConditions

img分片 SQL 路由对象 ShardingSQLRouter 首先会组装分片条件 ,从 DEBUG 来看,分片条件对象见上图:

1、分片条件是一个数组;

2、每一个分片字段对应一个分片条件条目 ,当前分片字段是 order_id

3、分片条件条目包含分片字段的值和参数索引 , 即 order_id = 1 ,且 参数索引为 0

对于 Insert 语句来讲,组装分片条件原理比较简单:

img1、遍历 ValueExpression ,即 SQL 语句中的: (?,?,?)

img

2、判断每个条目对应的字段是否是分片字段

img

3、根据字段参数索引获取字段值

「 预编译赋值列表」被封装在查询上下文 QueryContext 里,见下图:

img

order_id 是分片字段, 想要获取 order_id 的值,只需要使用如下的方法即可:

img

5. 选择并构建「分片路由引擎」

分片路由引擎工厂 ShardingRouteEngineFactory 会根据相关条件,选择创建「标准路由」和「复合路由」。

img

6. 「分片路由引擎」调用路由方法

接下来,我们重点分析标准路由(单表 & 绑定表) 如何实现路由方法 。

img

标准路由引擎的最重要一步,就是需要根据分片规则、分表规则获取数据节点

笔者将流程做了简化如下:

1、根据分片规则分别获取分库规则、分表规则

img

2、路由数据库

img

3、路由表

img

最后,我们 DEBUG 下 分片结果:

img

7. 总结

这篇文章,我们讲解了标准分片路由的流程。

1、内核处理器 KernelProcessor

内核处理器在生成「 执行上下文」时,会执行三个操作,分别是: 路由重写创建执行上下文

2、路由执行器 PartialSQLRouteExecutor

路由引擎的路由方法内部,第一步是创建「 路由执行器 SQLRouteExecutor」,一般来讲增删改查的操作都会构造 PartialSQLRouteExecutor 执行器

3、分片 SQL 路由 ShardingSQLRouter

  1. 组装分片条件
  2. 选择并构建「分片路由引擎」
  3. 分片路由引擎调用路由方法

4、组装分片条件 shardingConditions

对于 Insert 语句来讲,组装分片条件原理比较简单:

  1. 根据分片规则分别获取分库规则、分表规则
  2. 判断每个条目对应的字段是否是分片字段
  3. 根据字段参数索引获取字段值

5、选择并构建「分片路由引擎」

分片路由引擎工厂 ShardingRouteEngineFactory 会根据相关条件,选择创建「标准路由」和「复合路由」。

6、「分片路由引擎」调用路由方法

  1. 根据分片规则分别获取分库规则、分表规则
  2. 根据分库规则,路由数据库
  3. 根据分表规则,路由表

本站由 卡卡龙 使用 Stellar 1.29.1主题创建

本站访问量 次. 本文阅读量 次.