Dubbo:常见的面试题和答案

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

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();
  • 装饰器模式
    Dubbo 在启动和调用阶段都大量使用了装饰器模式。以 Provider 提供的调用链为例,具体的调用链代码是在 ProtocolFilterWrapper 的buildInvokerChain 完成的,具体是将注解中含有 group=provider 的 Filter 实现 ,按照 order 排序 ,最后的调用顺序是:
EchoFilter -> ClassLoaderFilter -> GenericFilter -> ContextFilter 
->ExecuteLimitFilter -> TraceFilter -> TimeoutFilter -> MonitorFilter ->ExceptionFilter
  • 观察者模式
    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 时,才会执行。

  • 25
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,关于springcloudalibaba面试题答案,以下是一些常见的问题及其答案: 1. 什么是Spring Cloud Alibaba? Spring Cloud Alibaba是一个基于Spring Cloud的开源框架,它提供了一系列的微服务组件,包括服务注册与发现、配置中心、消息总线、分布式事务等。 2. Spring Cloud Alibaba和Spring Cloud有什么区别? Spring Cloud Alibaba是在Spring Cloud的基础上进行扩展的,它提供了一些Spring Cloud没有的组件,比如阿里巴巴的Nacos服务注册中心、阿里巴巴的Sentinel流量控制组件等。 3. 什么是Nacos? Nacos是一个开源的服务注册中心和配置中心,它提供了服务注册、发现、配置管理、DNS服务等功能。 4. 什么是Sentinel? Sentinel是一个开源的流量控制组件,它可以对微服务进行流量控制、熔断降级、系统负载保护等操作。 5. 什么是DubboDubbo是一个高性能的Java RPC框架,它可以实现远程方法调用、负载均衡、服务治理等功能。 6. Spring Cloud Alibaba和Dubbo有什么区别? Spring Cloud Alibaba和Dubbo都是阿里巴巴开源的微服务框架,但是它们的设计思路不同。Spring Cloud Alibaba是基于Spring Cloud的,它更加注重微服务的整体架构和生态系统;而Dubbo则更加注重RPC框架本身的性能和功能。 7. 什么是Seata? Seata是一个开源的分布式事务解决方案,它可以实现分布式事务的一致性和隔离性。 8. Spring Cloud Alibaba中如何使用Seata? 在Spring Cloud Alibaba中,可以通过引入Seata的starter来使用Seata。同时,还需要在业务代码中使用Seata提供的注解来标记分布式事务的边界。 9. 什么是RocketMQ? RocketMQ是一个开源的分布式消息队列,它可以实现高可靠、高吞吐量的消息传递。 10. Spring Cloud Alibaba中如何使用RocketMQ? 在Spring Cloud Alibaba中,可以通过引入RocketMQ的starter来使用RocketMQ。同时,还需要在业务代码中使用RocketMQ提供的注解来发送和接收消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾荒的小海螺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值