in dubbo-xds/src/main/java/org/apache/dubbo/rpc/cluster/router/xds/XdsRouter.java [179:209]
private String computeMatchCluster(Invocation invocation, XdsRouteRule rule) {
// compute request match cluster
HttpRequestMatch requestMatch = rule.getMatch();
if (requestMatch.getPathMatcher() == null && CollectionUtils.isEmpty(requestMatch.getHeaderMatcherList())) {
return null;
}
PathMatcher pathMatcher = requestMatch.getPathMatcher();
if (pathMatcher != null) {
String path = "/" + invocation.getInvoker().getUrl().getPath() + "/" + RpcUtils.getMethodName(invocation);
if (!pathMatcher.isMatch(path)) {
return null;
}
}
List<HeaderMatcher> headerMatchers = requestMatch.getHeaderMatcherList();
for (HeaderMatcher headerMatcher : headerMatchers) {
String headerName = headerMatcher.getName();
// not support byte
if (headerName.endsWith(BINARY_HEADER_SUFFIX)) {
return null;
}
String headValue = invocation.getAttachment(headerName);
if (!headerMatcher.match(headValue)) {
return null;
}
}
HTTPRouteDestination route = rule.getRoute();
if (route.getCluster() != null) {
return route.getCluster();
}
return computeWeightCluster(route.getWeightedClusters());
}