81,092
社区成员
发帖
与我相关
我的任务
分享
import java.util.ArrayList;
import java.util.List;
import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.URL;
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.Router;
/**
* 同ip访问同一个服务
*
*/
public class GrayscaleRouter implements Router, Comparable<Router> {
private URL url;
private final int priority;
public GrayscaleRouter(URL url) {
this.url = url;
this.priority = url.getParameter(Constants.PRIORITY_KEY, 0);
}
@Override
public int compareTo(Router o) {
if (o == null || o.getClass() != GrayscaleRouter.class) {
return 1;
}
GrayscaleRouter c = (GrayscaleRouter)o;
return this.priority == c.priority ? url.toFullString().compareTo(c.url.toFullString())
: (this.priority > c.priority ? 1 : -1);
}
@Override
public URL getUrl() {
return url;
}
@Override
public <T> List<Invoker<T>> route(List<Invoker<T>> invokers, URL tempUrl, Invocation invocation)
throws RpcException {
String ip = RpcContext.getContext().getAttachment("client_ip");
if (ip == null) {
ip = System.getProperty("dubbo.protocol.host");
}
if (ip == null) {
return excludeLocalService(invokers);
} else {
RpcContext.getContext().setAttachment("client_ip", ip);
}
List<Invoker<T>> result = new ArrayList<Invoker<T>>();
for (Invoker<T> invoker : invokers) {
if (ip.equals(invoker.getUrl().getIp())) {
result.add(invoker);
}
}
if (result.isEmpty()) {
return excludeLocalService(invokers);
}
return result;
}
/**
* 排除本地服务
*
* @param invokers
* @return
*/
private <T> List<Invoker<T>> excludeLocalService(List<Invoker<T>> invokers) {
List<Invoker<T>> result = new ArrayList<Invoker<T>>();
invokers.forEach(invoker -> {
String serviceIp = invoker.getUrl().getIp();
if (!serviceIp.startsWith("10.")) {
result.add(invoker);
}
});
return result;
}
@Override
public boolean equals(Object object) {
return super.equals(object);
}
@Override
public int hashCode(){
return super.hashCode();
}
}