资讯专栏INFORMATION COLUMN

dubbo源码解析(二十一)远程调用——Listener

simpleapples / 2768人阅读

摘要:源码分析一该类实现了,是服务引用监听器的包装类。取消暴露遍历监听集合监听取消暴露该方法是对每个取消服务暴露的监听。五暴露服务取消暴露服务该类是服务暴露监听器的适配类,没有做实际的操作。

远程调用——Listener
目标:介绍dubbo-rpc-api中的各种listener监听器的实现逻辑,内容略少,随便撇两眼,不是重点。
前言

本文介绍监听器的相关逻辑。在服务引用和服务发现中监听器处于的位置请看下面的图:

服务暴露:

服务引用:

这两个监听器所做的工作不是很多,来看看源码理解一下。

源码分析 (一)ListenerInvokerWrapper

该类实现了Invoker,是服务引用监听器的包装类。

1.属性
/**
 * invoker对象
 */
private final Invoker invoker;

/**
 * 监听器集合
 */
private final List listeners;

用到了装饰模式,其中很多实现方法直接调用了invoker的方法。

2.构造方法
public ListenerInvokerWrapper(Invoker invoker, List listeners) {
    // 如果invoker为空则抛出异常
    if (invoker == null) {
        throw new IllegalArgumentException("invoker == null");
    }
    this.invoker = invoker;
    this.listeners = listeners;
    if (listeners != null && !listeners.isEmpty()) {
        // 遍历监听器
        for (InvokerListener listener : listeners) {
            if (listener != null) {
                try {
                    // 调用在服务引用的时候进行监听
                    listener.referred(invoker);
                } catch (Throwable t) {
                    logger.error(t.getMessage(), t);
                }
            }
        }
    }
}

构造方法中直接调用了监听器的服务引用。

3.destroy
@Override
public void destroy() {
    try {
        // 销毁invoker
        invoker.destroy();
    } finally {
        // 销毁所有监听的实体域
        if (listeners != null && !listeners.isEmpty()) {
            for (InvokerListener listener : listeners) {
                if (listener != null) {
                    try {
                        listener.destroyed(invoker);
                    } catch (Throwable t) {
                        logger.error(t.getMessage(), t);
                    }
                }
            }
        }
    }
}

该方法是把服务引用的监听器销毁。

(二)InvokerListenerAdapter
public abstract class InvokerListenerAdapter implements InvokerListener {

    /**
     * 引用服务
     * @param invoker
     * @throws RpcException
     */
    @Override
    public void referred(Invoker invoker) throws RpcException {
    }

    /**
     * 销毁
     * @param invoker
     */
    @Override
    public void destroyed(Invoker invoker) {
    }

}

该类是服务引用监听器的适配类,没有做实际的操作。

(三)DeprecatedInvokerListener
@Activate(Constants.DEPRECATED_KEY)
public class DeprecatedInvokerListener extends InvokerListenerAdapter {

    private static final Logger LOGGER = LoggerFactory.getLogger(DeprecatedInvokerListener.class);

    @Override
    public void referred(Invoker invoker) throws RpcException {
        // 当该引用的服务被废弃时,打印错误日志
        if (invoker.getUrl().getParameter(Constants.DEPRECATED_KEY, false)) {
            LOGGER.error("The service " + invoker.getInterface().getName() + " is DEPRECATED! Declare from " + invoker.getUrl());
        }
    }

}

该类是当调用废弃的服务时候打印错误日志。

(四)ListenerExporterWrapper

该类是服务暴露监听器包装类。

1.属性
/**
 * 服务暴露者
 */
private final Exporter exporter;

/**
 * 服务暴露监听者集合
 */
private final List listeners;

用到了装饰模式,其中很多实现方法直接调用了exporter的方法。

2.构造方法
public ListenerExporterWrapper(Exporter exporter, List listeners) {
    if (exporter == null) {
        throw new IllegalArgumentException("exporter == null");
    }
    this.exporter = exporter;
    this.listeners = listeners;
    if (listeners != null && !listeners.isEmpty()) {
        RuntimeException exception = null;
        // 遍历服务暴露监听集合
        for (ExporterListener listener : listeners) {
            if (listener != null) {
                try {
                    // 暴露服务监听
                    listener.exported(this);
                } catch (RuntimeException t) {
                    logger.error(t.getMessage(), t);
                    exception = t;
                }
            }
        }
        if (exception != null) {
            throw exception;
        }
    }
}

该方法中对于每个服务暴露进行监听。

3.unexport
@Override
public void unexport() {
    try {
        // 取消暴露
        exporter.unexport();
    } finally {
        if (listeners != null && !listeners.isEmpty()) {
            RuntimeException exception = null;
            // 遍历监听集合
            for (ExporterListener listener : listeners) {
                if (listener != null) {
                    try {
                        // 监听取消暴露
                        listener.unexported(this);
                    } catch (RuntimeException t) {
                        logger.error(t.getMessage(), t);
                        exception = t;
                    }
                }
            }
            if (exception != null) {
                throw exception;
            }
        }
    }
}

该方法是对每个取消服务暴露的监听。

(五)ExporterListenerAdapter
public abstract class ExporterListenerAdapter implements ExporterListener {

    /**
     * 暴露服务
     * @param exporter
     * @throws RpcException
     */
    @Override
    public void exported(Exporter exporter) throws RpcException {
    }

    /**
     * 取消暴露服务
     * @param exporter
     * @throws RpcException
     */
    @Override
    public void unexported(Exporter exporter) throws RpcException {
    }

}

该类是服务暴露监听器的适配类,没有做实际的操作。

后记
该部分相关的源码解析地址:https://github.com/CrazyHZM/i...

该文章讲解了在服务引用和服务暴露中的各种listener监听器,其中内容很少。接下来我将开始对rpc模块的协议protocol进行讲解。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72891.html

相关文章

  • dubbo源码解析(四十八)异步化改造

    摘要:大揭秘异步化改造目标从源码的角度分析的新特性中对于异步化的改造原理。看源码解析四十六消费端发送请求过程讲到的十四的,在以前的逻辑会直接在方法中根据配置区分同步异步单向调用。改为关于可以参考源码解析十远程通信层的六。 2.7大揭秘——异步化改造 目标:从源码的角度分析2.7的新特性中对于异步化的改造原理。 前言 dubbo中提供了很多类型的协议,关于协议的系列可以查看下面的文章: du...

    lijinke666 评论0 收藏0
  • dubbo源码解析(四十六)消费端发送请求过程

    摘要:可以参考源码解析二十四远程调用协议的八。十六的该类也是用了适配器模式,该类主要的作用就是增加了心跳功能,可以参考源码解析十远程通信层的四。二十的可以参考源码解析十七远程通信的一。 2.7大揭秘——消费端发送请求过程 目标:从源码的角度分析一个服务方法调用经历怎么样的磨难以后到达服务端。 前言 前一篇文章讲到的是引用服务的过程,引用服务无非就是创建出一个代理。供消费者调用服务的相关方法。...

    fish 评论0 收藏0
  • dubbo源码解析(四十七)服务端处理请求过程

    摘要:而存在的意义就是保证请求或响应对象可在线程池中被解码,解码完成后,就会分发到的。 2.7大揭秘——服务端处理请求过程 目标:从源码的角度分析服务端接收到请求后的一系列操作,最终把客户端需要的值返回。 前言 上一篇讲到了消费端发送请求的过程,该篇就要将服务端处理请求的过程。也就是当服务端收到请求数据包后的一系列处理以及如何返回最终结果。我们也知道消费端在发送请求的时候已经做了编码,所以我...

    yzzz 评论0 收藏0
  • dubbo源码解析二十二)远程调用——Protocol

    摘要:七该类也实现了,也是装饰了接口,但是它是在服务引用和暴露过程中加上了监听器的功能。如果是注册中心,则暴露该创建一个暴露者监听器包装类对象该方法是在服务暴露上做了监听器功能的增强,也就是加上了监听器。 远程调用——Protocol 目标:介绍远程调用中协议的设计和实现,介绍dubbo-rpc-api中的各种protocol包的源码,是重点内容。 前言 在远程调用中协议是非常重要的一层,看...

    孙淑建 评论0 收藏0
  • dubbo源码解析(四十四)服务暴露过程

    摘要:服务暴露过程目标从源码的角度分析服务暴露过程。导出服务,包含暴露服务到本地,和暴露服务到远程两个过程。其中服务暴露的第八步已经没有了。将泛化调用版本号或者等信息加入获得服务暴露地址和端口号,利用内数据组装成。 dubbo服务暴露过程 目标:从源码的角度分析服务暴露过程。 前言 本来这一篇一个写异步化改造的内容,但是最近我一直在想,某一部分的优化改造该怎么去撰写才能更加的让读者理解。我觉...

    light 评论0 收藏0

发表评论

0条评论

simpleapples

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<