sharding-core-route
- 模块结构
sharding-core-route的主要功能是将解析生成的SQLStatement对象,进行预处理和路由生成SQLRouteResult对象。这里只讲解路由部分,预处理部分单独一片文章讲解。按功能分类可以分成四个部分:
- org.apache.shardingsphere.core.route.hook。hook相关的类,用于跟踪和分析。
- org.apache.shardingsphere.core.route.router。包含分片路由和主备路由两个逻辑的实现,分别位于ShardingRouter和ShardingMasterSlaveRouter,生成SQLRouteResult对象
- org.apache.shardingsphere.core.route.type。主要包含RoutingEngine的接口和具体类的实现,实现了route()方法,完成了在具体SQLstatementContext、ShardingRule、ShardingCondition中完成分片操作,生成RoutingResult。支持ShardingRouter和ShardingMasterSlaveRouter的方法实现。
- org.apache.shardingsphere.core.route。主要的类为:StatementRoutingEngine和PreparedStatementRoutingEngine。这两个类是核心,路由逻辑的入口在它的route()方法中。前者提供 public SQLRouteResult route(final String logicSQL),后者提供public SQLRouteResult route(final List
- 模块结构图
- 主要逻辑流程和关键类分析
sharding-core-route的主要逻辑是从StatementRoutingEngine.route(final String logicSQL)开始的,主逻辑流程图如下。其中,虚线箭头表示从属关系,实线表示执行顺序。
上图中的logicSQL的位置和语句对应有偏差,下方图使用EXCEL更准确描述。 - 设计模式和设计原则
简单工厂模式+依赖倒转原则
RoutingEngine抽象出来route()方法,具体的实现类来实现具体的方法,每个实现类实现自己的路由算法。产生的实现类依据RoutingEngineFactory.newInstance(final ShardingRule shardingRule, final ShardingSphereMetaData metaData, final SQLStatementContext sqlStatementContext, final ShardingConditions shardingConditions)方法中的传入参数。具体代码位于ShardingRouter.route(final String logicSQL, final List1
2RoutingEngine routingEngine = RoutingEngineFactory.newInstance(shardingRule, metaData, sqlStatementContext, shardingConditions);
RoutingResult routingResult = routingEngine.route();简单工厂模式
简单工厂模式在模块中若干处有出现,例如:org.apache.shardingsphere.core.route.router.sharding.validator包内和org.apache.shardingsphere.core.route.router.sharding.condition.generator包内。依赖倒转
依赖倒转强调面向接口编程而不是面向实现编程,这样使得模块之间耦合度降低,方便以后扩展。org.apache.shardingsphere.core.route.type包内的RoutingEngine接口和若干实现类。方便以后新增路由引擎和修改路由引擎。