sharding-core-rewrite

  • 模块结构
    sharding-core-rewrite的主要功能是将路由生成的RoutingUnit对象,进行改写生成SQLUnit。按功能分类可以分成六个部分:
  1. org.apache.shardingsphere.core.rewrite.SQLRewriteEngine。SQLRewriteEngine类是整个改写功能的入口,通过构造方法和generateSQL()方法,对外提供改写功能,生成SQLUnit。SQLUnit包含两个属性:sql和parameters,作为改写后的结果返回。这两个属性分别依赖org.apache.shardingsphere.core.rewrite.sql和org.apache.shardingsphere.core.rewrite.parameter包。
  2. org.apache.shardingsphere.core.rewrite.sql。主要类是SQLBuilder,它对外提供构建改写SQL的功能。这个模块内部的SQLToken是改写时重要的依赖。
  3. org.apache.shardingsphere.core.rewrite.parameter。包含ParameterBuilder和ParameterRewriter,分别抽象了参数列表构建和参数改写。其中org.apache.shardingsphere.core.rewrite.parameter.rewriter子包的功能较重要的类是:EncryptParameterBuilderFactory和ShardingParameterBuilderFactory。它俩通过build方法来完成对parameterBuilder的相关参数的设置,例如:在StandardParameterBuilder中设置addedIndexAndParameters和replacedIndexAndParameters。
  4. org.apache.shardingsphere.core.rewrite.SQLRewriteDecorator。接口类。定义了decorate()方法,为sqlRewriteEngine的parameterBuilder设置相关的parameter参数。它的实现类为ShardingRewriterDecorator和EncryptRewriterDecorator。
  5. org.apache.shardingsphere.core.rewrite.sharding。ShardingRewriterDecorator为主要功能类。ShardingParameterBuilderFactory.build()方法,为sqlRewriteEngine的parameterBuilder设置相关的parameter参数
  6. org.apache.shardingsphere.core.rewrite.encrypt。EncryptRewriterDecorator为主要功能类。EncryptParameterBuilderFactory.build()方法,为sqlRewriteEngine的parameterBuilder设置相关的parameter参数。
  • 模块结构图
  • 主要逻辑流程和关键类分析
    sharding-core-rewrite的主要逻辑是从SQLRewriteEngine.generateSQLgenerateSQL(final RoutingUnit routingUnit, final Map<String, String> logicAndActualTables)开始的,主逻辑流程图如下。其中,虚线箭头表示从属关系,实线表示执行顺序。
  • 设计模式和设计原则
  1. 接口分离原则和里式替换原则
    org.apache.shardingsphere.core.rewrite.sql.token.pojo。这个包对面向对象编程有比较好的实践。首先,定义了SQLToken抽象类,所有实现类都继承它,它将实体类的公共的部分抽象封装了起来。其次,定义了三个接口
    Alterable、Attachable、Substitutable三个接口,这三个接口从使用角度按照改写、附加、直接替换三个方面进行了划分,实现类根据自身特点来实现其中的接口。最后,调用者在调用时使用抽象类的引用,达到了统一处理的目的,同时可以根据实现类所属的接口进行差异化操作,这点在如下代码中有体现:
    SQLBuilder的代码如下:

    1
    2
    3
    private String getSQLTokenLiterals(final SQLToken sqlToken, final RoutingUnit routingUnit, final Map<String, String> logicAndActualTables) {
    return sqlToken instanceof Alterable ? ((Alterable) sqlToken).toString(routingUnit, logicAndActualTables) : sqlToken.toString();
    }

    对父类的继承,使得调用者代码可以使用统一的类来引用不同的子类对象。
    接口的实现,使得调用者代码可以对不同接口的实现类对象,进行差异化处理。
    org.apache.shardingsphere.core.rewrite.sql.token.generator包对接口合理的使用,也达到类似的效果。同样也是优秀的面向对象编程实践。

  2. 依赖倒转原则
    org.apache.shardingsphere.core.rewrite.parameter.builder和org.apache.shardingsphere.core.rewrite.parameter.rewriter体现了依赖倒转原则,ParameterBuilder和ParameterRewriter都是接口类,是对内部多个实现类的良好抽象,调用者只需要声明接口引用,就可以使用多种实现类。