2020年Dubbo30道高频面试题!还在为面试烦恼赶快来看看
nanshan 2025-05-23 18:53 34 浏览 0 评论
前言
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)。
很多时候,其实我们使用这个技术的时候,可能都是因为项目需要,所以,我们就用了,但是,至于为什么我们需要用到这个技术,可能自身并不是很了解的,但是,其实了解技术的来由及背景知识,对于理解一项技术还是有帮助的。
关于Dubbo的知识总结了个思维导图
Dubbo 面试题
1、为什么要用 Dubbo?2、Dubbo 的整体架构设计有哪些分层?3、默认使用的是什么通信框架,还有别的选择吗?4、服务调用是阻塞的吗?5、一般使用什么注册中心?还有别的选择吗?6、默认使用什么序列化框架,你知道的还有哪些?7、服务提供者能实现失效踢出是什么原理?8、服务上线怎么不影响旧版本?9、如何解决服务调用链过长的问题?10、说说核心的配置有哪些?11、Dubbo 推荐用什么协议?12、同一个服务多个注册的情况下可以直连某一个服务吗?13、画一画服务注册与发现的流程图?14、Dubbo 集群容错有几种方案?15、Dubbo 服务降级,失败重试怎么做?16、Dubbo 使用过程中都遇到了些什么问题?17、Dubbo Monitor 实现原理?18、Dubbo 用到哪些设计模式?19、Dubbo 配置文件是如何加载到 Spring 中的?20、Dubbo SPI 和 Java SPI 区别?21、Dubbo 支持分布式事务吗?22、Dubbo 可以对结果进行缓存吗?23、服务上线怎么兼容旧版本?24、Dubbo 必须依赖的包有哪些?25、Dubbo telnet 命令能做什么?26、Dubbo 支持服务降级吗?27、Dubbo 如何优雅停机?28、Dubbo 和 Dubbox 之间的区别?29、Dubbo 和 Spring Cloud 的区别?30、你还了解别的分布式框架吗?
下面是Dubbo 面试题答案解析
1、为什么要用 Dubbo?
随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架。就这样为分布式系统的服务治理框架就出现了,Dubbo 也就这样产生了。
2、Dubbo 的整体架构设计有哪些分层?
接口服务层(Service):该层与业务逻辑相关,根据 provider 和 consumer 的业务设计对应的接口和实现配置层(Config):对外配置接口,以 ServiceConfig 和 ReferenceConfig 为中心服务代理层(Proxy):服务接口透明代理,生成服务的客户端 Stub 和 服务端的 Skeleton,以 ServiceProxy 为中心,扩展接口为 ProxyFactory服务注册层(Registry):封装服务地址的注册和发现,以服务 URL 为中心,扩展接口为 RegistryFactory、Registry、RegistryService路由层(Cluster):封装多个提供者的路由和负载均衡,并桥接注册中心,以Invoker 为中心,扩展接口为 Cluster、Directory、Router 和 LoadBlancce监控层(Monitor):RPC 调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactory、Monitor 和 MonitorService远程调用层(Protocal):封装 RPC 调用,以 Invocation 和 Result 为中心,扩展接口为 Protocal、Invoker 和 Exporter信息交换层(Exchange):封装请求响应模式,同步转异步。以 Request 和Response 为中心,扩展接口为 Exchanger、ExchangeChannel、ExchangeClient 和 ExchangeServer网络 传输 层(Transport):抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Channel、Transporter、Client、Server 和 Codec数据序列化层(Serialize):可复用的一些工具,扩展接口为 Serialization、ObjectInput、ObjectOutput 和 ThreadPool
3、默认使用的是什么通信框架,还有别的选择吗?
默认也推荐使用 netty 框架,还有 mina。
4、服务调用是阻塞的吗?
默认是阻塞的,可以异步调用,没有返回值的可以这么做。Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。
5、一般使用什么注册中心?还有别的选择吗?
推荐使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐。
6、默认使用什么序列化框架,你知道的还有哪些?
推荐使用 Hessian 序列化,还有 Duddo、FastJson、Java 自带序列化。
7、服务提供者能实现失效踢出是什么原理?
服务失效踢出基于 zookeeper 的临时节点原理。
8、服务上线怎么不影响旧版本?
采用多版本开发,不影响旧版本。
9、如何解决服务调用链过长的问题?
可以结合 zipkin 实现分布式服务追踪。
10、说说核心的配置有哪些?
11、Dubbo 推荐用什么协议?
12、同一个服务多个注册的情况下可以直连某一个服务吗?
可以点对点直连,修改配置即可,也可以通过 telnet 直接某个服务。
13、画一画服务注册与发现的流程图?
14、Dubbo 集群容错有几种方案?
15、Dubbo 服务降级,失败重试怎么做?
可以通过 dubbo:reference 中设置 mock=“return null”。mock 的值也可以修改为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名规则是 “接口名称+Mock” 后缀。然后在 Mock 类里实现自己的降级逻辑
16、Dubbo 使用过程中都遇到了些什么问题?
在注册中心找不到对应的服务,检查 service 实现类是否添加了@service 注解无法连接到注册中心,检查配置文件中的对应的测试 ip 是否正确
17、Dubbo Monitor 实现原理?
Consumer 端在发起调用之前会先走 filter 链;provider 端在接收到请求时也是先走 filter 链,然后才进行真正的业务逻辑处理。默认情况下,在 consumer 和 provider 的 filter 链中都会有 Monitorfilter。1、MonitorFilter 向 DubboMonitor 发送数据 2、DubboMonitor 将数据进行聚合后(默认聚合 1min 中的统计数据)暂存到ConcurrentMap<Statistics, AtomicReference> statisticsMap,然后使用一个含有 3 个线程(线程名字:DubboMonitorSendTimer)的线程池每隔 1min 钟,调用 SimpleMonitorService 遍历发送 statisticsMap 中的统计数据,每发送完毕一个,就重置当前的 Statistics 的 AtomicReference 3、SimpleMonitorService 将这些聚合数据塞入 BlockingQueue queue 中(队列大写为 100000) 4、SimpleMonitorService 使用一个后台线程(线程名为:
DubboMonitorAsyncWriteLogThread)将 queue 中的数据写入文件(该线程以死循环的形式来写) 5、SimpleMonitorService 还会使用一个含有 1 个线程(线程名字:DubboMonitorTimer)的线程池每隔 5min 钟,将文件中的统计数据画成图表
18、Dubbo 用到哪些设计模式?
Dubbo 框架在初始化和通信过程中使用了多种设计模式,可灵活控制类加载、权限控制等功能。工厂模式Provider 在 export 服务时,会调用 ServiceConfig 的 export 方法。ServiceConfig中有个字段:
private static final Protocol protocol =
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtensi
on();
Dubbo 里有很多这种代码。这也是一种工厂模式,只是实现类的获取采用了 JDKSPI 的机制。这么实现的优点是可扩展性强,想要扩展实现,只需要在 classpath下增加个文件就可以了,代码零侵入。另外,像上面的 Adaptive 实现,可以做到调用时动态决定调用哪个实现,但是由于这种实现采用了动态代理,会造成代码调试比较麻烦,需要分析出实际调用的实现类。
装饰器模式Dubbo 在启动和调用阶段都大量使用了装饰器模式。以 Provider 提供的调用链为例,具体的调用链代码是在 ProtocolFilterWrapper 的 buildInvokerChain 完成的,具体是将注解中含有 group=provider 的 Filter 实现,按照 order 排序,最后的调用顺序是:
EchoFilter -> ClassLoaderFilter -> GenericFilter -> ContextFilter ->
ExecuteLimitFilter -> TraceFilter -> TimeoutFilter -> MonitorFilter ->
ExceptionFilter
更确切地说,这里是装饰器和责任链模式的混合使用。例如,EchoFilter 的作用是判断是否是回声测试请求,是的话直接返回内容,这是一种责任链的体现。而像ClassLoaderFilter 则只是在主功能上添加了功能,更改当前线程的 ClassLoader,这是典型的装饰器模式。观察者模式Dubbo 的 Provider 启动时,需要与注册中心交互,先注册自己的服务,再订阅自己的服务,订阅时,采用了观察者模式,开启一个 listener。注册中心会每 5 秒定时检查是否有服务更新,如果有更新,向该服务的提供者发送一个 notify 消息,provider 接受到 notify 消息后,运行 NotifyListener 的 notify 方法,执行监听器方法。动态代理模式Dubbo 扩展 JDK SPI 的类 ExtensionLoader 的 Adaptive 实现是典型的动态代理实现。Dubbo 需要灵活地控制实现类,即在调用阶段动态地根据参数决定调用哪个实现类,所以采用先生成代理类的方法,能够做到灵活的调用。生成代理类的代码是 ExtensionLoader 的
createAdaptiveExtensionClassCode 方法。代理类主要逻辑是,获取 URL 参数中指定参数的值作为获取实现类的 key。
19、Dubbo 配置文件是如何加载到 Spring 中的?
Spring 容器在启动的时候,会读取到 Spring 默认的一些 schema 以及 Dubbo 自定义的 schema,每个 schema 都会对应一个自己的 NamespaceHandler,NamespaceHandler 里面通过 BeanDefinitionParser 来解析配置信息并转化为需要加载的 bean 对象!
20、Dubbo SPI 和 Java SPI 区别?
JDK SPI:JDK 标准的 SPI 会一次性加载所有的扩展实现,如果有的扩展吃实话很耗时,但也没用上,很浪费资源。所以只希望加载某个的实现,就不现实了DUBBO SPI:1、对 Dubbo 进行扩展,不需要改动 Dubbo 的源码2、延迟加载,可以一次只加载自己想要加载的扩展实现。3、增加了对扩展点 IOC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。4、Dubbo 的扩展机制能很好的支持第三方 IoC 容器,默认支持 Spring Bean。
21、Dubbo 支持分布式事务吗?
目前暂时不支持,可与通过 tcc-transaction 框架实现介绍:tcc-transaction 是开源的 TCC 补偿性分布式事务框架TCC-Transaction 通过 Dubbo 隐式传参的功能,避免自己对业务代码的入侵。
22、Dubbo 可以对结果进行缓存吗?
为了提高数据访问的速度。Dubbo 提供了声明式缓存,以减少用户加缓存的工作量<dubbo:reference cache=“true” />其实比普通的配置文件就多了一个标签 cache=“true”
23、服务上线怎么兼容旧版本?
可以用版本号(version)过渡,多个不同版本的服务注册到注册中心,版本号不同的服务相互间不引用。这个和服务分组的概念有一点类似。
24、Dubbo 必须依赖的包有哪些?
Dubbo 必须依赖 JDK,其他为可选。
25、Dubbo telnet 命令能做什么?
dubbo 服务发布之后,我们可以利用 telnet 命令进行调试、管理。Dubbo2.0.5 以上版本服务提供端口支持 telnet 命令连接服务telnet localhost 20880 //键入回车进入 Dubbo 命令模式。查看服务列表
dubbo>ls
com.test.TestService
dubbo>ls com.test.TestService
create
delete
query
· ls (list services and methods)· ls : 显示服务列表。· ls -l : 显示服务详细信息列表。· ls XxxService:显示服务的方法列表。· ls -l XxxService:显示服务的方法详细信息列表。
26、Dubbo 支持服务降级吗?
以通过 dubbo:reference 中设置 mock=“return null”。mock 的值也可以修改为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名规则是 “接口名称+Mock” 后缀。然后在 Mock 类里实现自己的降级逻辑27、Dubbo 如何优雅停机?
Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果使用kill -9 PID 等强制关闭指令,是不会执行优雅停机的,只有通过 kill PID 时,才会执行。28、Dubbo 和 Dubbox 之间的区别?
Dubbox 是继 Dubbo 停止维护后,当当网基于 Dubbo 做的一个扩展项目,如加了服务可 Restful 调用,更新了开源组件等。29、Dubbo 和 Spring Cloud 的区别?
根据微服务架构在各方面的要素,看看 Spring Cloud 和 Dubbo 都提供了哪些支持。
使用 Dubbo 构建的微服务架构就像组装电脑,各环节我们的选择自由度很高,但是最终结果很有可能因为一条内存质量不行就点不亮了,总是让人不怎么放心,但是如果你是一名高手,那这些都不是问题;而 Spring Cloud 就像品牌机,在Spring Source 的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性,但是如果要在使用非原装组件外的东西,就需要对其基础有足够的了解。
30、你还了解别的分布式框架吗?
别的还有 spring 的 spring cloud,facebook 的 thrift,twitter 的 finagle 等
最后
私信回复 资料 领取一线大厂Java面试题总结+阿里巴巴泰山手册+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结!
这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。
相关推荐
- CentOS 7 搭建 Harbor2.4.1 Docker镜像仓库
-
上一篇文章我们使用了registry镜像来搭建Docker私有镜像仓库,但是使用体验不是很好,没有一个可管理的UI界面,管理很麻烦。本篇文章将介绍一个新的搭建Docker镜像仓库的工具叫做Har...
- 简单认识认识mqtt及mosquitto(mqtt报文解析)
-
某项目中使用了MQTT作为进程间的通信方式,之前没用过,这两篇笔记我们就来一起学习一下这种方式。MQTT的一些介绍以下介绍内容来自《[野火]《LwIP应用开发实战指南》MQTT协议全称是Messa...
- 全源码打造高性能 LNMP 架构: 实战教程(2025最新版)
-
适用场景:企业生产环境、自建Web服务、深度性能调优操作系统:CentOS7/8、RockyLinux、Debian、Ubuntu(本文以CentOSStream9为例)技术栈:N...
- Nacos3.0重磅来袭!全面拥抱AI,单机及集群模式安装详细教程!
-
之前和大家分享过JDK17的多版本管理及详细安装过程,然后在项目升级完jdk17后又发现之前的注册和配置中心nacos又用不了,原因是之前的nacos1.3版本的,版本太老了,已经无法适配当前新的JD...
- Ubuntu24.04.2 企业级MinIO存储系统部署指南
-
一、概要1.1MinIO架构解析MinIO是一款高性能的云原生对象存储系统,采用Golang开发并遵循ApacheLicensev2.0协议。其核心架构基于纠删码(ErasureCode)技...
- 从零打造自己的 国产鸿蒙(OpenHarmony)定制系统-完整可落地流程
-
适用版本:OpenHarmony4.0/5.0Standard目标人群:想在x86PC、RK3568开发板或自有硬件上裁剪、加品牌、预装应用并生成可刷机镜像的开发者/团队目录环境准...
- 一次暂未成功的dify安装经历(dify怎么安装)
-
前几天在阿里云买了一台机,这几天一直在尝试安装dify,到现在还没安装上我是按这个教程装的https://blog.csdn.net/2401_82469710/article/details/14...
- ZLMediaKit教程(五)支持webrtc(webrtc lib)
-
ZLMediaKit系列文章(共六篇):ZLMediaKit流媒体(一)编译安装ZLMediaKit教程(二)主程序和配置文件解析ZLMediaKit教程(三)URL规则ZLMediaKit教程...
- Linux程序安装与管理指南(linux程序安装命令大全)
-
在Linux系统中,安装和管理程序主要通过包管理器和手动编译安装两种主要方式实现。以下是详细的操作指南,涵盖常见发行版(如Ubuntu/Debian、CentOS/RHEL、Fedora等)的用法。一...
- 离线状态下安装 Nginx 各个模块?这篇攻略让你轻松搞定
-
你是不是也在为离线状态下安装Nginx各个模块而发愁?在互联网大厂后端开发工作中,我们常常会遇到一些特殊的网络环境,比如公司内部的离线服务器,或是处于隔离状态的测试环境。当需要在这些离线环境中安装...
- Rust实践:Win10环境下的openssl交叉编译
-
Rust支持跨平台,可以指定生成目标平台,交叉编译也是支持的。当然,想要交叉编译成功,还需要指定平台的编译器(如:msvc、gcc等)。openssl是C语言开发的库,如果在Rust代码中用到open...
- Linux下Blackwell架构显卡(RTX5070/5090)编译PaddlePaddle指南
-
Blackwell显卡架构如RTX5070\5090等显卡当前Paddle预编译版本中包含的GPU架构(即SM架构)是有限的,比如常见的SM75(T4)、SM86(A10)、SM89(...
- 突破操作系统界限,掌握Linux的必备指南
-
#头条创作挑战赛#简介Linux是一种开源的操作系统,它的核心思想是自由和开放。Linux以其稳定性、可靠性和安全性而闻名,被广泛用于服务器和嵌入式设备中。Linux创始人Linux安装在安装Linu...
- Linux日常高频使用的100条命令,强烈建议收藏
-
查看系统信息如何查看系统版本:uname-alsb_release-acat/etc/os-release如何查看系统内核信息:uname-r如何查看系统CPU信息:lscpucat...
- Linux文件系统结构全解析(linux文件结构详解)
-
对Linux新手而言,“一切皆文件”的设计哲学常让人既兴奋又困惑——打开终端输入ls/,看到的bin、etc、var等目录到底有什么用?如何快速定位关键文件?本文将从Linux文件系统的底层逻...
你 发表评论:
欢迎- 一周热门
-
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
手机如何设置与显示准确时间的详细指南
-
NAS:DS video/DS file/DS photo等群晖移动端APP远程访问的教程
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
一加手机与电脑互传文件的便捷方法FileDash
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
- 最近发表
-
- CentOS 7 搭建 Harbor2.4.1 Docker镜像仓库
- 简单认识认识mqtt及mosquitto(mqtt报文解析)
- 全源码打造高性能 LNMP 架构: 实战教程(2025最新版)
- Nacos3.0重磅来袭!全面拥抱AI,单机及集群模式安装详细教程!
- Ubuntu24.04.2 企业级MinIO存储系统部署指南
- 从零打造自己的 国产鸿蒙(OpenHarmony)定制系统-完整可落地流程
- 一次暂未成功的dify安装经历(dify怎么安装)
- ZLMediaKit教程(五)支持webrtc(webrtc lib)
- Linux程序安装与管理指南(linux程序安装命令大全)
- 离线状态下安装 Nginx 各个模块?这篇攻略让你轻松搞定
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)