共计 3193 个字符,预计需要花费 8 分钟才能阅读完成。
序
本文主要研究一下 nacos client 的 ConfigFilterChainManager
IConfigFilterChain
nacos-1.1.3/api/src/main/java/com/alibaba/nacos/api/config/filter/IConfigFilterChain.java
public interface IConfigFilterChain {
/**
* Filter aciton
*
* @param request request
* @param response response
* @throws NacosException NacosException
*/
void doFilter(IConfigRequest request, IConfigResponse response) throws NacosException;
}
- IConfigFilterChain 接口定义了 doFilter 方法
ConfigFilterChainManager
nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/filter/impl/ConfigFilterChainManager.java
public class ConfigFilterChainManager implements IConfigFilterChain {private List<IConfigFilter> filters = Lists.newArrayList();
public synchronized ConfigFilterChainManager addFilter(IConfigFilter filter) {
// 根据 order 大小顺序插入
int i = 0;
while (i < this.filters.size()) {IConfigFilter currentValue = this.filters.get(i);
if (currentValue.getFilterName().equals(filter.getFilterName())) {break;}
if (filter.getOrder() >= currentValue.getOrder() && i < this.filters.size()) {i++;} else {this.filters.add(i, filter);
break;
}
}
if (i == this.filters.size()) {this.filters.add(i, filter);
}
return this;
}
@Override
public void doFilter(IConfigRequest request, IConfigResponse response) throws NacosException {new VirtualFilterChain(this.filters).doFilter(request, response);
}
//......
}
- ConfigFilterChainManager 实现了 IConfigFilterChain 接口,其 doFilter 方法使用 filters 创建 VirtualFilterChain,然后执行其 doFilter 方法;它提供了 addFilter 方法,可以根据 filter 的 order 顺序添加到 filters 中
VirtualFilterChain
nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/filter/impl/ConfigFilterChainManager.java
public class ConfigFilterChainManager implements IConfigFilterChain {
//......
private static class VirtualFilterChain implements IConfigFilterChain {
private final List<? extends IConfigFilter> additionalFilters;
private int currentPosition = 0;
public VirtualFilterChain(List<? extends IConfigFilter> additionalFilters) {this.additionalFilters = additionalFilters;}
@Override
public void doFilter(final IConfigRequest request, final IConfigResponse response) throws NacosException {if (this.currentPosition != this.additionalFilters.size()) {
this.currentPosition++;
IConfigFilter nextFilter = this.additionalFilters.get(this.currentPosition - 1);
nextFilter.doFilter(request, response, this);
}
}
}
//......
}
- VirtualFilterChain 实现了 IConfigFilterChain 接口,它维护了一个 currentPosition 属性,其 doFilter 方法会在 currentPosition 不等于 additionalFilters.size() 时递增 currentPosition,然后取出 nextFilter 把自己作为参数去执行 doFilter
IConfigFilter
nacos-1.1.3/api/src/main/java/com/alibaba/nacos/api/config/filter/IConfigFilter.java
public interface IConfigFilter {
/**
* Init
*
* @param filterConfig Filter Config
*/
void init(IFilterConfig filterConfig);
/**
* do filter
*
* @param request request
* @param response response
* @param filterChain filter Chain
* @throws NacosException exception
*/
void doFilter(IConfigRequest request, IConfigResponse response, IConfigFilterChain filterChain)
throws NacosException;
/**
* deploy
*/
void deploy();
/**
* Get order
*
* @return order number
*/
int getOrder();
/**
* Get filterName
*
* @return filter name
*/
String getFilterName();}
- IConfigFilter 接口的 doFilter 方法的第三个参数为 IConfigFilterChain;其实现类执行完自己的处理之后,如果要继续,可以执行 filterChain.doFilter 来继续交给下面的 filter 处理
小结
ConfigFilterChainManager 实现了 IConfigFilterChain 接口,其 doFilter 方法使用 filters 创建 VirtualFilterChain,然后执行其 doFilter 方法;它提供了 addFilter 方法,可以根据 filter 的 order 顺序添加到 filters 中
doc
- ConfigFilterChainManager
正文完