这篇文章,我们聊聊 shardingsphere jdbc 5.X 路由引擎的设计流程。
SQL 路由引擎分支非常多,每一种路由策略都讲完需要很多篇章,笔者觉得也没有必要,所以本文的主轴还是按照「标准分片路由」脉络来讲解。
标准分片路由使用的例子是:
1. 内核处理器KernelProcessor
shardingsphere 内核处理器在生成「 执行上下文」时,会执行三个操作,分别是: 路由、重写、创建执行上下文。
而路由结果是通过路由引擎生成的 ,见下图:
2. 路由执行器 PartialSQLRouteExecutor
路由引擎的路由方法内部,第一步是创建「 路由执行器 SQLRouteExecutor」,一般来讲增删改查的操作都会构造 PartialSQLRouteExecutor 执行器 。
该路由执行器内部需要构造分片算法、配置属性 ,其实也容易理解,要想知道当前执行的 SQL 路由到哪个分片,必须要知道当前 SQL 逻辑表对应的 分片算法信息。
路由执行器 PartialSQLRouteExecutor 在初始化时,会通过 SPI 机制创建 ShardingSQLRouter 对象 。
3. 分片 SQL 路由 ShardingSQLRouter
路由执行器 PartialSQLRouteExecutor 调用 ShardingSQLRouter 的 createRouteContext 的方法。
笔者将方法做了简化,本质上做三个事情:
- 组装分片条件
- 选择并构建「分片路由引擎」
- 分片路由引擎调用路由方法
4. 组装分片条件 shardingConditions
分片 SQL 路由对象 ShardingSQLRouter 首先会组装分片条件 ,从 DEBUG 来看,分片条件对象见上图:
1、分片条件是一个数组;
2、每一个分片字段对应一个分片条件条目 ,当前分片字段是 order_id
3、分片条件条目包含分片字段的值和参数索引 , 即 order_id = 1 ,且 参数索引为 0
对于 Insert 语句来讲,组装分片条件原理比较简单:
1、遍历 ValueExpression ,即 SQL 语句中的: (?,?,?)
2、判断每个条目对应的字段是否是分片字段
3、根据字段参数索引获取字段值
「 预编译赋值列表」被封装在查询上下文 QueryContext 里,见下图:
order_id 是分片字段, 想要获取 order_id 的值,只需要使用如下的方法即可:
5. 选择并构建「分片路由引擎」
分片路由引擎工厂 ShardingRouteEngineFactory 会根据相关条件,选择创建「标准路由」和「复合路由」。
6. 「分片路由引擎」调用路由方法
接下来,我们重点分析标准路由(单表 & 绑定表) 如何实现路由方法 。
标准路由引擎的最重要一步,就是需要根据分片规则、分表规则获取数据节点。
笔者将流程做了简化如下:
1、根据分片规则分别获取分库规则、分表规则
2、路由数据库
3、路由表
最后,我们 DEBUG 下 分片结果:
7. 总结
这篇文章,我们讲解了标准分片路由的流程。
1、内核处理器 KernelProcessor
内核处理器在生成「 执行上下文」时,会执行三个操作,分别是: 路由、重写、创建执行上下文。
2、路由执行器 PartialSQLRouteExecutor
路由引擎的路由方法内部,第一步是创建「 路由执行器 SQLRouteExecutor」,一般来讲增删改查的操作都会构造 PartialSQLRouteExecutor 执行器 。
3、分片 SQL 路由 ShardingSQLRouter
- 组装分片条件
- 选择并构建「分片路由引擎」
- 分片路由引擎调用路由方法
4、组装分片条件 shardingConditions
对于 Insert 语句来讲,组装分片条件原理比较简单:
- 根据分片规则分别获取分库规则、分表规则
- 判断每个条目对应的字段是否是分片字段
- 根据字段参数索引获取字段值
5、选择并构建「分片路由引擎」
分片路由引擎工厂 ShardingRouteEngineFactory 会根据相关条件,选择创建「标准路由」和「复合路由」。
6、「分片路由引擎」调用路由方法
- 根据分片规则分别获取分库规则、分表规则
- 根据分库规则,路由数据库
- 根据分表规则,路由表