首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Dubbo:常见的面试题和答案

  • 25-03-05 20:46
  • 3338
  • 7301
blog.csdn.net

请关注微信公众号:拾荒的小海螺

1、什么是 Dubbo?它的作用是什么?

答: Dubbo 是一款高性能的 Java RPC 框架,是阿里巴巴公司开源的产品,用于提供高性能的分布式服务框架和面向服务的架构。Dubbo 的主要作用是帮助分布式应用程序进行服务治理,如服务注册、服务发现、负载均衡、容错等。

在这里插入图片描述

2、Dubbo 的架构是怎样的?

答: 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、Dubbo 的通信协议是什么?

答案: Dubbo 的通信协议有多种,包括 Dubbo 协议、RMI 协议、Hessian 协议、HTTP 协议和WebService 协议等。其中 Dubbo 协议是 Dubbo 的默认通信协议,是一种基于 TCP 的二进制协议。

4、Dubbo支持服务降级吗?

答:Dubbo 2.2.0 以上版本支持

5、Dubbo推荐使用什么序列化框架,你知道的还有哪些?

答:推荐使用Hessian序列化,还有Duddo、FastJson、Java自带序列化。

6、Dubbo默认使用的是什么通信框架,还有别的选择吗?

答:Dubbo 默认使用 Netty 框架,也是推荐的选择,另外内容还集成有Mina、Grizzly。

7、Dubbo 的注册中心是什么?有哪些实现?

答: Dubbo 的注册中心是用于服务的注册和发现的中心化管理平台,用于管理服务的元数据和服务的提供者。Dubbo 的注册中心有多种实现,包括 Zookeeper、Redis、Multicast 和 Simple 等。

8、Dubbo 的容错策略有哪些?如何选择?

答案: Dubbo 的容错策略有多种,包括 Failover 容错策略、Failfast 容错策略、Failback 容错策略、Failsafe 容错策略和Forking 容错策略等。在选择容错策略时,需要根据具体的业务场景和需求来选择。

集群容错方案说明
Failover Cluster失败自动切换,自动重试其它服务器(默认)
Failfast Cluster快速失败,立即报错,只发起一次调用
Failsafe Cluster失败安全,出现异常时,直接忽略
Failback Cluster失败自动恢复,记录失败请求,定时重发
Forking Cluster并行调用多个服务器,只要一个成功即返回
Broadcast Cluster广播逐个调用所有提供者,任意一个报错则报错

9、Dubbo集群的负载均衡策略

答:Dubbo 的负载均衡策略有多种,包括 Random 负载均衡策略、RoundRobin 负载均衡策略、LeastActive 负载均衡策略、ConsistentHash 负载均衡策略等。在选择负载均衡策略时,需要根据具体的业务场景和需求来选择。

  • 随机
    按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。(权重可以在dubbo管控台配置)

  • 轮循
    按公约后的权重设置轮循比率。存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

  • 最少活跃调用数
    相同活跃数的随机,活跃数指调用前后计数差。使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

  • 一致性Hash
    相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

10、注册中心宕机,服务间是否可以继续通信?

答:可以通信的,启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用;但前提是你没有增加新的服务,如果你要调用新的服务,则是不能办到的。另外如果服务的提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复;

11、服务提供者能实现失效提出是什么原理?

答:服务失效推出基于 zookeeper 的临时节点原理。

12、服务上线怎么不影响旧版本?

答:采用多版本开发,不影响旧版本。

13、如何解决服务调用链过长的问题?

答:可以结合 zipkin 实现分布式服务追踪,也可以使用 Pinpoint 和 Apache Skywalking(Incubator) 实现分布式服务追踪,当然还有其他很多方案

14、Dubbo 的 SPI 是什么?如何使用?

答: Dubbo 的 SPI 是一种扩展机制,用于实现扩展点的动态加载和注册。Dubbo 的 SPI 提供了一种标准的扩展机制,可以在运行时动态加载和注册扩展点。使用 SPI 时,需要在 META-INF/dubbo/ 目录下创建一个名为接口全限定名加上扩展点名称的文件,并在文件中指定实现类。

15、Dubbo 的服务导出和引用过程是怎样的?

答: Dubbo 的服务导出过程是指将服务暴露给外部客户端的过程,主要通过 @Service 注解和 ServiceConfig 类来实现;服务引用过程是指客户端调用服务的过程,主要通过 @Reference 注解和 ReferenceConfig 类来实现。

16、Dubbo 服务降级,失败重试怎么做?

答:可以通过 dubbo:reference 中设置 mock=“return null”。mock 的值也可以修改为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名规则是 “接口名称+Mock” 后缀。然后在 Mock 类里实现自己的降级逻辑 。

17、Dubbo 的过滤器是什么?有哪些过滤器?

答: Dubbo 的过滤器是一种拦截器,用于在服务导出和引用过程中对请求和响应进行处理。Dubbo 的过滤器有多种,包括 AccessLogFilter 过滤器、ActiveLimitFilter 过滤器、EchoFilter 过滤器和GenericFilter 过滤器等。

18、Dubbo内置了哪几种服务容器?

  • Spring Container
  • Jetty Container
  • Log4j Container

19、Dubbo启动时如果依赖的服务不可用会怎样?

答:Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,默认 check=“true”,可以通过 check=“false” 关闭检查。

20、服务上线怎么兼容旧版本?

答:可以用版本号(version)过渡,多个不同版本的服务注册到注册中心,版本号不同的服务相互间不引用。这个和服务分组的概念有一点类似。

21、Dubbo可以对结果进行缓存吗?

答:可以,Dubbo 提供了声明式缓存,用于加速热门数据的访问速度,以减少用户加缓存的工作量。

22、Dubbo 的分组和版本是什么?如何使用?

答: Dubbo 的分组是用于将服务划分为不同的组别,方便进行管理和调用。Dubbo 的版本是用于区分不同版本的服务,方便进行版本控制。在使用 Dubbo 时,可以通过 @Service 注解的 group 属性和 version 属性来指定分组和版本。

23、Dubbo 的动态代理是什么?如何实现?

答: Dubbo 的动态代理是一种动态生成代理类的机制,用于实现客户端和服务端的通信。Dubbo 的动态代理主要通过 ProxyFactory 类和 ProxyFactoryBean 类来实现,使用时需要在服务接口上添加 @Service 注解,并在配置文件中指定 ProxyFactory 类和 ProxyFactoryBean 类。

24、Dubbo 用到哪些设计模式

答:Dubbo 框架在初始化和通信过程中使用了多种设计模式,可灵活控制类加载、权限控制等功能。

  • 工厂模式
    Provider 在 export 服务时,会调用 ServiceConfig 的 export 方法。ServiceConfig中有个字段:
private static final Protocol protocol =
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtensi
on();
  • 1
  • 2
  • 3
  • 装饰器模式
    Dubbo 在启动和调用阶段都大量使用了装饰器模式。以 Provider 提供的调用链为例,具体的调用链代码是在 ProtocolFilterWrapper 的buildInvokerChain 完成的,具体是将注解中含有 group=provider 的 Filter 实现 ,按照 order 排序 ,最后的调用顺序是:
EchoFilter -> ClassLoaderFilter -> GenericFilter -> ContextFilter 
->ExecuteLimitFilter -> TraceFilter -> TimeoutFilter -> MonitorFilter ->ExceptionFilter
  • 1
  • 2
  • 观察者模式
    Dubbo 的 Provider 启动时,需要与注册中心交互,先注册自己的服务,再 订阅自己的服务,订阅时,采用了观察者模式,开启一个 listener。注册中心会每 5 秒定时检查是否有服务更新,如果有更新,向该服务的提供者发送一个 notify 消息,
    provider 接受到 notify 消息后,即运行 NotifyListener 的 notify 方法,执行监听器方法。

  • 动态代理模式
    Dubbo 扩展 JDK SPI 的类 ExtensionLoader 的 Adaptive 实现是典型的动态代理实现。Dubbo 需要灵活地控制实现类,即在调用阶段动态地根据参数决定调用哪个实现类,所以采用先生成代理类的方法,能够做到灵活的调用。生成代理类的代码是 ExtensionLoader 的 createAdaptiveExtensionClassCode 方法 。代理类的主要逻辑是,获取 URL 参数中指定参数的值作为获取实 现类的 key。

25、Dubbo 如何优雅停机?

答:Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果使用kill -9 PID 等强制关闭指令,是不会执行优雅停机的,只有通过 kill PID 时,才会执行。

注:本文转载自blog.csdn.net的拾荒的小海螺的文章"https://blog.csdn.net/lishangke/article/details/136324234"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top