一文深入理解Dubbo核心模型Invoker

Dubbo源码解析(三)执行器 Invoker Invokerdubbo中,万物皆是Invoker,即便是Exporter也是由Invoker进化而成的 那么Invoker到底是什么鬼 在 Dubbo核心领域模型中: Protocol 是服务域,它是 Invoker 暴露和引用的主功能入口,它负责 Invoker 的生命周期管理。 Invoker 是实体域,它是 Dubbo核心模型,其它模型都向它靠扰,或转换... 阅读详情

本文转载自:一文深入理解Dubbo核心模型Invoker


一、Dubbo中Invoker介绍

为什么说Invoker是Dubbo核心模型呢?

Invoker是Dubbo中的实体域,也就是真实存在的。其他模型都向它靠拢或转换成它,它也就代表一个可执行体,可向它发起invoke调用。在服务提供方,Invoker用于调用服务提供类。在服务消费方,Invoker用于执行远程调用。

二、服务提供方的Invoker

在服务提供方中的Invoker是由ProxyFactory创建而来的,Dubbo默认的ProxyFactory实现类为JavassistProxyFactory。

创建Invoker的入口方法getInvoker:

public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {
    // 为目标类创建 Wrapper
    final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf(36) < 0 ? proxy.getClass() : type);
    // 创建匿名 Invoker 类对象,并实现 doInvoke 方法。
    return new AbstractProxyInvoker<T>(proxy, type, url) {
        @Override
        protected Object doInvoke(T proxy, String methodName,
                                  Class<?>[] parameterTypes,
                                  Object[] arguments) throws Throwable {
            // 调用 Wrapper 的 invokeMethod 方法,invokeMethod 最终会调用目标方法
            return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);
        }
    };
}

JavassistProxyFactory创建了一个继承自AbstractProxyInvoker类的匿名对象,并覆写了抽象方法doInvoke。覆写后的doInvoke 逻辑比较简单,仅是将调用请求转发给了Wrapper类的invokeMethod 方法。以及生成 invokeMethod 方法代码和其他一些方法代码。代码生成完毕后,通过 Javassist 生成 Class 对象,最后再通过反射创建 Wrapper 实例。

注:Wapper是一个包装类。主要用于“包裹”目标类,仅可以通过getWapper(Class)方法创建子类。在创建子类过程中,子类代码会对传进来的Class对象进行解析,拿到类方法,类成员变量等信息。而这个包装类持有实际的扩展点实现类。也可以把扩展点的公共逻辑全部移到包装类中,功能上就是作为AOP实现。

创建包装类的构造方法:

public static Wrapper getWrapper(Class<?> c) {    
    while (ClassGenerator.isDynamicClass(c))
        c = c.getSuperclass();

    if (c == Object.class)
        return OBJECT_WRAPPER;

    // 从缓存中获取 Wrapper 实例
    Wrapper ret = WRAPPER_MAP.get(c);
    if (ret == null) {
        // 缓存未命中,创建 Wrapper
        ret = makeWrapper(c);
        // 写入缓存
        WRAPPER_MAP.put(c, ret);
    }
    return ret;
}

在缓存中获取不到Wapper就会进入下面的方法makeWapper:

private static Wrapper makeWrapper(Class<?> c) {
    // 检测 c 是否为基本类型,若是则抛出异常
    if (c.isPrimitive())
        throw new IllegalArgumentException("Can not create wrapper for primitive type: " + c);

    String name = c.getName();
    ClassLoader cl = ClassHelper.getClassLoader(c);

    // c1 用于存储 setPropertyValue 方法代码
    StringBuilder c1 = new StringBuilder("public void setPropertyValue(Object o, String n, Object v){ ");
    // c2 用于存储 getPropertyValue 方法代码
    StringBuilder c2 = new StringBuilder("public Object getPropertyValue(Object o, String n){ ");
    // c3 用于存储 invokeMethod 方法代码
    StringBuilder c3 = new StringBuilder("public Object invokeMethod(Object o, String n, Class[] p, Object[] v) throws " + InvocationTargetException.class.getName() + "{ ");

    // 生成类型转换代码及异常捕捉代码,比如:
    //   DemoService w; try { w = ((DemoServcie) $1); }}catch(Throwable e){ throw new IllegalArgumentException(e); }
    c1.append(name).append(" w; try{ w = ((").append(name).append(")$1); }catch(Throwable e){ throw new IllegalArgumentException(e); }");
    c2.append(name).append(" w; try{ w = ((").append(name).append(")$1); }catch(Throwable e){ throw new IllegalArgumentException(e); }");
    c3.append(name).append(" w; try{ w = ((").append(name).append(")$1); }catch(Throwable e){ throw new IllegalArgumentException(e); }");

    // pts 用于存储成员变量名和类型
    Map<String, Class<?>> pts = new HashMap<String, Class<?>>();
    // ms 用于存储方法描述信息(可理解为方法签名)及 Method 实例
    Map<String, Method> ms = new LinkedHashMap<String, Method>();
    // mns 为方法名列表
    List<String> mns = new ArrayList<String>();
    // dmns 用于存储“定义在当前类中的方法”的名称
    List<String> dmns = new ArrayList<String>();

    // --------------------------------✨ 分割线1 ✨-------------------------------------

    // 获取 public 访问级别的字段,并为所有字段生成条件判断语句
    for (Field f : c.getFields()) {
        String fn = f.getName();
        Class<?> ft = f.getType();
        if (Modifier.isStatic(f.getModifiers()) || Modifier.isTransient(f.getModifiers()))
            // 忽略关键字 static 或 transient 修饰的变量
            continue;

        // 生成条件判断及赋值语句,比如:
        // if( $2.equals("name") ) { w.name = (java.lang.String) $3; return;}
        // if( $2.equals("age") ) { w.age = ((Number) $3).intValue(); return;}
        c1.append(" if( $2.equals(\"").append(fn).append("\") ){ w.").append(fn).append("=").append(arg(ft, "$3")).append("; return; }");

        // 生成条件判断及返回语句,比如:
        // if( $2.equals("name") ) { return ($w)w.name; }
        c2.append(" if( $2.equals(\"").append(fn).append("\") ){ return ($w)w.").append(fn).append("; }");

        // 存储 <字段名, 字段类型> 键值对到 pts 中
        pts.put(fn, ft);
    }

    // --------------------------------✨ 分割线2 ✨-------------------------------------

    Method[] methods = c.getMethods();
    // 检测 c 中是否包含在当前类中声明的方法
    boolean hasMethod = hasMethods(methods);
    if (hasMethod) {
        c3.append(" try{");
    }
    f
数理金融学笔记 Chap2 二叉树模型Binomial 2 二叉树模型与期权定价 Binomial Model and Option Pricing 文章目录2 二叉树模型与期权定价 Binomial Model and Option Pricing单期二叉树模型 One-step Binomial Model风险与无风险资产单期二叉树模型与无套利条件无套利定价 No Arbitrage Pricing风险中性定价 Risk Neutral PricingDelta套期保值 Delta Hedging两期二叉树模型 Two-Step Binomial Model 阅读详情

相关推荐

SAP ABAP 接口管理服务(ZIF)开源项目介绍

接口管理服务(ZIF)开源项目基于 SAP ABAP系统,是一款对标SAP PI/PO 的轻量接口管理产品。他通过独立开发包部署在ABAP系统中,包含接口注册、接口管理、日志服务及其他配套功能,拥有丰富的技术沉淀并通过市场检验,目前已被多家企业应用在SAP ERP系统中。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 1693

Dubbo核心模型Invoker

Dubboinvoker是provider和consumer实现RPC调用的关键,invoker的构建过程是Dubbo服务的init初始化过程。invoker#invoke的调用是Dubbo服务的call调用过程。因此,这里分析invoker模型,主要是provider和consumer端的初始化过程。

qq_36851469的博客 1958

Dubbo入门与实战:分布式服务治理教程+源码实例

Dubbo是阿里巴巴开源的高性能Java RPC框架,致力于提供透明化的远程服务调用。其核心解决微服务架构中服务治理难题,涵盖服务注册、发现、负载均衡、容错、监控等全链路能力。相较于传统WebService或Spring Cloud OpenFeign,Dubbo在性能、协议扩展性及服务治理精细度上更具优势。在开始配置之前,必须先定义统一的 API 接口模块。这是服务提供者与消费者之间的契约,应独立成一个 Maven 模块(如demo-api),并通过 jar 包形式引入双方工程。

weixin_35671843的博客 893

dubbo解析-集群容错八大Invoker实现类详解

AbstractClusterInvoker子类只实现了doInvoke方法,所以后面的文章只介绍doInvoke方法。 FailoverClusterInvoker

龚厂长的博客 1589

DubboInvoker

相关博客: Spring 自定义 XML 配置扩展 Dubbo的SPI机制(二)(Dubbo优化后的SPI实现) Dubbo 的 SPI 机制(三)(Extension 扩展点补充) Dubbo 之服务发布和注册(一) Dubbo 之服务发布和注册(二)(补充)   在 Dubbo 官方文档中有这么一段介绍: 在 Dubbo核心领域模型中: Protocol 是服务域,它是...

【欢迎关注公众号:冬瓜白】 1892

Dubbo Invoker

Dubbo官网对Invoker进行了说明: Invoker 是实体域,它是 Dubbo核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。 在服务提供方,Invoker 用于调用服务提供类。在服务消费方,Invoker 用于执行远程调用。Invoker 是由 Protocol ...

学无止境 4936

深入理解dubbo工业级架构设计_一文深入理解Dubbo核心模型Invoker

欢迎关注专栏《Java架构筑基》——专注于Java技术的研究与分享!Java架构筑基​zhuanlan.zhihu.comJava架构筑基——专注于Java技术的研究与分享!后续文章将首发此专栏!欢迎各位Java工程师朋友投稿和关注# 链接 Java程序员福利"常用资料分享"一、DubboInvoker介绍为什么说InvokerDubbo核心模型呢?InvokerDubbo中的实体域,也就是...

weixin_33724428的博客 526

dubbo三种invoke_Dubbo(五):深入理解Dubbo核心模型Invoke

一、DubboInvoker介绍为什么说InvokerDubbo核心模型呢?InvokerDubbo中的实体域,也就是真实存在的。其他模型都向它靠拢或转换成它,它也就代表一个可执行体,可向它发起invoke调用。在服务提供方,Invoker用于调用服务提供类。在服务消费方,Invoker用于执行远程调用。二、服务提供方的Invoker在服务提供方中的Invoker是由ProxyFactory...

weixin_29300931的博客 1296

深入理解dubbo之服务发布源码分析

dubbo 是阿里开源的一个分布式服务框架,它的最大特点是按照分层的方式来架构,使各层之间充分解耦,并且它是无侵入性的,dubbo可以无缝与spring整合,更重要的是dubbo还提供了强大的容错和监控功能。 对于业务方来说,dubbo使用上手足够简单,调用过程对业务方透明,对开发人员友好。Demo在spring项目中添加如下pom包: <dependency> <group

nethackatschool的专栏 1万+

Dubbo provider export 的 invoker到底是什么?

在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)如何准备面试?1、前期铺垫(技术沉积)程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。

2401_85117695的博客 863

dubbo深入理解Apache Dubbo与实战

服务提供者启动时,会广播自己的地址。ZooKeeper注册中心采用的是“事件通知” + “客户端拉取”的方式,客户端在第一次连接上注册中心时,会获取对应目录下全量的数据。注册中心之间保持TCP长连接,后续每个节点有任何数据变化的时候,注册中心会根据watcher的回调主动通知客户端(事件通知),客户端接到通知后,会把对应节点下的全量数据都拉取过。ZooKeeper是官方推荐的注册中心,在生产环境中有过实际使用,具体的实现在Dubbo 源码的dubbo-registry-zookeeper模块中。

weixin_43675252的博客 1545

Dubbo核心模块深度剖析:RPC通信机制

Dubbo核心模块深度剖析:RPC通信机制 【免费下载链接】dubbo Dubbo 是一款高性能、轻量级的分布式服务框架,旨在解决企业应用系统中服务治理的问题。轻量级的服务框架,支持多种通信协议和服务治理。适用分布式微服务架构下的服务调用和治理。 ...

gitblog_00059的博客 540

Dubbo笔记 ⑦ : 服务请求处理流程

一、前言 本系列为个人Dubbo学习笔记,内容来源于《深度剖析Apache Dubbo 核心技术内幕》,仅用于个人笔记记录。本文分析基于Dubbo2.7.0版本,由于个人理解的局限性,若文中不免出现错误,感谢指正。 二、 ...

猫吻鱼的博客 1898

dubbo 消费者也要暴露端口吗_《深入理解Apache Dubbo与实战》第1章下-Dubbo总体分层...

上篇文章介绍了架构方面的演进,Dubbo项目的历史以及作用等内容。今天我们站得高一点,从整体的分层上面来看一下Dubbo的结构。我在村口等小芳:《深入理解Apache Dubbo与实战》第1章上​zhuanlan.zhihu.comDubbo的总体分层Dubbo从分包的角度上来看,总共包括了Biz层,RPC层,以及Remote层。Service层以及Config层可以认为是API层,这两层也是我们...

weixin_39832727的博客 170

Dubbo服务调用流程全解析:从请求到响应的微服务通信之旅

在微服务架构中,服务间的通信就像城市中的交通系统:如果缺乏高效的交通管理,再好的城市规划也会陷入瘫痪。想象一下,当你在电商平台下单时,订单服务需要调用用户服务验证身份、商品服务检查库存、支付服务处理付款——这些服务分布在不同的服务器上,如何确保它们能够高效、可靠地协同工作?Dubbo作为阿里巴巴开源的分布式服务框架,提供了一套完整的服务调用解决方案。本文将深入剖析Dubbo服务的完整调用流程,从服务注册发现到网络通信,从负载均衡到集群容错,带你全面理解Dubbo的内部工作机制。Dubbo采用经典的分层架构设

全栈开发工程师 1912

深入理解Dubbo源码核心原理-Part3

2、基于要注入的信息生成代理,步骤:subscribe -> notify -> 根据providerUrl生成invoker -> 要使这个invoker变成可用的,还需通过netty生成连接获取client,这样就具备DubboInvoker特性了。现在需要思考,待注入的Bean从哪儿来,这个Bean必然注入的是一个proxy,所以就需要思考这个proxy如何生成。第二,请求如何发送。1、找到要注入的信息,如:哪个field需要注入@DubboReference。接下来看真正inject方法。

qq_46248151的博客 458

深度剖析 Apache Dubbo 核心技术内幕

本文从基础使用到底层内核,系统梳理了 Dubbo核心机制,包括服务暴露与消费流程、SPI 扩展点、适配器原理、线程模型、负载均衡、容错策略以及高级特性。掌握这些内容能够帮助在实际项目中更好地使用和调优 Dubbo。《Apache Dubbo 官方文档》Dubbo 3.x 新特性:Triple 协议与应用级服务发现《深入理解Apache Dubbo与实战》

weixin_44551234的博客 600

Dubbo启停原理解析

本章主要内容: • Dubbo配置解析; • Dubbo服务暴露原理; • Dubbo服务消费原理; • Dubbo优雅停机解析 1配置解析 目前Dubbo框架同时提供了 3种配置方式:XML配置、 注解、 属性文件(properties和ymal)配置, 最常用的还是XML和注解两种方式。 1.1 基于schema设计解析 Dubbo 设计之初也考虑到属性最大限度的复用, 因此对schema进行了精心的设计, Dubbo schema层级的详细设计如图5.1所示。 1.2 基于XML配置原理解析

chenbin1991smile的博客 394

《面试八股文》之Dubbo17卷

虽然金三银四过了,但是金九银十马上就要到了,还不快快准备起来?今天就开启《》系列的第一版-1.Dubbo是什么?RPC又是什么?2. Dubbo能做什么?3.能说下Dubbo的总体的调用过程吗?4.说说Dubbo 支持哪些协议,每种协议的应用场景和优缺点5.Dubbo中都用到哪些设计模式?6.如果Dubbo中provider提供的服务由多个版本怎么办?7.服务暴露的流程是怎么样的?8.服务引用的流程是怎么样的?9.Dubbo的注册中心有哪些?10.聊聊Dubbo SPI机制?......

weixin_70730532的博客 155

深入理解Apache Dubbo与实战-第5章《Dubbo启停原理解析》总结

1、配置解析 基于XML配置原理解析:主要解析逻辑入口是在DubboNamespaceHandler类中完成的,

QQsilhonette的博客 1167

2025年10月自考13015《计算机系统原理》真题+答案+详解+考点

内容概要:本文为2025年10月自考科目《计算机系统原理》(课程代码13015)的真题及详细解析,涵盖选择题、填空题、名词解释、简答题和计算题五大题型,全面考查计算机系统的基础知识与核心原理。内容涉及系统软件分类、指令系统结构(ISA)、原码表示、冯·诺依曼体系结构、ELF文件格式、存储器类型、中断机制、I/O控制方式、进程管理、总线带宽计算等关键知识点,并附有高频考点归纳与解题思路分析,帮助考生掌握考试重点。; 适合人群:参加高等教育自学考试“计算机系统原理”课程的考生,以及希望巩固计算机组成原理基础知识的计算机专业学生或初学者。; 使用场景及目标:①用于自考复习备考,精准把握考试范围与命题规律;②系统梳理计算机系统核心概念,强化对数据表示、CPU执行流程、存储体系、I/O控制等难点的理解与应用能力;③通过真题训练提升应试技巧与计算题解题能力。; 阅读建议:建议结合教材系统学习,先掌握基本概念后再对照真题解析查漏补缺,重点关注高频考点总结与计算题解法步骤,注重理解而非死记硬背,尤其要熟练掌握浮点运算、Cache映射、指令周期、中断处理等典型题型的分析方法。

上一篇: 一文详解Docker 代理脱坑
下一篇: 一文详解Redis面试中常见的5种数据结构及对应使用场景
Java_supermanNO1
博客等级 码龄7年 1169粉丝 331原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值