1概述

Invoker官方解释:

Invoker 是实体域,它是 Dubbo 的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实
现,也可能是一个远程的实现,也可能一个集群实现。

1.1 Invoker接口

通过源码可知Invoker接口不是SPI。 可以调用invoke方法执行调用。

Invocation是参数,如:调用那个方法名称、参数的类型、参数的值是什么等信息。

1.2 Invoker的实现类

从下图展示了各个Invoker实现类的作用。

2 例子代码

2.1 调用本地的实现

想象一下应用场景:dubbo服务提供者会先把提供的功能封装到service中,然后配置到dubbo中(注解或xml文件),dubbo就可以调用到这些service了。

问题:各个service的名称和方法都不同、参数也不一致,能用一种通用的方式掉用各个service吗?

解决方法:dubbo使用Invoker本地的实现来解决这个问题。

dubbo提供了两种实现方式JdkProxyFactory和JavassistProxyFactory。

2.1.1 JdkProxyFactory实现方式

InvokerTest类代码

package org.example.dubbo.invoker;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.URLBuilder;
import org.apache.dubbo.rpc.*;
import org.apache.dubbo.rpc.proxy.jdk.JdkProxyFactory;
import org.example.test.protocol.AlfService;
import org.example.test.protocol.IAlfService;
/** 本地Invoker使用, 2022/12/29. */
public class InvokerTest {public static void main(String[] args) {//业务服务类AlfService alfService = new AlfService();//构造一个空的urlURLBuilder urlBuilder = new URLBuilder();URL url = urlBuilder.build();//构造Invocation对象RpcInvocation rpcInvocation = new RpcInvocation();rpcInvocation.setMethodName("sayHolle");//指定调用的方法名Class<?>[] parameterTypes = new Class[1];//指定调用的方法的参数类型parameterTypes[0] = String.class;rpcInvocation.setParameterTypes(parameterTypes);Object[] args1 = new Object[1];//指定调用的方法的参数args1[0] = "alf";rpcInvocation.setArguments(args1);//创建ProxyFactoryProxyFactory proxyFactory = new JdkProxyFactory();//传入service实例,接口和URL获取Invoker实例Invoker<IAlfService> invoker = proxyFactory.getInvoker(alfService, IAlfService.class, url);//调用invoker实例Result result = invoker.invoke(rpcInvocation);//获取service方法返回值Object value = result.getValue();System.out.println(value);}
}

AlfService类

package org.example.test.protocol;/** 业务类 */
public class AlfService implements IAlfService{@Overridepublic String sayHolle(String hi) {System.out.println("AlfService call");return "hi " + hi;}
}

运行结果,调用了service。

实现原理分析

不管什么service,通过proxyFactory.getInvoker获取到响应的Invoker实例,然后使用统一的invoke(Invocation invocation)方法来调用service。

JdkProxyFactory中的实现方式是通过java的反射实现的上述功能。

2.1.2 JavassistProxyFactory实现方式

只要把上面的代码替换成ProxyFactory proxyFactory = new JavassistProxyFactory(); 即可。

运行结果是一样的。

可以知道方式是通过javassist动态产生的一个Wrapper类的实现,然后编译、加载到JVM中。

产生的Wrapper实现的invokeMethod方法如下:

dubbo的默认实现是JavassistProxyFactory。因为性能更好。

2.2 远程调用

必须得有服务端才运行。这里就不演示了。参考DubboInvoker类实现。

下一篇会有例子。

2.3 集群的调用

集群的Invoker的继承关系如下图。

通过ClusterInvoker类的注释可以看到:

This is the final Invoker type referenced by the RPC proxy on Consumer side.
客户端使用该ClusterInvoker,并且是最外层的Invoker。

A ClusterInvoker holds a group of normal invokers, stored in a Directory, mapping to one Registry.
一个ClusterInvoker通过Directory持有一组普通的Invoker,Directory同时会对应一个注册(参考RegistryDirectory类)。

The ClusterInvoker implementation usually provides LB or HA policies, like FailoverClusterInvoker.
ClusterInvoker提供LB或者HA的功能,如FailoverClusterInvoker类。

In multi-registry subscription scenario, the final ClusterInvoker will referr to several sub ClusterInvokers, with each sub ClusterInvoker representing one Registry. Take ZoneAwareClusterInvoker as an example, it is specially customized for multi-registry use cases: first, pick up one ClusterInvoker, then do LB inside the chose Cluster。
在多注册中心订阅的场景下,一个最外层ClusterInvoker内部可以包含多个子ClusterInvoker,每个子ClusterInvoker代表的一个注册中心。可以参考ZoneAwareClusterInvoker类。

具体的例子请见下一篇文章。

2.4 AsyncToSyncInvoker类异步转同步

This class will work as a wrapper wrapping outside of each protocol invoker.
一个包装类,套在protocol invoker外面。

客户端调用服务端代码时应该是异步的(通过protocol invoker调用的),客户端可以在这个protocol invoker外面套一个AsyncToSyncInvoker,这样就转换到同步了,简化了代码的开发。

3 官方架构图中的Invoker

最开始看这张架构图,对里面3处Invoker不是很理解,现在终于清楚了。

1处:处理集群的Invoker,对外是一个Invoker,内部使用负载均衡等方法来选择一个Invoker(调用远程服务)来调用。

2 处:调用远程的Invoker。

3 处:服务端包装业务service的Invoker。

其实dubbo是一个RPC框架,要解决的就是客户端程序调用服务端程序。

服务端:用Invoker来封装业务service;

客户端:用Invoker来封装远程调用,用Invoker来封装集群。

顺便感叹一下,这个架构图画的真牛!!!

dubbo源码实践-protocol层-invoker理解相关推荐

  1. dubbo源码解析-逻辑层设计之服务降级

    Dubbo源码解析系列文章均来自肥朝简书 前言 在dubbo服务暴露系列完结之后,按计划来说是应该要开启dubbo服务引用的讲解.但是现在到了年尾,一些朋友也和我谈起了明年跳槽的事.跳槽这件事,无非也 ...

  2. dubbo源码解析(九)远程通信——Transport层

    远程通讯--Transport层 目标:介绍Transport层的相关设计和逻辑.介绍dubbo-remoting-api中的transport包内的源码解析. 前言 先预警一下,该文篇幅会很长,做好 ...

  3. dubbo源码解析(十)远程通信——Exchange层

    远程通讯--Exchange层 目标:介绍Exchange层的相关设计和逻辑.介绍dubbo-remoting-api中的exchange包内的源码解析. 前言 上一篇文章我讲的是dubbo框架设计中 ...

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

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

  5. Dubbo源码解析 - 远程暴露

    作者:肥朝 原文地址:http://www.jianshu.com/p/893f7e6e0c58 友情提示:欢迎关注公众号[芋道源码].????关注后,拉你进[源码圈]微信群和[肥朝]搞基嗨皮. 友情 ...

  6. 面试题:DUBBO源码使用了哪些设计模式

    0 文章概述 DUBBO作为RPC领域优秀开源的框架在业界十分流行,本文我们阅读其源码并对其使用到的设计模式进行分析.需要说明的是本文所说的设计模式更加广义,不仅包括标准意义上23种设计模式,还有一些 ...

  7. Dubbo源码解析 --- DIRECTORY和ROUTER

    Dubbo源码解析 --- DIRECTORY和ROUTER 今天看一下Directory和Router. 我们直接从代码看起(一贯风格),先看后总结,对着总结再来看,相信会收获很多.我们先看com. ...

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

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

  9. Dubbo 源码分析 - 服务导出

    1.服务导出过程 本篇文章,我们来研究一下 Dubbo 导出服务的过程.Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑.整个逻辑大致可 ...

最新文章

  1. 有了Gradle,还会选Maven吗?
  2. 世界级Linux技术大师首次公开大量技术内幕
  3. Python倒排索引函数
  4. C++ Primer 5th笔记(3)字符串、向量和数组:字符串
  5. VTK:Texture之TexturePlane
  6. c语言作业小学生测试题,C语言实现小学生随机出题测试计分
  7. SQL的3个主要组成
  8. 《看聊天记录都学不会C语言?太菜了吧》(13)(9*9 乘法表)寻找电脑中的盲盒彩蛋
  9. pta数据结构 彩虹瓶(c++实现)(详解)
  10. TOP 1%的软件工程师和其他 99%有什么不同?
  11. 文献阅读软件_推荐一款阅读英文文献的神器,效率高不少,理解深不少!
  12. 【无标题】段码液晶驱动芯片VK1621S-1资料介绍
  13. Python 定时获取卫星图像做为桌面背景
  14. java唱哪首歌好听_非常非常好听,但是非常非常难找的歌
  15. 【FinE】单利与复利
  16. android 4k手机屏幕分辨率,【11-09讨论】手机上4K屏幕真的有必要吗?
  17. K近邻(k-Nearest Neighbor,KNN)算法,一种基于实例的学习方法
  18. 市面上微型计算机的主频,目前市面上最大屏幕的手机,你知道是哪款吗?
  19. vue根据pc端、移动端做路由适配
  20. ios mfi手柄_适用于iPhone或iPad的最佳MFi游戏手柄

热门文章

  1. 在WPS使用NoteExpress完成论文的思路
  2. binutils工具集
  3. 行空板入门教程第一课:初识行空板
  4. C/C++学习资源(百度云盘链接)
  5. Android 手机开启全局调试xposed插件
  6. 智付电子支付有限公司举办“反洗钱知识培训”
  7. 高校竞赛排行榜---大学生能参加哪些比赛你都知道吗? (适合各个专业)了解 还是 错过 ?
  8. 使用强化学习建立下一个最佳活动(或称行动营销)模型【译文初稿】
  9. 洛达照妖镜!检测真假洛达1562M、1562A、1562F蓝牙耳机的最新方法
  10. ural 1155. Troubleduons