[zebra源碼]JdbcFilter過濾器和SPI擴(kuò)展

一、 JdbcFilter 過濾器

zebra 定義了 JdbcFilter 過濾器, 它包含的方法覆蓋了 zebra 執(zhí)行生命周期的各個環(huán)節(jié)(如各層數(shù)據(jù)源的初始化/刷新、分組連接的獲取/關(guān)閉、sql的執(zhí)行 等); 那么就方便在各個環(huán)節(jié)進(jìn)行監(jiān)控上報等操作了

public interface JdbcFilter {
    int DEFAULT_ORDER = 0;

    int MAX_ORDER = Integer.MAX_VALUE;

    int MIN_ORDER = Integer.MIN_VALUE;

    /**
     * filter ordering <br>
     * filter_with_order_3_start filter_with_order_2_start
     * filter_with_order_1_start targer_start filter_with_order_1_finish
     * filter_with_order_2_finish filter_with_order_3_finish
     *
     * @return the order of execute
     */
    int getOrder();

    /**
     * init filter
     */
    void init();

    /** GroupDataSource Filter **/
    void initGroupDataSource(GroupDataSource source, JdbcFilter chain);

    void refreshGroupDataSource(GroupDataSource source, String propertiesName, JdbcFilter chain);

    GroupConnection getGroupConnection(GroupDataSource source, JdbcFilter chain) throws SQLException;

    FailOverDataSource.FindMasterDataSourceResult findMasterFailOverDataSource(
            FailOverDataSource.MasterDataSourceMonitor source, JdbcFilter chain);

    void closeGroupConnection(GroupConnection source, JdbcFilter chain) throws SQLException;

    void closeGroupDataSource(GroupDataSource source, JdbcFilter chain) throws SQLException;

    void switchFailOverDataSource(FailOverDataSource source, JdbcFilter chain);

    /** SingleDataSource Filter **/
    DataSource initSingleDataSource(SingleDataSource source, JdbcFilter chain);

    SingleConnection getSingleConnection(SingleDataSource source, JdbcFilter chain) throws SQLException;

    String processSQL(DataSourceConfig dsConfig, SQLProcessContext ctx, JdbcFilter chain) throws SQLException;

    <T> T executeSingleStatement(SingleStatement source, SingleConnection conn, String sql, List<String> batchedSql,
            boolean isBatched, boolean autoCommit, Object params, JdbcFilter chain) throws SQLException;

    void closeSingleConnection(SingleConnection source, JdbcFilter chain) throws SQLException;

    void closeSingleDataSource(SingleDataSource source, JdbcFilter chain) throws SQLException;

    void closeSingleResultSet(SingleResultSet source, JdbcFilter chain) throws SQLException;

    /** ShardDataSource Filter **/
    void initShardDataSource(ShardDataSource source, JdbcFilter chain);

    ResultSet executeShardQuery(ShardStatement source, String sql, JdbcFilter chain) throws SQLException;

    int executeShardUpdate(ShardStatement source, String sql, int autoGeneratedKeys, int[] columnIndexes,
            String[] columnNames, JdbcFilter chain) throws SQLException;

    void shardRouting(RouterResult rr, JdbcFilter chain) throws SQLException;

    void shardMerge(ShardResultSet rs, JdbcFilter chain) throws SQLException;

    void configChanged(PropertyChangeEvent evt, JdbcFilter chain);
}

都是些 void 的無害方法,在zebra數(shù)據(jù)源、配置及sql代理執(zhí)行過程的各個點,會執(zhí)行 JdbcFilter 的對應(yīng)方法;如在GroupDataSource 初始化的時候,會調(diào)用 JdbcFilter#initGroupDataSource 方法

JdbcFilter chain = new DefaultJdbcFilterChain(filters) {
      @Override
      public void initGroupDataSource(GroupDataSource source, JdbcFilter chain) {
          if (index < filters.size()) {
              filters.get(index++).initGroupDataSource(source, chain);
          } else {
              // 開始初始化
              source.initInternal();
          }
      }
  };

zebra 里邊的 JdbcFilter 由 DefaultFilterManager 類負(fù)責(zé)管理,只要是實現(xiàn)了 JdbcFilter 接口的類就會被它通過類加載的方式加載到, 多個filter的執(zhí)行是加入到責(zé)任鏈 DefaultJdbcFilterChain 里執(zhí)行的

自帶的 JdbcFilter有

  • CatFilter上報監(jiān)控信息到cat
  • WallFilter 流控

如何擴(kuò)展 Filter?

  1. 實現(xiàn)Filter接口 一般繼承DefaultJdbcFilter 即可,Zebra默認(rèn)提供wallFilter和CatFilter,開發(fā)者可以進(jìn)行參考

    public class WallFilter extends DefaultJdbcFilter

  2. 注冊 Filter

Filter的類加載文件放置在 META-INF/zebra-filter.properties 目錄下,格式為

  • 文件名:zebra.filter.${filterName}=類路徑
  • 內(nèi)容: zebra.filter.wall=com.dianping.zebra.filter.wall.WallFilter

二、SPI擴(kuò)展

ZebraSpi擴(kuò)展說明

zebra 的 SPI 注解

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Spi {
    String name() default "";

    Scope scope() default Scope.SINGLETON;
}

它針對的是 配置獲取方式 ConfigService

自定義的 ConfigService Spi 類加載文件可以放置在 META-INF/services/com.dianping.zebra.config.ConfigService 文件中 進(jìn)行注冊,如

com.dianping.zebra.config.ZookeeperConfigService

com.dianping.zebra.config.PropertyConfigService

如 zk 配置的定義:

@Spi(name = "zookeeper", scope = Scope.SINGLETON)
public class ZookeeperConfigService implements ConfigService

他們會被 ExtensionLoader 加載并創(chuàng)建對象,用于配置拉取

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容