dubbo获取服务提供者IP列表

文章系列

一、dubbo源码解析之框架粗谈
二、dubbo源码解析之dubbo配置解析
三、dubbo源码解析之服务发布与注册
四、dubbo源码解析之服务发现
五、dubbo源码解析之服务调用(通信)流程
六、dubbo获取服务提供者IP列表

在 dubbo 源码分析中可知,所有服务地址都是通过 org.apache.dubbo.rpc.cluster.Directory 获取的,如下:

public interface Directory<T> extends Node {
    Class<T> getInterface();

    List<Invoker<T>> list(Invocation invocation) throws RpcException;

	// 获取所有 Invoker
    List<Invoker<T>> getAllInvokers();

    URL getConsumerUrl();

    boolean isDestroyed();

    void discordAddresses();
}

而在 org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster 类的 Interceptors(AbstractClusterInvoker<T> clusterInvoker, String key) 方法中,构建集群拦截器时,存在一个扩展点,如下:

public abstract class AbstractCluster implements Cluster {

    private <T> Invoker<T> buildClusterInterceptors(AbstractClusterInvoker<T> clusterInvoker, String key) {
        AbstractClusterInvoker<T> last = clusterInvoker;
        List<ClusterInterceptor> interceptors = ExtensionLoader.getExtensionLoader(ClusterInterceptor.class).getActivateExtension(clusterInvoker.getUrl(), key);

        if (!interceptors.isEmpty()) {
            for (int i = interceptors.size() - 1; i >= 0; i--) {
                final ClusterInterceptor interceptor = interceptors.get(i);
                final AbstractClusterInvoker<T> next = last;
                last = new InterceptorInvokerNode<>(clusterInvoker, interceptor, next);
            }
        }
        return last;
    }

    @Override
    public <T> Invoker<T> join(Directory<T> directory) throws RpcException {
        return buildClusterInterceptors(doJoin(directory), directory.getUrl().getParameter(REFERENCE_INTERCEPTOR_KEY));
    }
}
List<ClusterInterceptor> interceptors = ExtensionLoader.getExtensionLoader(ClusterInterceptor.class).getActivateExtension(clusterInvoker.getUrl(), key);

ClusterInterceptor 为集群处理拦截器 SPI 扩展点,在进行创建 InterceptorInvokerNode(拦截器调用节点)时,传入了一个 clusterInvoker,我们可通过 clusterInvoker 获取 Directory 对象,进而获取所有服务提供者IP列表,如下:

@Activate // 添加激活扩展点注解
public class TestClusterInterceptor implements ClusterInterceptor{

    @Override
    public void before(AbstractClusterInvoker<?> clusterInvoker, Invocation invocation) {
        List<? extends Invoker<?>> allInvokers = clusterInvoker.getDirectory().getAllInvokers();
        if (CollectionUtils.isEmpty(allInvokers)) {
            return;
        }
        List<String> addressList = new ArrayList<>(allInvokers.size());

        for (Invoker<?> allInvoker : allInvokers) {
        	// 通过url获取 address
            String address = allInvoker.getUrl().getAddress();
            addressList.add(address);
        }
        System.out.println(addressList);
    }

    @Override
    public void after(AbstractClusterInvoker<?> clusterInvoker, Invocation invocation) {

    }
}

SPI扩展文件
在这里插入图片描述

打印结果

[127.0.0.1:20881, 127.0.0.1:20880]

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值