Dubbo调用

news2024/11/26 14:40:44

Dubbo调用

0. 概述

Dubbo 服务调用过程比较复杂,包含众多步骤,比如发送请求、编解码、服务降级、过滤器链处理、序列化、线程派发以及响应请求等步骤。

1. 客户端发送请求时序图

在这里插入图片描述

在这里插入图片描述

  • InvokerInvocationHandler.invoke

    1. 对于Object中的方法toString, hashCode, equals直接调用invoker的对应方法。
    2. 远程调用层是以Invocation, Result为中心, 这里根据要调用的方法以及传入的参数构建RpcInvocation对象,作为Invoker的入参。
    
  • MockClusterInvoker根据参数提供了三种调用策略

    1. 不需要mock, 直接调用FailoverClusterInvoker。
    2. 强制mock,调用mock。
    3. 先调FailoverClusterInvoker,调用失败在mock。
    
  • FailoverClusterInvoker默认调用策略

    1. 通过目录服务查找到所有订阅的服务提供者的Invoker对象。
    2. 路由服务根据策略来过滤选择调用的Invokers。
    3. 通过负载均衡策略LoadBalance来选择一个Invoker。
    
  • 执行选择的Invoker.inoker(invocation)

    1. 经过监听器链,默认没有。
    2. 经过过滤器链,内置实现了很多。
    3. 执行到远程调用的DubboInvoker。
    
  • DubboInvoker

    1. 根据url 也就是根据服务提供者的长连接,这里封装成交互层对象ExchangeClient供这里调用。
    2. 判断远程调用类型同步,异步还是oneway模式。
    3. ExchangeClient发起远程调用,底层remoting不在这里描述了。
    
  • 获取调用结果

    1. Oneway返回空RpcResult。
    2. 异步,直接返回空RpcResult, ResponseFuture回调。
    3. 同步,ResponseFuture模式同步转异步,等待响应返回。
    

2. 服务端接收请求时序图

在这里插入图片描述

  • DubboProtocol的requestHandler是ExchangeHandler的实现,是remoting层接收数据后的回调

    1. requestHandler.replay方法接收请求消息,这里只处理远程调用消息Invocation。
    2. 通过Invocation获取服务名和端口组成serviceKey=com.alibaba.dubbo.demo.DemoService:20880, 从DubboProtocol的exproterMap中获取暴露服务的DubboExporter, 在从dubboExporter 获取invoker返回。
    3. 经过过滤器链。
    4. 经过监听器链。
    5. 到达执行真正调用的invoker, 这个invoker由代理工厂ProxyFactory.getInvoker(demoService, DemoService.class, registryUrl)创建。
    
  • 调用demoService实例方法,将结果封装成RpcResult返回

    1. 交换层构建Response,通过Remoting层编码传输将结果响应给调用方。
    

3. 消费方发起请求底层通信时序图

在这里插入图片描述

4. 服务提供方接收请求底层通信时序图

在这里插入图片描述

5. 源码分析

本文是基于2.7.8源码进行分析的。

从 DemoService 接口的代理类开始进行分析

通过反编译,可以看到生成的代理类对象如下:
在这里插入图片描述

currentClient.request

currentClient.request 源码如下就是组装 request 然后构造一个 future 然后调用 NettyClient 发送请求。

在这里插入图片描述

因为是异步,那么这个 future 保存了之后,等响应回来了如何找到对应的 future 呢?

可以看到 Request 会生成一个全局唯一 ID,然后 future 内部会将自己和 ID 存储到一个 ConcurrentHashMap。这个 ID 发送到服务端之后,服务端也会把这个 ID 返回来,这样通过这个 ID 再去ConcurrentHashMap 里面就可以找到对应的 future ,这样整个连接就正确且完整了!

在这里插入图片描述

在这里插入图片描述

6. 总结

本篇文章主要介绍了服务调用的过程。

7. 鸣谢

Dubbo服务调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167244.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA常用配置整理说明

文章目录IDEA常用配置整理说明1、 IDE配置1.1 设置相关1.1.1 忽略大小写开关1.1.2 取消单行显示tabs的操作1.1.3 项目文件编码1.1.4 滚轴修改字体大小1.1.5 设置显示行号和方法间的分隔符1.1.6 新建类头注释信息1.1.7 JavaDoc注释(就是方法上加的注释)1.…

蓝桥杯:整数分解

题目链接 问题描述 答案提交 本题答案:691677274345。 思路分析 问题描述 将 3 分解成两个正整数的和, 有两种分解方法, 分别是312 和 321 。注意顺序不同算不同的方法。 将 5 分解成三个正整数的和, 有 6 种分解方法, 它们是 113 122 131 212 221 311。…

WebSocket长连接接入支付宝消息服务,实现消息通知

大家好,我是小悟 在对接支付宝开放平台的一些常用功能时,常常需要收到支付宝的回调通知结果,才能处理业务逻辑。此文介绍通过WebSocket长连接接入支付宝消息服务,实现消息通知。 包括五部分内容:问题、优势、配置、代…

Spring3.*中ASM和JDK8版本冲突问题及解决方案

1. 问题描述 Spring3.* 中ASM版本较低,不支持对 JDK8 class文件进行操作,启动时报错。 Tomcat报错 org.springframework.asm.MethodVisitor.visitParameter2. 问题原因 Spring使用ASM类库操作Java class文件,Spring.* 依赖的ASM类库版本比…

右键万能格式转换工具

格式转换是很多小伙伴都会用到的东西,无论是视频、音频还是文档等格式,其实做这方面的软件有很多,比如之前一直在用的格式工厂,蛮好用的。后面用到了ABC工具箱,(这款软件批量处理图片会很方面)界…

故障分析 | 库表名-大小写不规范,运维两行泪

作者:刘聪 爱可生华东交付服务部 DBA 成员,专职 MySQL 故障处理及相关技术支持。座右铭:好好学习,天天向上。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系…

【博客589】K8s Topology Spread Constraints

K8s Topology Spread Constraints 场景 你可以使用 拓扑分布约束(Topology Spread Constraints) 来控制 Pod 在集群内故障域之间的分布, 例如区域(Region)、可用区(Zone)、节点和其他用户自定义…

带你从概念到服务对象,解读商业智能BI

数据在当前时代已然成为了重要的战略资源,但数据资产却并不是每个企业都能利用。数据本身并没有太多意义,规模小还好,一旦规模量变大,人们就难以理解其中的含义。所以讲数据资产价值化,使其转化为信息和知识成为了企业…

五个了解自己天赋优势的分析工具(四)MBTI测试

MBTI测试 MBTI全称“迈尔斯-布⾥格斯类型指标”,是美国作家伊莎⻉尔布⾥格斯迈尔斯和她的⺟亲凯瑟琳库克布⾥格斯在20世纪40年代编制的⼀种⼈格测试。 这⼀测试的基础来⾃著名⼼理学家荣格提出的⼼理类型理论。 荣格将⼈的性格类型分为“内向(I&#xf…

广告业务系统 之 业务串联 —— “ PDB - 广告投放【保量保价】”

文章目录广告业务系统 之 业务串联 —— “ PDB - 广告投放【保量保价】”PDB - 广告投放[保量保价]PDB 浅述PDB 数据流图保量逻辑设计订单曝光拆分凌晨停量补量广告业务系统 之 业务串联 —— “ PDB - 广告投放【保量保价】” PDB - 广告投放[保量保价] 常规的 ADX 系统&am…

【C语言练习】 二进制中1的个数

目录题目详情:思路一:思路二:思路三:题目详情: 思路一: 拿到二进制的每一位,看它是否等于 111,再定义一个计数器变量,如果等于 111,计数器变量就加 111。最终…

rancher的k3s证书过期

文章目录现象rancher报错日志分析解决思路解决现象 web上rancher不能访问,服务上看443端口没了,6443端口仍然在。 rancher报错日志 rancher | time"2023-01-05T01:56:07.241615176Z" levelinfo msg"Waiting for master node start…

代码随想录--数组相关题目整理

LeetCode数组相关题目整理 1. LeetCode704 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 解题思路&#xf…

亚马逊云科技助力游戏上云学习心得-运行篇

云服务已经是大势所趋了,通过购置传统服务器来进行应用开发,无法与现代化敏捷的开发方法相结合,对于系统运维的难度也大大增加,而云服务的弹性伸缩、动态计费可以很好地帮助中小企业实现快速应用开发,使得产品的价值最…

一文吃透python面向对象基础+进阶

目录基本理论面向过程与面向对象面向过程面向对象基本概念面向对象基本语法定义类创建对象属性属性和变量区别对象属性类属性限制对象属性添加方法实例方法类方法静态方法私有属性只读属性私有方法魔法方法字符串表示可调用索引操作切片操作比较操作布尔判断遍历操作面向对象三…

字节青训营Go语言学习第一天--基础语言+实战案例

文章目录走进Go语言基础语言2.2基础语言-变量2.3基础语法- if else2.4基础语法-循环基础语法-switch基础语法-数组基础语法-切片基础语法-map基础语法-range基础语法-函数基础语法-指针基础语法-结构体基础语法-结构体方法基础语法-错误处理基础语法-字符串操作基础语法-字符串…

通讯录升级--可增容(动态增长空间)

通讯录成员的改变 之前我们定义了date[100]的数组用来存放100个人的信息,但是当需要存储的人数超过100时,内存不够,存储人数较少时,又有些浪费,并且数组空间在创建时就已经确立,无法随需求改变&#xff0c…

rabbitmq+netcore6 【6】RPC:远程过程调用

文章目录1)前言2)Client interface 客户接口3)Callback queue回调队列4)Correlation Id 关联Id5)Summary总结6)综合以上代码准备工作服务端客户端结果验证官网参考链接: https://www.rabbitmq.c…

372. 超级次方

372. 超级次方题目算法设计:迭代算法设计:递归题目 传送门:https://leetcode.cn/problems/super-pow/ 题目不难懂,问题在于 b 是一个非常非常大的数,会溢出。 迭代和递归,各有解决方法,记录在…

Elasticsearch入门——kibanna和postman操作Elasticsearch索引示例

目录一、使用kibanna操作Elasticsearch索引示例二、使用postman操作Elasticsearch索引示例三、kibanna和postman操作Elasticsearch的总结一、使用kibanna操作Elasticsearch索引示例 启动Elasticsearch和kibanna服务,浏览器访问http://localhost:5601/,进入Dev Tools…