高阶面试-dubbo的学习

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

SPI机制

SPI,service provider interface,服务发现机制,其实就是把接口实现类的全限定名配置在文件里面,然后通过加载器ServiceLoader去读取配置加载实现类,比如说数据库驱动,我们把mysql的jar包放到项目的lib后,DriverManager.getConnection() 就获取到mysql的连接了呢?

其实 DriverManager的静态代码块里面有个loadInitialDrivers方法,调用的ServiceLoader.load(Driver.class) 然后迭代遍历hasNext方法再调用hasNextService,里面指定从META-INF/service目录下找接口名的文件,里面写的java.sql.Driver的mysql实现的全限定名com.mysql.cj.jdbc.Driver

在这里插入图片描述

参考java,dubbo也实现自己的,并进行增强,java的只能循环遍历,dubbo搞的是k=v的形式,可以按需查找

dubbo写了个ExtensionLoader,里面有几个全局映射map,Class和ExtensionLoader的映射、Class和对应实例对象的映射,根据key找到持有value的holder,然后根据holder获取实例,通过双检锁保证实例唯一。

那dubbo除了生成实例外,还有什么增强吗?

有的,dubbo也有IOC,有个injectExtension方法,是通过 setter 方法注入依赖。Dubbo 首先会通过反射获取到实例的所有方法,然后再遍历方法列表,检测方法名是否具有 setter 方法特征。若有,则通过 ObjectFactory 获取依赖对象,最后通过反射调用 setter 方法将依赖设置到目标对象中。

那除了IOC外,还有什么增强吗?

哈哈,其实也有AOP,装饰器模式,有Wrapper类,使用Wrapper类包装原始的扩展点实例。在原始扩展点实现前后插入其他逻辑,实现AOP功能。也是在createExtension方法里面,在IOC之后,做AOP,判断是否有wrapperClass,有的话,遍历,将当前实例包装到wrapper中,通过构造注入,在wrapper中注入依赖,实现增强,还能层层套,如果多个wrapper,由于instance已经变成第一个wrapper包装后的instance,会在外层再包装
instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));

除了AOP还有什么增强吗?
自适应,我们一般扩展点的想法是什么,比如在yaml中配置protol是dubbo,然后呢,框架启动的时候去加载对应的扩展点,那假如我们不想框架启动阶段就加载,而是希望拓展方法被调用的时候,根据运行时的参数进行加载,也就是根据参数动态加载实现类,那要怎么实现呢?
创建接口的自适应实例getAdaptiveExtensionClass()是核心
首先会使用一个StringBuilder来生成自适应类的Java源码,然后再将源码编译成Java的字节码,加载到JVM中,目前是通过javassist实现的。

dubbo的服务暴露机制和源码实现

服务暴露,其实核心就是两点:

  • 开启服务
  • 服务注册

怎么实现呢?
先要了解dubbo怎么传递注册信息等配置信息的,通过url,还挺巧妙的
采用 URL 作为配置信息的统一格式,所有扩展点都通过传递 URL 携带配置信息

dubbo的ServiceBean实现了ApplicationListener,方法onApplicationEvent在容器完成初始化后,调用export导出服务实现服务暴露。核心是doExportUrlsFor1Protocol方法,先各种装配配置参数信息,组装url,然后如果是远程调用,通过代理ProxyFactory转换为Invoker,Dubbo 默认的 ProxyFactory 实现类是 JavassistProxyFactory。RegistryProtocol.export。里面先protocol.export,根据协议如dubbo导出,把Invoker转换为Exporter,这里面会开启服务openServer。
服务注册呢?先根据URL加载 Registry 实现类,然后调register方法向注册中心注册服务。根据SPI机制找到 ZookeeperRegistry extends FailbackRegistry extends AbstractRegistry,register方法在 FailbackRegistry 中,真正执行注册是在ZookeeperRegistry中的doRegister方法里。

dubbo的服务发现机制和源码分析

和provider对应,有个ReferenceConfig,核心也是两点:

  • 先从注册中心获取服务信息
  • 创建客户端

入口在哪里呢?ReferenceBean实现了FactoryBean,真正被注入到容器中的是由getObject方法返回的对象。里面init方法主要用于处理配置,以及调用 createProxy 生成代理类。createProxy一个是构建Invoker实例。调用 RegistryProtocol 的 refer 构建 Invoker 实例。然后getProxy根据Invoker 真正生成代理,实际是子类 JavassistProxyFactory 实现 getProxy方法。

其实注册和创建客户端都是在 RegistryProtocol 的 refer 方法中实现的。先是registry.register注册到zk,然后directory.subscribe订阅,会调ZookeeperRegistry#doSubscribe,最终是调RegistryDirectory#refreshOverrideAndInvoker将providers对应url封装成 invoker,核心是new DubboInvoker,里面的getClients去initClient初始化新的客户端,内部调Exchanger调NettyClient的doOpen再doConnect打开并和对端建立连接,

dubbo的RPC协议

在这里插入图片描述

如图,包括header和body

  • 16bit 魔术 高位和低位,总共16bit,0xdabb
  • 1bit 请求响应标志 请求1 响应0
  • 1bit 是否需要往返 请求的时候有用,如果需要来自服务器的返回值,值为1
  • 1bit event事件,如心跳事件 值为1
  • 5bit 序列化ID,标识序列化类型,如fastjson是6
  • 8bit 响应状态码 20ok 30 client超时等
  • 64bit requestId唯一请求 long类型 8个字节
  • 32bit 消息体的data length,int类型 4个字节
  • body 序列化后的body

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

16. Revit API: Family、FamilySymbol、FamilyInstance

前言 前面写着一直絮絮叨叨,感觉不好。想找些表情包来,写得好玩点,但找不到合适的,或者说耗时费力又不满意,而自个儿又做不来表情包,就算了。 其次呢,之前会把部分类成员给抄表列出来&#xf…

昇思25天学习打卡营第15天|基于 MindSpore 实现 BERT 对话情绪识别

文章目录 昇思MindSpore应用实践1、基于 MindSpore 实现 BERT 对话情绪识别BERT 模型简介数据集数据加载和数据预处理 2、模型训练模型验证 3、模型推理 Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 1、基于 MindSpore 实现 BERT…

FOLANNIC FD31 UPS工作原理介绍

1.1简介 FOLANNIC FD31系列UPS系工业级电厂型不间断电源,是为重要负载提供不受电网干扰、稳压、稳频的电力供应的电源设备,在市电掉电后,UPS可给负载继续提供一段时间供电,此系列UPS采用带输出隔离变压器的高频双变换结…

回收站删除了是不是彻底删除了 回收站删除了怎么找回 回收站删除了还能找回来吗

电脑删除的数据文件一般不会直接被彻底删除掉,而是会暂存在回收站中,这样设计主要是为了防止误删除等操作,如果不小心删除了很重要的文件,只需要在回收站对文件进行还原即可。为了让大家更了解回收站,下面给大家详细讲…

JavaWeb-js(4)

js事件 在前端页面中,js程序大多数是由事件来驱动的,当触发某些事件的时候,可以使用js负责响应。 js事件由三部分组成: 事件源——》指的是被触发的对象; 事件类型——》如何触发的事件,如:鼠标单击、双击、键盘操作等;…

【题目/算法训练】:单调队列单调栈

🚀 前言: 【算法】单调队列&&单调栈 可以在看完这篇文章后,再来写下面的题目 一、绝对差不超过限制的最长连续子数组 思路: 1) 就相当于滑动窗口,维护滑动窗口内的两个值,一个是最大值…

CV05_深度学习模块之间的缝合教学(1)

1.1 在哪里缝 测试文件?() 训练文件?() 模型文件?(√) 1.2 骨干网络与模块缝合 以Vision Transformer为例,模型文件里有很多类,我们只在最后…

Flutter——最详细(Table)网格、表格组件使用教程

背景 用于展示表格组件,可指定线宽、列宽、文字方向等属性 属性作用columnWidths列的宽度defaultVerticalAlignment网格内部组件摆放方向border网格样式修改children表格里面的组件textDirection文本排序方向 import package:flutter/material.dart;class CustomTa…

Mac 上安转文字转 SQL 利器 WrenAI

WrenAI 是一个开源的 Text-SQL 的工具,通过导入数据库结构,通过提问的方式生成 SQL。本文将讲述如何在 MacOS 上安装 WrenAI。要运行WrenAI,首先需要安装 Docker 桌面版。 下载 WrenAI https://github.com/Canner/WrenAI/releases/tag/0.7.…

开源流程表单设计器都有哪些值得一提的优势?

如果需要提质、增效、降本,不妨来了解下低代码技术平台、开源流程表单设计器的功能和优势特点。想要实现流程化办公,低代码技术平台是助力增效的理想工具。功能灵活、操作方便、好维修、可视化操作等优势都是其深受行业喜爱的优势特点。通过本文&#xf…

DDL也会有undo吗?模拟Oracle中DML、DDL与undo的关系,10046跟踪DDL语句

已经有两个月没有更新博客了,主要实在忙毕设和毕业的一些事情!这两个月也是非常的精彩呀,充分体会到了职场的和校园的不同,作为一名刚毕业就满 1 年工作经验的牛马人,在两个月期间经历了两次调岗、两次降薪&#xff0c…

一句歌词描述夏天

夏天总是带着一种奇特的魔力,既能让人沉醉在阳光和海浪的浪漫中,也能在炎热与燥热中让人心生烦闷。特别是在夏日里情绪低落时,那些可以抚平心情的歌曲显得尤为珍贵。音乐,这个神奇的存在,总能在最需要的时候带来心灵的…

使用AutoGPT构建智能体:从LSTM到Prompt编写实战教程001

如果报错,这里会有一个环境变量的设置需要设置上. 然后这一节我们来自己制作一个智能体,来感受一下,实际上现在,大模型还是可以做很多功能的. 可以看到上面是智能体的架构,之前也说过了, 上面这几个功能,如果用我们人类去操作,还是需要花些时间的,如果用大模型就快很多了. 以…

利用Python的sympy包求解一元多次方程

一元1次方程 import sympy as sp # 导入sympy包 x sp.Symbol(x) # 定义符号变量 f 2*x -8 # 定义要求解的一元1次方程 x sp.solve(f) # 调用solve函数求解方程 x[4]一元2次方程 import sympy as sp # 导入sympy包 x sp.Symbol(x) # 定义符号变量 f …

Nature Protocols:整合多组学并进行因果推理的系统框架

转载自:MetaAI 在生物学研究中,随着实验和计算技术的进步,生物系统研究产生了大量高通量数据。技术努力主要集中在提高吞吐量、降低成本和提升实验与计算效率。因此,整合不同类型组学数据,并通过关联分析识别关键因素…

[机器学习]-人工智能对程序员的深远影响——案例分析

机器学习和人工智能对未来程序员的深远影响 目录 机器学习和人工智能对未来程序员的深远影响1. **自动化编码任务**1.1 代码生成1.2 自动调试1.3 测试自动化 2. **提升开发效率**2.1 智能建议2.2 项目管理 3. **改变编程范式**3.1 数据驱动开发 4. **职业发展的新机遇**4.1 AI工…

大数据开发者:如何快速熟悉新公司的技术环境

目录 1. 了解系统架构实践建议:示例对话: 2. 了解领域模型实践建议:示例: 3. 了解代码结构实践建议:示例: 结语 作为一名大数据开发者,加入新公司后快速熟悉技术环境是一项重要而又具有挑战性的…

bev 之 fastBEV

前面我们提到bev 之 LSS, 知道视觉的BEV方案的主要痛点在于: 1、depth 的预测 2、图像特征到BEV特征之间的视图变换消耗大量计算 LSS 为什么需要D维深度 占据大量消耗的原因是LSS 对每个图像特征点引入深度D,即假设每个像素上存在可能的D维深度。也就是假设不同像…

C++ 栈-队列-优先级队列

目录 1 栈 2 队列 3 deque 介绍 4 优先级队列 5 反向迭代器 栈也是我们在C语言就模拟实现过的一种数据结构,在C中,栈其实和我们前面模拟实现过的string、vector等容器有一点区别,站起是不是容器,而是一种容器适配器,我…

Floyd判圈算法——寻找重复数(C++)

287. 寻找重复数 - 力扣(LeetCode) 题目描述 给定一个包含 n 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,返…