dubbo面试题

本文深入解析了Alibaba开源的分布式服务框架Dubbo的核心概念、配置选项及其实现原理。介绍了Dubbo的服务模型、通信框架、序列化机制以及集群容错策略等内容。同时,还探讨了Dubbo在实际应用中可能遇到的问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。

从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,

所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。关于注册中心、协议支持、服务监控等内容,详见后面描述。

Dubbo面试题精集

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

默认也推荐使用netty框架,还有mina。

服务调用是阻塞的吗?

默认是阻塞的,可以异步调用,没有返回值的可以这么做。

默认使用什么序列化框架,你知道的还有哪些?

默认使用Hessian序列化,还有Duddo、FastJson、Java自带序列化。

在java的序列化里面也是介绍rpc框架时候,在远程调用中,需要把参数和返回值通过网络传输,这个使用就要用到序列化将对象转变成字节流,从一端到另一端之后再反序列化回来变成对象。作用了说了,今天在看文章的时候发现别人贴出效率对比,hessian比java的序列化高出很多。特意补充下相关知识点。

百科:Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。

hessian序列化

对象序列化的过程为:

         先将对象转为字节码或其它,然后再将其还原为对象

hessian序列化比Java序列化高效很多,而且生成的字节流也要短很多。

 

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

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

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

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

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

可以结合zipkin实现分布式服务追踪。

说说核心的配置有哪些?

核心配置有

dubbo:service/

dubbo:reference/

dubbo:protocol/

dubbo:registry/

dubbo:application/

dubbo:provider/

dubbo:consumer/

dubbo:method/

dubbo推荐用什么协议?

默认使用dubbo协议。

同一个服务多个注册的情况下可以直连某一个服务吗?

可以直连,修改配置即可,也可以通过telnet直接某个服务。

画一画服务注册与发现的流程图

流程图见dubbo.io。

Dubbo集群容错怎么做?

读操作建议使用Failover失败自动切换,默认重试两次其他服务器。写操作建议使用Failfast快速失败,发一次调用失败就立即报错。

在使用过程中都遇到了些什么问题?

使用过程中的问题可以百度

dubbo和dubbox之间的区别?

dubbox是当当网基于dubbo上做了一些扩展,如加了服务可restful调用,更新了开源组件等。

你还了解别的分布式框架吗?

别的还有spring的spring cloud,facebook的thrift,twitter的finagle等。 

1.Dubbo支持哪些协议,每种协议的应用场景,优缺点?

  • dubbo: 单一长连接和NIO异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议TCP,异步,Hessian序列化;
  • rmi: 采用JDK标准的rmi协议实现,传输参数和返回参数对象需要实现Serializable接口,使用java标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议TCP。 多个短连接,TCP协议传输,同步传输,适用常规的远程服务调用和rmi互操作。在依赖低版本的Common-Collections包,java序列化存在安全漏洞;
  • webservice: 基于WebService的远程调用协议,集成CXF实现,提供和原生WebService的互操作。多个短连接,基于HTTP传输,同步传输,适用系统集成和跨语言调用;
  • http: 基于Http表单提交的远程调用协议,使用Spring的HttpInvoke实现。多个短连接,传输协议HTTP,传入参数大小混合,提供者个数多于消费者,需要给应用程序和浏览器JS调用;
  • hessian: 集成Hessian服务,基于HTTP通讯,采用Servlet暴露服务,Dubbo内嵌Jetty作为服务器时默认实现,提供与Hession服务互操作。多个短连接,同步HTTP传输,Hessian序列化,传入参数较大,提供者大于消费者,提供者压力较大,可传文件;
  • memcache: 基于memcached实现的RPC协议
  • redis: 基于redis实现的RPC协议

2.Dubbo超时时间怎样设置?

 Dubbo超时时间设置有两种方式:

  • 服务提供者端设置超时时间,在Dubbo的用户文档中,推荐如果能在服务端多配置就尽量多配置,因为服务提供者比消费者更清楚自己提供的服务特性。
  • 服务消费者端设置超时时间,如果在消费者端设置了超时时间,以消费者端为主,即优先级更高。因为服务调用方设置超时时间控制性更灵活。如果消费方超时,服务端线程不会定制,会产生警告。

3.Dubbo有些哪些注册中心?

  • Multicast注册中心: Multicast注册中心不需要任何中心节点,只要广播地址,就能进行服务注册和发现。基于网络中组播传输实现;
  • Zookeeper注册中心: 基于分布式协调系统Zookeeper实现,采用Zookeeper的watch机制实现数据变更;
  • redis注册中心: 基于redis实现,采用key/Map存储,住key存储服务名和类型,Map中key存储服务URL,value服务过期时间。基于redis的发布/订阅模式通知数据变更;
  • Simple注册中心

4.Dubbo集群的负载均衡有哪些策略  

 Dubbo提供了常见的集群策略实现,并预扩展点予以自行实现。

  • 负载均衡策略有( 随机、轮循、最少活跃调用数、一致性Hash)

    Random LoadBalance

    随机,按权重设置随机概率。

    在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

    RoundRobin LoadBalance

    轮循,默认,按公约后的权重设置轮循比率。

    存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

    LeastActive LoadBalance

    最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。

    使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

    ConsistentHash LoadBalance

    一致性 Hash,相同参数的请求总是发到同一提供者。

    当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

5.Dubbo监控中心搭建

 自行搭建

### Dubbo 常见面试题及答案解析 #### 1. Dubbo 的核心组件有哪些? Dubbo 的核心组件包括注册中心、服务提供者、服务消费者、监控中心等。其中,注册中心用于管理服务的地址信息,服务提供者负责实现业务逻辑并注册到注册中心,服务消费者从注册中心获取服务地址并进行远程调用,监控中心用于收集服务调用的统计数据[^1]。 #### 2. Dubbo 的通信协议有哪些?默认使用哪种协议? Dubbo 支持多种通信协议,包括 Dubbo 协议、HTTP 协议、RMI 协议等。默认使用 Dubbo 协议,该协议基于 TCP 长连接,具有高效、低延迟的特点[^4]。 #### 3. Dubbo 的序列化方式有哪些?各自的特点是什么? Dubbo 支持多种序列化方式,包括 Hessian、FastJSON、Protobuf 等。Hessian 是一种二进制序列化方式,性能较好但兼容性较差;FastJSON 是一种 JSON 格式的序列化方式,兼容性强但性能略逊于 Hessian;Protobuf 是一种高效的二进制序列化方式,适合对性能要求较高的场景[^4]。 #### 4. Dubbo 的负载均衡策略有哪些?默认使用哪种策略? Dubbo 提供了多种负载均衡策略,包括随机策略(Random LoadBalance)、轮询策略(RoundRobin LoadBalance)、最少活跃调用策略(LeastActive LoadBalance)、一致性哈希策略(ConstantHash LoadBalance)等。默认使用随机策略,该策略通过动态调整权重来实现负载均衡[^4]。 #### 5. Dubbo 的集群容错方案有哪些? Dubbo 提供了多种集群容错方案,包括: - **Failover Cluster**:失败自动切换,重试其他提供者。 - **Failfast Cluster**:快速失败,只尝试一次调用,适合幂等操作。 - **Failsafe Cluster**:失败安全,出现异常时直接忽略。 - **Failback Cluster**:失败后重试,通常用于消息通知场景。 #### 6. 如何在 Dubbo 中实现服务降级和失败重试? 服务降级可以通过配置 `dubbo:service` 或 `dubbo:reference` 的 `retries` 属性来实现失败重试,通过设置 `mock` 属性来实现服务降级。例如,当服务不可用时,可以返回一个默认值或空结果[^5]。 ```xml <dubbo:service interface="com.example.DemoService" ref="demoServiceImpl" retries="3" mock="true" /> ``` #### 7. Dubbo 的 Telnet 命令如何用于服务治理? Dubbo 提供了丰富的 Telnet 命令用于服务治理,例如 `invoke` 用于调用服务方法,`dump` 用于查看服务的状态信息,`count` 用于统计服务调用次数等[^3]。 ```bash telnet localhost 20880 invoke com.example.DemoService.sayHello("world") ``` #### 8. Dubbo 的 SPI 机制是如何工作的? Dubbo 使用 SPI(Service Provider Interface)机制实现扩展点的加载和管理。通过定义接口并在 `META-INF/dubbo` 目录下声明实现类,Dubbo 可以动态加载不同的扩展实现。例如,负载均衡策略、序列化方式等都可以通过 SPI 机制进行扩展[^4]。 #### 9. Dubbo 的服务注册与发现机制是怎样的? 服务提供者在启动时会将自己的服务地址注册到注册中心(如 Zookeeper)。服务消费者在调用服务时,会从注册中心获取提供者的地址列表,并缓存该列表以减少对注册中心的频繁访问[^5]。 #### 10. Dubbo 的未来发展方向是什么? Dubbo 的未来发展方向包括支持更多的编程语言、优化性能、增强安全性、改进分布式事务支持等。此外,Dubbo 还将加强与云原生技术的融合,支持 Kubernetes、Istio 等生态。 ### 示例代码 以下是一个简单的 Dubbo 配置示例: ```xml <dubbo:application name="demo-provider" /> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <dubbo:protocol name="dubbo" port="20880" /> <dubbo:service interface="com.example.DemoService" ref="demoServiceImpl" /> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿甘带你学java

感谢支持

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

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

打赏作者

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

抵扣说明:

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

余额充值