反模式使用dubbo 同时调用一个服务的多个节点

2018-08-06  本文已影响523人  上重楼

为啥会有这需求呢?是因为有一个功能,在管理页面添加修改的时候需要调用多节点部署的某服务的一个rpc接口。


image.png

那怎么做到这种蛋疼操作呢?

第一步:

实现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


image.png

添加内容:allExecLoadBalance=com.xxx.xxx.AllExecLoadBalance
等号前面是key一般是用驼峰类名(一会用得上) 等号后面 我们自定义的复杂均衡类的全路径


image.png

第三步:

在需要使用这神奇操作的类上面加上一个属性


image.png

就这样就搞定咯~ 可以开2个节点尝试一下~
如果只有一个节点 是不会触发负载均衡策略的,在外层dubbo代码就直接选择返回了。 debug就进不去AllExecLoadBalance

上一篇下一篇

猜你喜欢

热点阅读