高阶面试-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.mzph.cn/bicheng/44065.shtml

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

相关文章

Linux操作系统探索时间

Linux时间分为系统时间和硬件时间两种,系统时间指当前Linux中的时间,硬件时间指主板上有电池供电的时间。 -- 查看系统时间:date -- 查看硬件时间:hwclock --show -- 硬件时间同步到系统时间:hwclock --hctosys -- …

springmvc 如何对接接口

Spring MVC对接接口可以通过以下步骤进行: 设置相关的依赖:在项目的pom.xml文件中添加Spring MVC相关的依赖,如spring-webmvc、jackson-databind等。 创建Controller类:在项目中创建一个Controller类,使用Controller注…

arm环境安装达梦数据库

作者:振鹭 一、安装前准备 1、创建用户和用户组 groupadd dinstall useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba2、修改文件打开最大数 vi /etc/security/limits.conf #文件末尾添加以下四行 dmdba hard nofile 65536 dmdba soft nofile 65536 d…

企业SEO优化为什么选择下拉框优化?

搜索下拉框,也叫推荐词、联想词,有的位置叫大家都在搜,大家还在搜,相关搜索等等,其实都是搜索引擎给用户的推荐词,这个是伴随着搜索引擎普及应用而产生的一种SEO优化手段,它可以应用各种搜索平台…

Kafka安装使用指南

Kafka是一种高吞吐量的分布式发布订阅消息系统。 Kafka启动方式有Zookeeper和Kraft,两种方式只能选择其中一种启动,不能同时使用。 【Kafka安装】 Kafka下载 https://downloads.apache.org/kafka/3.7.1/kafka_2.13-3.7.1.tgz Kafka解压 tar -xzf kafka_…

神经网络设计过程

1.可根据Iris特征直接判断 2.神经网络方法,采集大量的Iris特征,分类对应标签,构成数据集。 将数据集喂入搭好的神经网络结构,网络通过反向传播优化参数得到模型。 有新的网络送入到模型里,模型会给出识别结果。 3.…

SaaS知识库新选择: 值得学习的七大SaaS知识库实例

|概述 在当前的SaaS(Software as a Service)行业中,公司面临着前所未有的机遇与挑战并存的现状。随着云计算和人工智能技术的飞速发展,SaaS模式已成为企业信息化转型的优选路径,为企业提供了高效、灵活且成本效益显著…

【linux】服务器配置raid1教程(硬件配置RAID1)

【linux】服务器配置raid1教程(硬件配置RAID1) 【创作不易,求点赞+关注+收藏】 【linux】服务器创建RAID1(软件配置RAID1) 文章目录 【linux】服务器配置raid1教程(硬件配置RAID1)一、前沿二、硬件配置RAID介绍三、通过BIOS界面设置RAID模式并创建RAID1三、查看RAID1数…

python(3.7版本)安装mitmproxy

环境介绍:win11, python3.7 pip install mitmproxy5.0.0 命令行cmd下,输入 Mitmdump 查看结果是否报错 如果报错上面这样子,就是markupsafe版本问题 换个Markupsafe版本就可以了 成功了吧!!!,如有问题,欢迎留言

nodejs学习之glob

用途 以shell使用的模式匹配文件。 安装 pnpm add glob使用 常用 import {glob} from "glob";//常用匹配 let pattern"./src/util/*.js"; //匹配src/util目录下所有js文件 let jsFiles await glob(pattern); jsFiles.forEach((item)>{console.lo…

【深度学习基础】MAC pycharm 专业版安装与激活

文章目录 一、pycharm专业版安装二、激活 一、pycharm专业版安装 PyCharm是一款专为Python开发者设计的集成开发环境(IDE),旨在帮助用户在使用Python语言开发时提高效率。以下是对PyCharm软件的详细介绍,包括其作用和主要功能&…

高品质标准化诊断肝素诱导性血小板减少症试剂盒—HIT AlertTM Kit

肝素诱导的血小板减少症是一种免疫机制介导的综合征,实验室通常进行免疫学和功能学检测来诊断。免疫学通过检测PF4/肝素抗体来诊断,不考虑其激活血小板能力,比如ELISA,化学发光免疫等检测手段。功能学检测引起肝素依赖性血小板活化…

学习笔记——动态路由——OSPF链路状态通告(LSA)

十、OSPF链路状态通告(LSA) 1、链路状态通告简介 (1)LAS概述 链路状态通告(Link State Advertisement,LSA)是路由器之间链路状态信息的载体。LSA是LSDB的最小组成单位,LSDB由一条条LSA构成的。是OSPF中计算路由的重要依据。 LSA用于向其它邻接OSPF路…

Web3知识图谱,一篇读完

这张图展示了区块链生态系统的架构和主要组件。以下是对图中内容的概括总结: 基础层: 底层基础设施:包括光纤网络、P2P网络、非对称加密、哈希算法、默克尔树和随机数生成。共识机制: PoW(工作量证明): 比特…

Kafka 典型问题与排查以及相关优化

Kafka 是一个高吞吐量的分布式消息系统,但在实际应用中,用户经常会遇到一些性能问题和消息堆积的问题。本文将介绍 Kafka 中一些典型问题的原因和排查方法,帮助用户解决问题并优化 Kafka 集群的性能。 一、Topic 消息发送慢,并发性…

强化学习实战1:OpenAI Gym 实验环境介绍

环境配置 我的 torch 版本是 2.3.0,然后 gym 版本是 0.22.0,python 版本是 3.8 ,pygame 版本是 2.6.0 。 首先安装一下 gym: pip install gym0.22.0 -i https://pypi.tuna.tsinghua.edu.cn/simple然后安装一下 pygame&#xff…

AI究竟是在帮助开发者还是取代他们?来看大佬的观点你就明白了

AI(人工智能)在现代社会中扮演着越来越重要的角色,其在软件开发领域的应用也日益广泛。关于AI是在帮助开发者还是取代他们,V 哥个人认为,一半一半吧,为什么这么说,先不用噴,我们需要…

Transformer与CNN在目标检测对决:现代视觉识别的较量

标题:Transformer与CNN在目标检测对决:现代视觉识别的较量 目标检测作为计算机视觉领域的核心技术之一,一直在不断进化。随着深度学习的发展,卷积神经网络(CNN)和Transformer架构都已被应用于目标检测任务…

YOLOv8改进 | 注意力机制 | 增强模型在图像分类和目标检测BAM注意力【小白必备 + 附完整代码】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…

极狐GitLab 17.0 重磅发布,100+ DevSecOps功能更新来啦~【四】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署…