一、 JdbcFilter 過濾器
zebra 定義了 JdbcFilter 過濾器, 它包含的方法覆蓋了 zebra 執行生命周期的各個環節(如各層數據源的初始化/刷新、分組連接的獲取/關閉、sql的執行 等); 那么就方便在各個環節進行監控上報等操作了
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數據源、配置及sql代理執行過程的各個點,會執行 JdbcFilter 的對應方法;如在GroupDataSource 初始化的時候,會調用 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 類負責管理,只要是實現了 JdbcFilter 接口的類就會被它通過類加載的方式加載到, 多個filter的執行是加入到責任鏈 DefaultJdbcFilterChain 里執行的
自帶的 JdbcFilter有
- CatFilter上報監控信息到cat
- WallFilter 流控
如何擴展 Filter?
-
實現Filter接口 一般繼承
DefaultJdbcFilter
即可,Zebra默認提供wallFilter和CatFilter,開發者可以進行參考public class WallFilter extends DefaultJdbcFilter
注冊 Filter
Filter的類加載文件放置在 META-INF/zebra-filter.properties
目錄下,格式為
- 文件名:zebra.filter.${filterName}=類路徑
- 內容: zebra.filter.wall=com.dianping.zebra.filter.wall.WallFilter
二、SPI擴展
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
文件中 進行注冊,如
com.dianping.zebra.config.ZookeeperConfigService
com.dianping.zebra.config.PropertyConfigService
如 zk 配置的定義:
@Spi(name = "zookeeper", scope = Scope.SINGLETON)
public class ZookeeperConfigService implements ConfigService
他們會被 ExtensionLoader 加載并創建對象,用于配置拉取