您现在的位置是:首页 > 正文

Dubbo 远程调用过程

2024-01-30 22:10:32阅读 0

服务端暴露过程

在这里插入图片描述

  • 在spring整合dubbo中,NamespaceHandlerDubboBeanDefinitonParser完成解析工作,服务提供两个Bean,一个给本地spring容器,另一个交给dubbo
  • serviceBean实现了AppliactionListener<ContextRefreshEvent>onApplicationEvent方法监听ContextRefreshEvent事件,spring bean加载完成,发布ContextRefreshEvent,执行export方法。加载父类ServiceConfig export方法暴露。
export()
	 doExport()
	 		doExportUrls()
	 			doExportUrlsFor1Protocol() 
	 				 exportLocal()暴露本地服务  封装成exporter对象 exporterMap 
	 				 暴露远程服务  封装成exporter对象 存入exporterMap 中
	 				   protected final Map<String, Exporter<?>> exporterMap = new ConcurrentHashMap<String, Exporter<?>>();
	 				   
private void doExportUrls() {
        List<URL> registryURLs = loadRegistries(true);
        for (ProtocolConfig protocolConfig : protocols) {
            doExportUrlsFor1Protocol(protocolConfig, registryURLs);
        }
}
  • 首先获取properties里面所有注册的url地址,接着对每个协议对应不同的注册中心进行暴露,进行本地暴露、远端暴露,远端暴露的过程中包含Netty服务器的配置和启动、向zk服务器注册并订阅。

客户端引用过程在这里插入图片描述

  • 扫描配置文件,ReferenceBean继承FactoryBeanReferenceConfiginit()开始,
	init()
	    createProxy() 创建代理Invoker,最后利用FactoryBean.getObject()注入
  • createProxy 功能
  • 判断是否是本地JVM的服务
  • 获取注册地址,判断是否是单个URL
  • 注册消费者信息到注册中心中
  • 订阅服务提供者、路由和配置的信息
  • 加入Cluster,将Directory包装成Invoker
  • 最后生成Invoker对象

Invoker作用

  • 它是一个可执行的对象,能够根据方法的名称、参数得到相应的执行结果。
  • 它里面有一个方法Result invoke(Invocation invocation)
  • Invocation是包含需要执行的方法和参数的重要信息,目前他有实现类RpcInvocation、MockInvocation
  • 它的三种类型的Invoker
    1)本地执行类的Invoker
    service端:通过InjvmExporter来进行反射调用方法执行
    2)远程通信类的Invoker
    client端:通过DubboInvoker进行远程通信,发送要执行的接口给server端
    server端:采用AbstractProxyInvoker代理执行,然后将结果返回
    3)多个远程通信执行类的Invoker聚合成集群版的Invoker
    client端:通过AbstractClusterInvoker来进行负载均衡,DubboInvoker进行远程通信,发送要执行的接口给server端:采用AbstractProxyInvoker代理执行,然后将结果返回

消费者网络发送过程

  • 服务代理(创建InvokerInvacationHandler对象)
  • –>服务降级–>集群容错(容错、目录查找、负载均衡)
  • –>扩展点(监听器链。过滤器链)–>服务引用—>
  • 编解码序列化–>网络传输(用来抽象netty和mina接口)
  • –>服务端接受–>从exporterMap提取一个Invoker对象–>
  • (javaassitProxyFactory.AbstractProxyInvoker).doInvoke
  • –>真正实现的方法

接受过程相反

网站文章

  • Ubuntu中apache2(httpd)安装、httpd实现网页图片的挂载

    Ubuntu中apache2(httpd)安装、httpd实现网页图片的挂载

    一、apache2软件包安装和开启 (1)apache2安装 sudo apt-get update sudo apt-get install apache2 (2)apache2的开启 命令:sud...

    2024-01-30 22:10:25
  • Window.open()方法参数详解

    1, 最基本的弹出窗口代码 window.open(&#39;page.html&#39;);2, 经过设置后的弹出窗口 window.open(&#39;page.html&#39;, &#39;n...

    2024-01-30 22:09:56
  • vsinoplayer statemachine

    vsinoplayer statemachine

    2024-01-30 22:09:49
  • 数据业务建立流程之发起网络连接过程(原)

    数据业务建立流程之发起网络连接过程(原)

    经过前面这些过程,网络连接所需要的条件就全部准备就绪,接下来就是等待网络接入。 我们把网络接入过程简单分为三个阶段: 触发阶段 ----该阶段是由各种不同事件触发的,比如SIM载入完毕、PS域Attach成功、通话结束、APN改变等,该阶段的最终都是要调用setupDataOnConnectableApns()方法;

    2024-01-30 22:09:44
  • Spark RDD的分区规则详解

    Spark RDD的分区规则详解

    Spark RDD的分区规则

    2024-01-30 22:09:14
  • cocos2dx 之CCHttpRequest

    这里主要做的是cocos2dx里面的http联网类,主要是介绍get和post,我们主要是通过点击按钮来实现,话不多说,因为代码注释很详细,直接上代码: init里面: get方法: CCLabelT...

    2024-01-30 22:09:07
  • 批量插入数据之nologging

    批量插入数据之nologging

    Oracle nologging tips The nologging option is a great way to speed-up inserts and index creation. It bypasses the writing of the redo log, significantly improving performance. However, this ap

    2024-01-30 22:09:00
  • 想成为最牛B的程序员吗?

    想成为最牛程序员吗?Tip 1 要方法而不是记忆我的一个程序员朋友常跟我说记住超过200个C++函数是多么的有帮助。“我从来不必去查找函数的定义,因此我可以比其他程序员编程快上50%。”他自豪的说。可结果是什么?难道他不知道编译器的代码自动完成功能可以节约大量查找函数及输入函数的时间吗,另外当C#发布出来后,他在记忆函数上面的努力就白费了。当然,编程中对函数的熟记是一件必需的事情,但是...

    2024-01-30 22:08:31
  • css3动画用什么规则,使用css3中的什么规则来定义动画

    css3动画用什么规则,使用css3中的什么规则来定义动画

    使用css3中的“@keyframes”规则来定义动画。“@keyframes”规则用于指定动画规则,定义一个CSS动画的一个周期的行为,可以创建简单的动画;可通过沿动画序列建立关键帧来指定动画序列循环期间的中间步骤。本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。@keyframes是CSS3的一种规则,可以用来定义CSS动画的一个周期的行为,...

    2024-01-30 22:08:25
  • uniapp (小程序)uni-datetime-picker组件点击x清除组件内容很难点到

    因为uni-datetime-picker组件源码中input标签盖住了图标,修改源码样式即可。

    2024-01-30 22:08:14