dubbo在生成调用者和被调用者的动态代理的时候会生成调用链,在拦截调用链走完后才会进入真正的方法调用,拦截调用分别在消费者端和调用者端都生成了调用链,代码如下:

消费者端行成调用链:

    public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {return protocol.refer(type, url);}return buildInvokerChain(protocol.refer(type, url), Constants.REFERENCE_FILTER_KEY, Constants.CONSUMER);}

提供者端形成调用链:

    public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) {return protocol.export(invoker);}return protocol.export(buildInvokerChain(invoker, Constants.SERVICE_FILTER_KEY, Constants.PROVIDER));}

消费者端和提供者端形成调用链都调用了同一段代码:buildInvokerChain()

    private static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) {Invoker<T> last = invoker;List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);if (filters.size() > 0) {for (int i = filters.size() - 1; i >= 0; i --) {final Filter filter = filters.get(i);final Invoker<T> next = last;last = new Invoker<T>() {public Class<T> getInterface() {return invoker.getInterface();}public URL getUrl() {return invoker.getUrl();}public boolean isAvailable() {return invoker.isAvailable();}public Result invoke(Invocation invocation) throws RpcException {return filter.invoke(next, invocation);}public void destroy() {invoker.destroy();}@Overridepublic String toString() {return invoker.toString();}};}}return last;}

这就是调用链形成的源码,通过last->next的方式统一添加,然后再新生成的Invoker中调用next然后最后调用last就是我们真正执行的Invoker,调用链分类(默认Filter)如下:

dubbo源码之拦截调用相关推荐

  1. apache dubbo 源码分析系列汇总

    Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.后面捐献给了知名的开源社区 ...

  2. dubbo(5) Dubbo源码解析之服务调用过程

    来源:https://juejin.im/post/5ca4a1286fb9a05e731fc042 Dubbo源码解析之服务调用过程 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与 ...

  3. 【Dubbo源码阅读系列】之远程服务调用(上)

    今天打算来讲一讲 Dubbo 服务远程调用.笔者在开始看 Dubbo 远程服务相关源码的时候,看的有点迷糊.后来慢慢明白 Dubbo 远程服务的调用的本质就是动态代理模式的一种实现.本地消费者无须知道 ...

  4. 【dubbo源码解析】--- dubbo中Invoker嵌套调用底层原理

    本文对应源码地址:https://github.com/nieandsun/dubbo-study 文章目录 1 dubbo中Invoker的重要性 2 dubbo RPC链条中代理对象的底层逻辑 2 ...

  5. Dubbo源码解析(九)Dubbo系列 源码总结+最近感悟

    从0开始看dubbo源码过程中,对于整个源码阅读与之前阅读部分的Spring源码不太一样,首先之前没有看过源码,因为Spring的一个流程比较复杂,所以一直在跳转跳转,大流程比较多,生命周期较长.自己 ...

  6. 全网最简单的dubbo源码调试,建议点赞收藏!!!

    dubbo这两年非常的火,那光知道怎么用不行,我这章就告诉你们最简单搭建dubbo源码的方法,记得收藏!! 1.准备环境 IDEA你随便 Maven 3.5.6及以上版本 Dubbo源码版本2.7.3 ...

  7. Spring AOP 源码分析 - 拦截器链的执行过程

    1.简介 本篇文章是 AOP 源码分析系列文章的最后一篇文章,在前面的两篇文章中,我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程.现在我们的得 ...

  8. Dubbo 源码分析 - 集群容错之 LoadBalance

    1.简介 LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载"均摊"到不同的机器上.避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况.通 ...

  9. Dubbo 源码分析 - 集群容错之 Cluster

    1.简介 为了避免单点故障,现在的应用至少会部署在两台服务器上.对于一些负载比较高的服务,会部署更多台服务器.这样,同一环境下的服务提供者数量会大于1.对于服务消费者来说,同一环境下出现了多个服务提供 ...

最新文章

  1. 谷歌浏览器翻译插件 saladict:沙拉查词
  2. OpenResty快速入门
  3. .NET6正式版将近,70%开发者或面临技术断层!
  4. void 型指针的高阶用法,你掌握了吗?
  5. Bootstrap导航中禁用导航链接
  6. 怎样用git获取指定的android linux kernel
  7. Silverlight.XNA(C#)跨平台3D游戏研发手记:(七)向Windows Phone移植之双向交互
  8. [PHP]图片上传代码【原创】
  9. c语言入门 输出图形(1),C语言图形输出习题(1).pdf
  10. Nacos 集群 一致性协议实现之`Distro`协议浅析
  11. dw怎么在框架中加入网页_DW中制作框架网页.ppt
  12. MySQL 高可用MMM
  13. 【Javaweb 1】带你搞懂request,respond,servlet
  14. 设计模式之9 - 装饰模式Decorator
  15. 拼多多关键词推广技巧有哪
  16. web安全:XSS测试平台使用教程
  17. Car-eye 车辆管理系统API设计
  18. 有没有那么一瞬间,你也曾有过“失业焦虑”?
  19. python+requests+pytest 接口自动化框架(八)
  20. Altium Designer 鼠标移动到元件高亮显示连接网络

热门文章

  1. 如何有效管理和快速盘点固定资产?
  2. Unity制作随机数字抽奖小案例
  3. Linux中netstat -anp命令
  4. zbt (Steam游戏道具)自动发货
  5. 微型计算机功耗,关机功耗不到1W EuP主板设计简析
  6. 把虚拟机迁移到云服务器,VMware业务系统迁移上云方案
  7. fastdfs上传文件资料(PDF,视频,图片,FileCaseUtil,FileUploadUtil)并生成缩略图
  8. LayUI可选择可输入下拉框
  9. 通过VBA导出word文档中的图片
  10. Spring Boot AOP面向切面编程使用(定义切入点、前置通知、后置通知、返回通知、异常通知、环绕通知)