高阶面试-dubbo的学习

news2024/10/8 15:00:16

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

在这里插入图片描述

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.coloradmin.cn/o/1917841.html

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

相关文章

人员定位系统可以用在哪些方面?为什么这么受欢迎?

人员定位系统大家都不陌生,它也随着科技的发展变得越来越高端、功能也越来越完善了。从一开始的对讲机沟通到后来的蓝牙定位等等,定位系统的精准度越来越高不说,续航能力也越来也强,以往比较单一和迷你的汽车定位产品都能达到一年…

《故障复盘 · 记一次事务用法错误导致的大量锁表问题》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

VS2019使用C#写窗体程序技巧(1)

1、打开串口 private void button1_Click(object sender, EventArgs e){myPort cmb1.Text;mybaud Convert.ToInt32(cmb2.Text, 10);databit 8;parity Parity.None;stopBit StopBits.One;textBox9.Text "2";try{sp new SerialPort(myPort, mybaud, parity, dat…

蓝卓创始人褚健:工业互联网平台技术赋能中小企业数字化转型的实施路径

工业4.0是由工业软件驱动的工业革命,与传统厚重的工业软件不同,supOS就好比嵌入工厂的“安卓系统”。如果把一个工厂当作一台手机,因为有安卓或苹果开放的操作系统,吸引了全世界聪明的人开发了大量APP供人们使用,手机才…

java:将集合中的数据放到文件中

代码实现目标&#xff1a; 将集合中的数据写道文件中通过字符缓冲输出流实现 代码展示 public static void main(String[] args) throws IOException {//创建ArrayList集合ArrayList<Student> array new ArrayList<>();//创建学生对象Student s1 new Student(&…

昇思25天学习打卡营第14天|基于MindSpore的红酒分类实验

背景介绍 本文主要介绍使用MindSpore在部分wine数据集上进行KNN实验。 K近邻算法原理 K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种用于分类和回归的非参数统计方法&#xff0c;最初由 Cover和Hart于1968年提出(Cover等人,1967)&#xff0c;是机器学习最…

IPv4到IPv6的转换

为何要向IPv6过渡&#xff1a; 随着互联网的飞速发展&#xff0c;越来越多的设备接入网络&#xff0c;IPv4地址资源日益匮乏&#xff0c;已无法满足不断增长的需求。 IP地址定位&#xff1a;IP数据云 - 免费IP地址查询 - 全球IP地址定位平台 IPv6的出现为解决这一问题提供了…

基于OOB的NFTL设计

Nand flash设备存储结构示例 上图是一个1056Mb的存储设备。页面用户数据 空间是2KB&#xff0c;OOB是64字节&#xff0c;每个块 包含64个页面&#xff0c;一共 1024个块。用户数据 空间是128MB&#xff0c;OOB空间是4MB。 每个页面的OOB保留一个字节 用于坏块 标识 &#xff0c…

Elasticsearch 更新指定字段

Elasticsearch 更新指定字段 准备条件查询数据更新指定字段更新子级字段 准备条件 以下查询操作都基于索引crm_clue来操作&#xff0c;索引已经建过了&#xff0c;本文主要讲Elasticsearch更新指定字段语句&#xff0c;下面开始写更新语句执行更新啦&#xff01; 查询数据 查…

Flat Ads:金融科技应用的全球化趋势与发展前景

近年来,全球金融应用市场遭遇了重大严峻考验与深刻变革,但即便在全球经济承受重压、市场波动加剧的背景下,金融科技应用仍展现出了强大的韧性与蓬勃的增长动力。相关机构预计,2023 年全球金融应用市场的总收入达到 15.5亿美元的新高,实现了同比19%的显著增长,而到2027年,这一数…

【源码+文档+调试讲解】超市进销存管理系统

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

探索 ASTRA.AI:打造低代码多模态 AI 应用的开源平台

声网&#xff08;Agora&#xff09;研发的 ASTRA 平台&#xff0c;作为一款面向大语言模型应用开发的开源解决方案&#xff0c;无疑为 AI 领域注入了新的活力。它巧妙地结合了 BaaS&#xff08;后端即服务&#xff09;概念与大型语言模型的运营&#xff0c;使得创建高性能的生成…

开发情绪识别人工智能时的道德考量

情绪调节人工智能是机器学习领域的最新技术进步之一。尽管它显示出巨大的潜力&#xff0c;但道德问题将影响其采用率和寿命。人工智能开发人员能克服这些问题吗&#xff1f; 什么是情绪识别人工智能&#xff1f; 情绪识别人工智能是一种机器学习模型。它通常依赖于计算机视觉…

AI算力中心研究分析

中国 AI 算力中心研究报告 算力产业稳健发展&#xff0c;算力创新能力持续增强&#xff0c;推动我国数字经济量质齐升。 2022 年我国算力规模稳步扩张&#xff0c;算力发展为拉动我国 GDP 增长做出突出贡献&#xff0c;在 2016-2022 年期间&#xff0c;我国算力规模平均每年增…

基于springboot+vue的文件管理系统

一、系统架构 前端&#xff1a;vue2 | element-ui 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. 注册 02. 登录 03. 管理员-首页 04. 管理员-个人中心-修改密码 05. …

Idea 2023 使用GitLab提交代码提示输入Token

项目场景&#xff1a; 今天电脑换硬盘了&#xff0c;安装了 IDEA2023 款的社区版开发工具&#xff0c;下载代码后&#xff0c;提交并推送代码到远程服务器的时候&#xff0c;提示输入Token&#xff0c;并不是用户名和密码。 问题描述 推送代码到远程GitLab本地仓库的时候&…

通用代码生成器模板体系,域对象,枚举和动词算子

通用代码生成器模板体系&#xff0c;域对象&#xff0c;枚举和动词算子 通用代码生成器或者叫动词算子式通用目的代码生成器是一组使用Java编写的通用代码生成器。它们的原理基于动词算子和域对象的笛卡尔积。它们没有使用FreeMarker和或者Velocity等现成的文件式模板引擎。而…

php快速入门

前言 php是一门脚本语言&#xff0c;可以访问服务器&#xff0c;对数据库增删查改&#xff08;后台/后端语言&#xff09; 后台语言&#xff1a;php&#xff0c;java&#xff0c;c&#xff0c;c&#xff0c;python等等 注意&#xff1a;php是操作服务器&#xff0c;不能直接在…

曝宝马汽车门店亏损严重价格战带来的伤害太大了

今年以来不仅餐饮行业难,就连一些车企都陷入困境当中,多家车企选择打价 格战。只不过日前的时候媒体爆料称,宝马汽车门店因为打价格战,最终亏损严 重,为了避免亏损再度出现,因此宝马7月将会开始降量保价。文章来源于&#xff1a;股城网www.gucheng.com 实际上,进入2024年…

分享语音音浪的自制动态特效

主要使用小程序实现的&#xff1a; <!-- wxml --> <view class"audio"><view class"audio-item" wx:for"{{list}}" wx:key"index" style"{{item}}"></view> </view> //js list: [animation…