dubbo源码之拦截调用
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源码之拦截调用相关推荐
- apache dubbo 源码分析系列汇总
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.后面捐献给了知名的开源社区 ...
- dubbo(5) Dubbo源码解析之服务调用过程
来源:https://juejin.im/post/5ca4a1286fb9a05e731fc042 Dubbo源码解析之服务调用过程 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与 ...
- 【Dubbo源码阅读系列】之远程服务调用(上)
今天打算来讲一讲 Dubbo 服务远程调用.笔者在开始看 Dubbo 远程服务相关源码的时候,看的有点迷糊.后来慢慢明白 Dubbo 远程服务的调用的本质就是动态代理模式的一种实现.本地消费者无须知道 ...
- 【dubbo源码解析】--- dubbo中Invoker嵌套调用底层原理
本文对应源码地址:https://github.com/nieandsun/dubbo-study 文章目录 1 dubbo中Invoker的重要性 2 dubbo RPC链条中代理对象的底层逻辑 2 ...
- Dubbo源码解析(九)Dubbo系列 源码总结+最近感悟
从0开始看dubbo源码过程中,对于整个源码阅读与之前阅读部分的Spring源码不太一样,首先之前没有看过源码,因为Spring的一个流程比较复杂,所以一直在跳转跳转,大流程比较多,生命周期较长.自己 ...
- 全网最简单的dubbo源码调试,建议点赞收藏!!!
dubbo这两年非常的火,那光知道怎么用不行,我这章就告诉你们最简单搭建dubbo源码的方法,记得收藏!! 1.准备环境 IDEA你随便 Maven 3.5.6及以上版本 Dubbo源码版本2.7.3 ...
- Spring AOP 源码分析 - 拦截器链的执行过程
1.简介 本篇文章是 AOP 源码分析系列文章的最后一篇文章,在前面的两篇文章中,我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程.现在我们的得 ...
- Dubbo 源码分析 - 集群容错之 LoadBalance
1.简介 LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载"均摊"到不同的机器上.避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况.通 ...
- Dubbo 源码分析 - 集群容错之 Cluster
1.简介 为了避免单点故障,现在的应用至少会部署在两台服务器上.对于一些负载比较高的服务,会部署更多台服务器.这样,同一环境下的服务提供者数量会大于1.对于服务消费者来说,同一环境下出现了多个服务提供 ...
最新文章
- 谷歌浏览器翻译插件 saladict:沙拉查词
- OpenResty快速入门
- .NET6正式版将近,70%开发者或面临技术断层!
- void 型指针的高阶用法,你掌握了吗?
- Bootstrap导航中禁用导航链接
- 怎样用git获取指定的android linux kernel
- Silverlight.XNA(C#)跨平台3D游戏研发手记:(七)向Windows Phone移植之双向交互
- [PHP]图片上传代码【原创】
- c语言入门 输出图形(1),C语言图形输出习题(1).pdf
- Nacos 集群 一致性协议实现之`Distro`协议浅析
- dw怎么在框架中加入网页_DW中制作框架网页.ppt
- MySQL 高可用MMM
- 【Javaweb 1】带你搞懂request,respond,servlet
- 设计模式之9 - 装饰模式Decorator
- 拼多多关键词推广技巧有哪
- web安全:XSS测试平台使用教程
- Car-eye 车辆管理系统API设计
- 有没有那么一瞬间,你也曾有过“失业焦虑”?
- python+requests+pytest 接口自动化框架(八)
- Altium Designer 鼠标移动到元件高亮显示连接网络
热门文章
- 如何有效管理和快速盘点固定资产?
- Unity制作随机数字抽奖小案例
- Linux中netstat -anp命令
- zbt (Steam游戏道具)自动发货
- 微型计算机功耗,关机功耗不到1W EuP主板设计简析
- 把虚拟机迁移到云服务器,VMware业务系统迁移上云方案
- fastdfs上传文件资料(PDF,视频,图片,FileCaseUtil,FileUploadUtil)并生成缩略图
- LayUI可选择可输入下拉框
- 通过VBA导出word文档中的图片
- Spring Boot AOP面向切面编程使用(定义切入点、前置通知、后置通知、返回通知、异常通知、环绕通知)