TagRouter feature is very good, but i think an LoadBalance Wrapper can get same
result ,and has smaller changes with source code:
```java
import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.alibaba.dubbo.common.utils.StringUtils;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.RpcContext;
import com.alibaba.dubbo.rpc.RpcException;
import com.alibaba.dubbo.rpc.cluster.LoadBalance;
import java.util.ArrayList;
import java.util.List;
public class LoadbalanceTagFilterWrapper implements LoadBalance {
private static final Logger logger =
LoggerFactory.getLogger(LoadbalanceTagFilterWrapper.class);
private LoadBalance loadBalance;
public LoadbalanceTagFilterWrapper(LoadBalance loadBalance) {
this.loadBalance = loadBalance;
}
@Override
public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation
invocation) throws RpcException {
List<Invoker<T>> filteredInvokers = filterInvokers(invokers);
return loadBalance.select(filteredInvokers, url, invocation);
}
private <T> List<Invoker<T>> filterInvokers(List<Invoker<T>> invokers) {
// filter
List<Invoker<T>> result = new ArrayList<>();
// all invokers that don't have "tag" parameter in url is a normal
invoker
List<Invoker<T>> normalResult = new ArrayList<>();
try {
// Dynamic param
String tag =
RpcContext.getContext().getAttachment(Constants.REQUEST_TAG_KEY);
for (Invoker<T> invoker : invokers) {
if
(StringUtils.isEmpty(invoker.getUrl().getParameter(Constants.TAG_KEY))) {
// all invokers that don't have "tag" parameter in url is a
normal invoker
normalResult.add(invoker);
} else {
String[] tags =
invoker.getUrl().getParameter(Constants.TAG_KEY).split(",");
for (String s : tags) {
if (s.equals(tag)) {
result.add(invoker);
break;
}
}
}
}
// If no invoker be selected, downgrade to normal invokers
if (result.isEmpty()) {
return normalResult;
}
return result;
} catch (Exception e) {
logger.error("Route by tag error,return all invokers.", e);
}
// Downgrade to all invokers
return invokers;
}
}
```
[ Full content available at:
https://github.com/apache/incubator-dubbo/pull/2228 ]
This message was relayed via gitbox.apache.org for [email protected]