2022 Dubbo精选面试题50道

x33g5p2x  于2023-01-08 发布在 Java  
字(10.4k)|赞(0)|评价(0)|浏览(471)

1、 说说核心的配置有哪些?

配置配置说明
dubbo:service服务配置
dubbo:reference引用配置
dubbo:protocol协议配置
dubbo:application应用配置
dubbo:module模块配置
dubbo:registry注册中心配置
dubbo:monitor监控中心配置
dubbo:provider提供方配置
dubbo:consumer消费方配置
dubbo:method方法配置
dubbo:argument参数配置

2、 Dubbo集群提供了哪些负载均衡策略?

1、 Random LoadBalance: 随机选取提供者策略,有利于动态调整提供者权重。截面碰撞率高,调用次数越多,分布越均匀。

2、 RoundRobin LoadBalance: 轮循选取提供者策略,平均分布,但是存在请求累积的问题。

3、 LeastActive LoadBalance: 最少活跃调用策略,解决慢提供者接收更少的请求。

4、 ConstantHash LoadBalance: 一致性 Hash 策略,使相同参数请求总是发到同一提供者,一台机器宕机,可以基于虚拟节点,分摊至其他提供者,避免引起提供者的剧烈变动。

默认为 Random 随机调用。

3、 Dubbo 使用的是什么通信框架?

默认使用 NIO Netty 框架

4、 服务调用是阻塞的吗?

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

Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。

5、 dubbo 在安全机制方面如何解决的?

dubbo 通过 token 令牌防止用户绕过注册中心直连,然后在注册中心管理授权,dubbo 提供了黑白名单,控制服务所允许的调用方。

6、 Dubbo 超时时间怎样设置?

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

服务提供者端设置超时时间,在 Dubbo 的用户文档中,推荐如果能在服务端多配置就尽量多配置,因为服务提供者比消费者更清楚自己提供的服务特性。

服务消费者端设置超时时间,如果在消费者端设置了超时时间,以消费者端为主,即优先级更高。因为服务调用方设置超时时间控制性更灵活。如果消费方超时,服务端线程不会定制,会产生警告。

7、 Dubbo 的注册中心集群挂掉,者和订阅者之间还能通信么?

可以的,启动 dubbo 时,消费者会从 zookeeper 拉取注册的生产者的地址接口等数据,缓存在本地。

每次调用时,按照本地存储的地址进行调用。

8、 Dubbo telnet 命令能做什么?

dubbo 服务发布之后,我们可以利用 telnet 命令进行调试、管理。Dubbo2.0.5 以上版本服务提供端口支持 telnet 命令

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

别的还有 spring 的 spring cloud,facebook 的 thrift,twitter 的 finagle 等。冲上云霄,Dubbo Go!GO语言版本都发布了~推荐阅读:Spring Cloud是什么,和Dubbo对比呢?

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

如序列化问题。

11、 Dubbo支持服务多协议吗?

Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。

12、 PRC架构组件

一个基本的RPC架构里面应该至少包含以下4个组件:

1、 客户端(Client):服务调用方(服务消费者)

2、 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端

3、 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理4、服务端(Server):服务的真正提供者

  • 具体调用过程:

1、 服务消费者(client客户端)通过调用本地服务的方式调用需要消费的服务;

2、 客户端存根(client stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体;

3、 客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端;

4、 服务端存根(server stub)收到消息后进行解码(反序列化操作);

5、 服务端存根(server stub)根据解码结果调用本地的服务进行相关处理;

6、 本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub);

7、 服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方;

8、 客户端存根(client stub)接收到消息,并进行解码(反序列化);

9、 服务消费方得到最终结果;

而RPC框架的实现目标则是将上面的第2-10步完好地封装起来,也就是把调用、编码/解码的过程给封装起来,让用户感觉上像调用本地服务一样的调用远程服务。

13、 dubbo 通信协议 dubbo 协议为什么采用异步单一长连接

因为服务的现状大都是服务提供者少,通常只有几台机器,而服务的消费者多,可能整个网站都在访问该服务,比如 Morgan 的提供者只有 6 台提供者,却有上百台消费者,每天有 1.5 亿次调用,如果采用常规的 hessian 服务,服务提供者很容易就被压跨,通过单一连接,保证单一消费者不会压死提供者,长连接,减少连接握手验证等,并使用异步 IO,复用线程池,防止 C10K 问题。

14、 Dubbo 服务注册与发现的流程?

流程说明:

1、 Provider(提供者)绑定指定端口并启动服务

2、 指供者连接注册中心,并发本机 IP、端口、应用信息和提供服务信息发送至注册中心存储

3、 Consumer(消费者),连接注册中心 ,并发送应用信息、所求服务信息至注册中心

4、 注册中心根据 消费 者所求服务信息匹配对应的提供者列表发送至Consumer 应用缓存。

5、 Consumer 在发起远程调用时基于缓存的消费者列表择其一发起调用。

6、 Provider 状态变更会实时通知注册中心、在由注册中心实时推送至Consumer

设计的原因:

1、 Consumer 与 Provider 解偶,双方都可以横向增减节点数。

2、 注册中心对本身可做对等集群,可动态增减节点,并且任意一台宕掉后,将自动切换到另一台

3、 去中心化,双方不直接依懒注册中心,即使注册中心全部宕机短时间内也不会影响服务的调用

4、 服务提供者无状态,任意一台宕掉后,不影响使用

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

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

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

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

17、 Dubbo 和 Spring Cloud 有什么哪些区别?

Dubbo 底层是使用 Netty 这样的 NIO 框架,是基于 TCP 协议传输的,配合以 Hession 序列化完成 RPC 通信。

Spring Cloud 是基于 Http 协议 Rest 接口调用远程过程的通信,相对来说 Http 请求会有更大的报文,占的带宽也会更多。但是 REST 相比 RPC 更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更为合适,至于注重通信速度还是方便灵活性,具体情况具体考虑。

18、 为什么要有RPC

1、 http接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的http协议进行传输。但是如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。第三个来说就是安全性。最后就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑。

2、 socket只是一个简单的网络通信方式,只是创建通信双方的通信通道,而要实现rpc的功能,还需要对其进行封装,以实现更多的功能。

3、 RPC一般配合netty框架、spring自定义注解来编写轻量级框架,其实netty内部是封装了socket的,较新的jdk的IO一般是NIO,即非阻塞IO,在高并发网站中,RPC的优势会很明显

19、 dubbo 通信协议 dubbo 协议适用范围和适用场景

适用范围:传入传出参数数据包较小(建议小于 100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。

适用场景:常规远程服务方法调用

dubbo 协议补充:

连接个数:单连接

连接方式:长连接

传输协议:TCP

传输方式:NIO 异步传输

序列化:Hessian 二进制序列化

20、 Dubbo 核心组件有哪些?

1、 Provider:暴露服务的服务提供方

2、 Consumer:调用远程服务消费方

3、 Registry:服务注册与发现注册中心

4、 Monitor:监控中心和访问调用统计

5、 Container:服务运行容器

21、 Dubbo SPI 和 Java SPI 区别?

JDK SPI:

JDK 标准的 SPI 会一次性加载所有的扩展实现,如果有的扩展很耗时,但也没用上,很浪费资源。所以只希望加载某个的实现,就不现实了

DUBBO SPI:

1、 对 Dubbo 进行扩展,不需要改动 Dubbo 的源码

2、 延迟加载,可以一次只加载自己想要加载的扩展实现。

3、 增加了对扩展点 IOC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。

4、 Dubbo 的扩展机制能很好的支持第三方 IoC 容器,默认支持 Spring Bean。

22、 Dubbo 是什么?

Dubbo 是一个分布式、高性能、透明化的 RPC 服务框架,提供服务自动注册、自动发现等高效服务治理方案, 可以和Spring 框架无缝集成

23、 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 协议

24、 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

25、 Dubbo 集群的负载均衡有哪些策略?

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

1、 Random LoadBalance: 随机选取提供者策略,有利于动态调整提供者权重。截面碰撞率高,调用次数越多,分布越均匀;

2、 RoundRobin LoadBalance: 轮循选取提供者策略,平均分布,但是存在请求累积的问题;

3、 LeastActive LoadBalance: 最少活跃调用策略,解决慢提供者接收更少的请求;

4、 ConstantHash LoadBalance: 一致性 Hash 策略,使相同参数请求总是发到同一提供者,一台机器宕机,可以基于虚拟节点,分摊至其他提供者,避免引起提供者的剧烈变动;

26、 Dubbo 有哪些注册中心?

1、 Multicast 注册中心:Multicast 注册中心不需要任何中心节点,只要广播地址,就能进行服务注册和发现,基于网络中组播传输实现。

2、 Zookeeper 注册中心:基于分布式协调系统 Zookeeper 实现,采用 Zookeeper 的 watch 机制实现数据变更。

3、 Redis 注册中心:基于 Redis 实现,采用 key/map 存储,key 存储服务名和类型,map 中 key 存储服务 url,value 服务过期时间。基于 Redis 的发布/订阅模式通知数据变更。

4、 Simple 注册中心。

27、 Dubbo 的使用场景有哪些?

1、 透明化的远程方法调用:就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。

2、 软负载均衡及容错机制:可在内网替代 F5 等硬件负载均衡器,降低成本,减少单点。

3、 服务自动注册与发现:不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

28、 Dubbo必须依赖的包有哪些?

Dubbo 必须依赖 JDK,其他为可选。

29、 RPC使用了哪些关键技术,建立通信

首先要解决通讯的问题:即A机器想要调用B机器,首先得建立起通信连接。

主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。

通常这个连接可以是按需连接(需要调用的时候就先建立连接,调用结束后就立马断掉),也可以是长连接(客户端和服务器建立起连接之后保持长期持有,不管此时有无数据包的发送,可以配合心跳检测机制定期检测建立的连接是否存活有效),多个远程过程调用共享同一个连接。

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

采用多版本开发,不影响旧版本。在配置中添加version来作为版本区分

31、 RPC使用了哪些关键技术,从调用者的角度看:

服务的调用者启动的时候根据自己订阅的服务向服务注册中心查找服务提供者的地址等信息;

当服务调用者消费的服务上线或者下线的时候,注册中心会告知该服务的调用者;

服务调用者下线的时候,则取消订阅。

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

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

33、 Dubbo 配置文件是如何加载到 Spring 中的?

Spring 容器在启动的时候,会读取到 Spring 默认的一些 schema 以及 Dubbo 自定义的 schema,每个 schema 都会对应一个自己的 NamespaceHandler,NamespaceHandler 里面通过 BeanDefinitionParser 来解析配置信息并转化为需要加载的 bean 对象!

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

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

35、 Dubbo 在安全机制方面是如何解决?

Dubbo 通过 Token 令牌防止用户绕过注册中心直连,然后在注册中心上管理授权。Dubbo 还提供服务黑白名单,来控制服务所允许的调用方。

36、 RPC框架需要解决的问题?

1、 如何确定客户端和服务端之间的通信协议?

2、 如何更高效地进行网络通信?

3、 服务端提供的服务如何暴露给客户端?

4、 客户端如何发现这些暴露的服务?

5、 如何更高效地对请求对象和响应结果进行序列化和反序列化操作?

37、 dubbo 通信协议 dubbo 协议为什么不能传大包;

因 dubbo 协议采用单一长连接,如果每次请求的数据包大小为 500KByte,假设网络为千兆网卡(1024Mbit=128MByte),每条连接最大 7MByte(不同的环境可能不一样,供参考),单个服务提供者的 TPS(每秒处理事务数)最大为:128MByte / 500KByte = 262。

单个消费者调用单个服务提供者的 TPS(每秒处理事务数)最大为:7MByte / 500KByte = 14。

如果能接受,可以考虑使用,否则网络将成为瓶颈。

38、 一般使用什么注册中心?还有别的选择吗?

推荐使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐。

39、 Dubbo 在安全机制方面是如何解决的

Dubbo 通过 Token 令牌防止用户绕过注册中心直连,然后在注册中心上管理授权。Dubbo 还提供服务黑白名单,来控制服务所允许的调用方。

40、 Dubbo有哪几种集群容错方案,默认是哪种?

1、 Failover Cluster 失败自动切换,自动重试其他服务器(默认)

2、 Failfast Cluster 快速失败,立即报错,只发起一次调用

3、 Failsafe Cluster 失败安全,出现异常时,直接忽略

4、 Failback Cluster 失败自动回复,记录失败请求,定时请求

5、 Forking Cluster 并行调用多个服务器,只要一个成功即返回

6、 Broadcast Cluster 广播逐个调用所有提供者,任意一个报错则报错

41、 Dubbo 如何优雅停机?

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

42、 RPC使用了哪些关键技术,从服务提供者的角度看:

当服务提供者启动的时候,需要将自己提供的服务注册到指定的注册中心,以便服务消费者能够通过服务注册中心进行查找;

当服务提供者由于各种原因致使提供的服务停止时,需要向注册中心注销停止的服务;

服务的提供者需要定期向服务注册中心发送心跳检测,服务注册中心如果一段时间未收到来自服务提供者的心跳后,认为该服务提供者已经停止服务,则将该服务从注册中心上去掉。

43、 注册了多个同一样的服务,如果测试指定的某一个服务呢?

可以配置环境点对点直连,绕过注册中心,将以服务接口为单位,忽略注册中心的提供者列表。

44、 dubbo 推荐用什么协议?

默认使用 dubbo 协议

45、 Dubbo 核心功能有哪些?

1、 Remoting:网络通信框架,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。

2、 Cluster:服务框架,提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

3、 Registry:服务注册,基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

46、 Dubbo 的主要应用场景?

1、 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何 API 侵入。

2、 软负载均衡及容错机制,可在内网替代 F5 等硬件负载均衡器,降低成本,减少单点。

3、 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的 IP 地址,并且能够平滑添加或删除服务提供者。

Dubbo 的主要应用场景?

Dubbo 的核心功能?

主要就是如下 3 个核心功能:

1、 Remoting:网络通信框架,提供对多种 NIO 框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。

2、 Cluster:服务框架,提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

3、 Registry:服务注册,基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

47、 Dubbo服务之间的调用是阻塞的吗?

默认是同步等待结果阻塞的,支持异步调用,Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。

48、 dubbo 服务集群配置(集群容错模式)

在集群调用失败时, Dubbo 提供了多种容错方案,缺省为 failover 重试。可以自行扩展集群容错策略

l Failover Cluster(默认)

失败自动切换,当出现失败,重试其它服务器。(缺省)通常用于读操作,

但重试会带来更长延迟。可通过 retries="2"来设置重试次数(不含第一次)。

<dubbo:service retries="2" cluster="failover"/>或:<dubbo:reference retries="2" cluster="failover"/>cluster="failover"可以不用写,因为默认就是 failover

Failfast Cluster

快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,

比如新增记录。

dubbo:service cluster="failfast" />

或:

<dubbo:reference cluster="failfast" />

cluster="failfast"和 把 cluster="failover"、 retries="0"是一样的效果,retries="0"就是不重

Failsafe Cluster失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

<dubbo:service cluster="failsafe" />

或:

<dubbo:reference cluster="failsafe" />

Failback Cluster

失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

<dubbo:service cluster="failback" />

或:

<dubbo:reference cluster="failback" />

Forking Cluster并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读

操作,但需要浪费更多服务资源。可通过 forks="2"来设置最大并行数。

<dubbo:service cluster=“forking" forks="2"/>

或:

<dubbo:reference cluster=“forking" forks="2"/>

49、 Dubbo 默认采用注册中心?

采用 Zookeeper

50、 Dubbo 支持服务降级吗?

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

相关文章

微信公众号

最新文章

更多

目录