Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ISSUE #9308]For the orchestration of configuration filters, there are the following areas that can be optimized #9309 #9310

Open
wants to merge 8 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,27 @@ public class ConfigFilterChainManager implements IConfigFilterChain {

private final List<IConfigFilter> filters = new ArrayList<>();

private IConfigFilterChain filterChain;

public ConfigFilterChainManager(Properties properties) {
ServiceLoader<IConfigFilter> configFilters = ServiceLoader.load(IConfigFilter.class);
for (IConfigFilter configFilter : configFilters) {
configFilter.init(properties);
addFilter(configFilter);
}
buildConfigFilterChain();
}

/**
* Build ConfigFilterChain.
*/
public void buildConfigFilterChain() {
filterChain = new EmptyFilterChainNode();
for (int i = filters.size() - 1; i >= 0; i--) {
final IConfigFilter filter = filters.get(i);
final IConfigFilterChain next = filterChain;
filterChain = new FilterChainNode(filter, next);
}
}

/**
Expand Down Expand Up @@ -74,26 +89,31 @@ public synchronized ConfigFilterChainManager addFilter(IConfigFilter filter) {

@Override
public void doFilter(IConfigRequest request, IConfigResponse response) throws NacosException {
new VirtualFilterChain(this.filters).doFilter(request, response);
filterChain.doFilter(request, response);
}

private static class VirtualFilterChain implements IConfigFilterChain {
private static class FilterChainNode implements IConfigFilterChain {

private final List<? extends IConfigFilter> additionalFilters;
private final IConfigFilter filter;

private int currentPosition = 0;
private final IConfigFilterChain next;

public VirtualFilterChain(List<? extends IConfigFilter> additionalFilters) {
this.additionalFilters = additionalFilters;
public FilterChainNode(IConfigFilter filter, IConfigFilterChain next) {
this.filter = filter;
this.next = next;
}

@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);
}
public void doFilter(IConfigRequest request, IConfigResponse response) throws NacosException {
filter.doFilter(request, response, next);
}
}

private static class EmptyFilterChainNode implements IConfigFilterChain {

@Override
public void doFilter(IConfigRequest request, IConfigResponse response) throws NacosException {

}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@ public MyIConfigFilter(String name, int order) {
this.name = name;
this.order = order;
}

@Override
public void init(IFilterConfig filterConfig) {
}

@Override
public void init(Properties properties) {
}
Expand Down Expand Up @@ -100,6 +100,7 @@ public void testAddFilterOrder() throws NacosException {
configFilterChainManager.addFilter(filter2);
configFilterChainManager.addFilter(filter1);
configFilterChainManager.addFilter(filter3);
configFilterChainManager.buildConfigFilterChain();

ConfigRequest configRequest = new ConfigRequest();

Expand Down Expand Up @@ -127,6 +128,7 @@ public void testAddFilterNotRepeat() throws NacosException {
configFilterChainManager.addFilter(filter2);
configFilterChainManager.addFilter(filter1);
configFilterChainManager.addFilter(repeatFilter);
configFilterChainManager.buildConfigFilterChain();

ConfigRequest configRequest = new ConfigRequest();
configFilterChainManager.doFilter(configRequest, new ConfigResponse());
Expand All @@ -135,4 +137,28 @@ public void testAddFilterNotRepeat() throws NacosException {

Assert.assertEquals(2, configContext.getParameter("filterCount"));
}

@Test
public void testSpiFilterNodeChain() throws NacosException {
final ConfigFilterChainManager configFilterChainManager = new ConfigFilterChainManager(new Properties());

configFilterChainManager.doFilter(new ConfigRequest(), new ConfigResponse());
}

@Test
public void testAddFilterNodeChain() throws NacosException {
final ConfigFilterChainManager configFilterChainManager = new ConfigFilterChainManager(new Properties());

MyIConfigFilter filter1 = new MyIConfigFilter("filter1", 1);
MyIConfigFilter filter2 = new MyIConfigFilter("filter2", 2);
MyIConfigFilter filter3 = new MyIConfigFilter("filter3", 3);

configFilterChainManager.addFilter(filter2);
configFilterChainManager.addFilter(filter1);
configFilterChainManager.addFilter(filter3);
// When an external filter is added via the addFilter() method, the responsibility chain only needs to be rebuilt, which in fact is rare.
configFilterChainManager.buildConfigFilterChain();

configFilterChainManager.doFilter(new ConfigRequest(), new ConfigResponse());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public void testConfigFilterChain() {
ConfigFilterChainManager configFilterChainManager = new ConfigFilterChainManager(null);
configFilterChainManager.addFilter(new DemoFilter1());
configFilterChainManager.addFilter(new DemoFilter2());
configFilterChainManager.buildConfigFilterChain();

ConfigRequest configRequest = new ConfigRequest();
ConfigResponse configResponse = new ConfigResponse();
try {
Expand Down