为啥会有这需求呢?是因为有一个功能,在管理页面添加修改的时候需要调用多节点部署的某服务的一个rpc接口。
那怎么做到这种蛋疼操作呢?
第一步:
实现com.alibaba.dubbo.rpc.cluster.LoadBalance
操作一波传入的invokers(这就是所有的服务列表)
我这里是从第二个节点开始调用一次,然后结尾返回第一个元素(返回的这个元素也会被调用)
import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.RpcException;
import com.alibaba.dubbo.rpc.cluster.LoadBalance;
import java.util.List;
/**
* 所有节点都调用一次的负载均衡策略
*
* @author 周广
**/
public class AllExecLoadBalance implements LoadBalance {
@Override
public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException {
if (invokers.size() > 1) {
for (int i = 1; i < invokers.size(); i++) {
invokers.get(i).invoke(invocation);
}
}
return invokers.get(0);
}
}
第二步:
在resources下添加文件夹META-INF,然后再添加文件夹dubbo然后添加文件:com.alibaba.dubbo.rpc.cluster.LoadBalance
添加内容:allExecLoadBalance=com.xxx.xxx.AllExecLoadBalance
等号前面是key一般是用驼峰类名(一会用得上) 等号后面 我们自定义的复杂均衡类的全路径
第三步:
在需要使用这神奇操作的类上面加上一个属性
就这样就搞定咯~ 可以开2个节点尝试一下~
如果只有一个节点 是不会触发负载均衡策略的,在外层dubbo代码就直接选择返回了。 debug就进不去AllExecLoadBalance