sharding-core-route

  • 模块结构
    sharding-core-route的主要功能是将解析生成的SQLStatement对象,进行预处理和路由生成SQLRouteResult对象。这里只讲解路由部分,预处理部分单独一片文章讲解。按功能分类可以分成四个部分:
  1. org.apache.shardingsphere.core.route.hook。hook相关的类,用于跟踪和分析。
  2. org.apache.shardingsphere.core.route.router。包含分片路由和主备路由两个逻辑的实现,分别位于ShardingRouter和ShardingMasterSlaveRouter,生成SQLRouteResult对象
  3. org.apache.shardingsphere.core.route.type。主要包含RoutingEngine的接口和具体类的实现,实现了route()方法,完成了在具体SQLstatementContext、ShardingRule、ShardingCondition中完成分片操作,生成RoutingResult。支持ShardingRouter和ShardingMasterSlaveRouter的方法实现。
  4. org.apache.shardingsphere.core.route。主要的类为:StatementRoutingEngine和PreparedStatementRoutingEngine。这两个类是核心,路由逻辑的入口在它的route()方法中。前者提供 public SQLRouteResult route(final String logicSQL),后者提供public SQLRouteResult route(final List parameters)。
  • 模块结构图
  • 主要逻辑流程和关键类分析
    sharding-core-route的主要逻辑是从StatementRoutingEngine.route(final String logicSQL)开始的,主逻辑流程图如下。其中,虚线箭头表示从属关系,实线表示执行顺序。

    上图中的logicSQL的位置和语句对应有偏差,下方图使用EXCEL更准确描述。
  • 设计模式和设计原则
  1. 简单工厂模式+依赖倒转原则
    RoutingEngine抽象出来route()方法,具体的实现类来实现具体的方法,每个实现类实现自己的路由算法。产生的实现类依据RoutingEngineFactory.newInstance(final ShardingRule shardingRule, final ShardingSphereMetaData metaData, final SQLStatementContext sqlStatementContext, final ShardingConditions shardingConditions)方法中的传入参数。具体代码位于ShardingRouter.route(final String logicSQL, final List parameters, final SQLStatement sqlStatement)方法中。

    1
    2
    RoutingEngine routingEngine = RoutingEngineFactory.newInstance(shardingRule, metaData, sqlStatementContext, shardingConditions);
    RoutingResult routingResult = routingEngine.route();
  2. 简单工厂模式
    简单工厂模式在模块中若干处有出现,例如:org.apache.shardingsphere.core.route.router.sharding.validator包内和org.apache.shardingsphere.core.route.router.sharding.condition.generator包内。

  3. 依赖倒转
    依赖倒转强调面向接口编程而不是面向实现编程,这样使得模块之间耦合度降低,方便以后扩展。org.apache.shardingsphere.core.route.type包内的RoutingEngine接口和若干实现类。方便以后新增路由引擎和修改路由引擎。