Java面试题经常会问Dubbo面试题,下面给大家总结了一份非常完整的Dubbo面试题及答案@mikechen
1.Dubbo是什么?
Dubbo是一个高性能、轻量级的 RPC框架,用于构建分布式应用程序。
2.Dubbo主要特点?
高性能:Dubbo采用了多种优化策略,包括连接池、异步IO等,提供了高性能的远程调用能力。
轻量级:Dubbo采用了简单的配置方式和轻量级的实现,使得它非常易于使用和部署。
可扩展性:Dubbo提供了多种扩展点,允许用户定制化自己的功能,并且可以轻松地扩展到更多的节点和服务器。
高可靠性:Dubbo提供了多种容错机制,如重试、失败自动切换等,以确保高可靠性的远程调用。
服务化:Dubbo提供了完整的服务化解决方案,包括服务注册和发现、服务治理等,帮助用户构建更高效、更灵活的分布式应用。
3.为什么需要Dubbo?
比如早期一个应用Java War包,将所有功能都打包,部署在一个单机服务器。
随着业务的快速发展,业务越来越多、子系统也越来越多时,比如:淘宝的交易系统、商品系统、用户系统、评价系统…上百个系统的出现。
这个时候,你会发现技术已经成了业务的瓶颈,急需把业务单独抽离出来,各自单独部署,应用系统一旦涉及到拆分部署,问题就来了。
急需一种高效的应用程序间的通讯手段来完成这种需求,这就会涉及到分布式远程调用。
所以RPC框架来了,比如:Dubbo为代表的分布式远程通信RPC框架。
4.Dubbo功能?
主要就是如下3个核心功能:网络通信框架、集群服务框架、以及服务注册。
1.Remoting网络通信框架
提供对多种NIO框架抽象封装,包括:同步转异步,以及请求响应模式的信息交换方式。
2. Cluster服务框架
提供基于接口方法的透明远程过程调用,包括:多协议支持、以及软负载均衡、失败容错、地址路由、动态配置等集群支持。
3.Registry服务注册
基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
5.Dubbo核心组件?
Dubbo主要包含如下几个核心组件:
Dubbo主要包含了:注册中心、服务提供、服务消费、以及服务容器、与Dubbo监控中心这5大Dubbo框架组件。
1.注册中心(registry)
在微服务时代,我们所有的服务都被劲量拆分成最小的粒度,原先所有的服务都在混在1个server里,现在就被按照功能或者对象拆分成N个服务模块。
这样做的好处是深度解耦,1个模块只负责自己的事情就好,能够实现快速的迭代更新,但是坏处就是服务的管理和控制变得异常的复杂和繁琐,人工维护难度变大。
所以,这个时候急需一个组件来管控所有的服务,注册中心就出现了。
常见的注册中心有:Zookeeper,Eureka,Consul,Etcd等,Dubbo这里就采用了Zookeeper为注册中心。
2.服务提供者(provider)
当我们需要为某个功能对外提供服务时我们可以暴露服务给使用者调用,那么这个服务就是服务提供者。
举个例子:淘宝的商品服务(SIC),提供了相关的淘宝商品的信息查询服务,那这个淘宝的商品服务(SIC)就是服务提供者。
一句话总结服务提供在:暴露服务的服务提供方,称之为”服务提供者”。
3.服务消费者(consumer)
调用远程服务的服务消费方,称之为”服务消费者”。
举个例子:比如我是淘宝的店铺团队,有一个需求需要调用商品信息,这个时候我就通过调用淘宝商品服务(SIC)提供的商品查询接口。
我就是服务消费者,而商品团队就是服务提供者。
4.容器(container)
服务容器负责启动,加载,运行服务提供者,dubbo服务运行,也就是让生产服务的进程一直启动。
5.监控(Monitor)
dubbo的使用其实只需要有注册中心,消费者,提供者这三个就可以使用了。
但是并不能看到有哪些消费者和提供者,为了更好的调试,发现问题,需要监控,这就是监控中心的作用。
因此Dubbo引入了监控中心,通过 dubbo-admin 可以对消费者和提供者进行管理,也可以在 dubbo 应用部署做动态的调整和服务的管理。
6.Dubbo的核心角色?
1)服务提供者(Server)
对外提供后台服务,将自己的服务信息,注册到注册中心
2)注册中心(Registry)
用于服务端注册远程服务以及客户端发现服务。
目前主要的注册中心可以借由 zookeeper,eureka,consul,etcd 等开源框架实现。
比如:阿里的Dubbo就是采用zookeeper实现注册中心。
3)服务消费者(Client)
从注册中心获取远程服务的注册信息,然后进行远程过程调用。
7.Dubbo的架构设计?
Dubbo架构图,如下所示:
图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口, 位于中轴线上的为双方都用到的接口。
Dubbo框架设计一共划分了10个层:
1. 服务接口层(Service)
该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。
2. 配置层(Config)
对外配置接口,以ServiceConfig和ReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类。
3.服务代理层(Proxy)
服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory。
4.服务注册层(Registry)
封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory、Registry和RegistryService。可能没有服务注册中心,此时服务提供方直接暴露服务。
5.集群层(Cluster)
封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster、Directory、Router和LoadBalance。将多个服务提供方组合为一个服务提供方,实现对服务消费方来透明,只需要与一个服务提供方进行交互。
6.监控层(Monitor)
RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory、Monitor和MonitorService。
7.远程调用层(Protocol)
封将RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter。Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。
8. 信息交换层(Exchange)
封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。
9.网络传输层(Transport)
抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec。
10.数据序列化层(Serialize)
可复用的一些工具,扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool。
8.Dubbo协议?
Dubbo内置了:dubbo协议 ,rmi协议,hessian协议,http协议等10种通讯协议。
Dubbo官网是推荐我们使用Dubbo协议,如果没有特别的需求,也建议使用Dubbo默认协议。
Dubbo协议格式,如下图所示:
Dubbo 数据包分为消息头和消息体,消息头用于存储一些元信息,比如魔数(Magic),数据包类型(Request/Response),消息体长度(Data Length)等。
9.Dubbo和Spring Cloud区别?
最大的区别:Dubbo底层是使用Netty这样的NIO框架,是基于TCP协议传输的,配合以Hession序列化完成RPC通信。
而SpringCloud是基于Http协议+Rest接口调用远程过程的通信,相对来说Http请求会有更大的报文,占的带宽也会更多。
但是REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约。
不存在代码级别的强依赖,这在强调快速演化的微服务环境下显得更为合适,至于注重通信速度还是方便灵活性,具体情况具体考虑。
10.Dubbo的容错机制是如何实现的?
Dubbo提供了多种容错机制,包括重试、失败自动切换、失败缓存、快速失败等。
11.Dubbo的负载均衡策略有哪些?
Dubbo提供了多种负载均衡策略,包括Random、RoundRobin、LeastActive等。
1)随机(Random)
随机选择一个可用的服务提供者进行请求调度,如下图所示:
2)轮询(Round Robin)
按照轮询的方式依次选择可用的服务提供者,如下图所示:
每个服务提供者的权重不考虑,按顺序依次选择。
3)最少活跃调用数(Least Active)
统计每个服务提供者的活跃调用数,选择活跃调用数最少的服务提供者进行请求调度。
如下图所示:
活跃调用数表示当前正在处理请求的数量。
12.Dubbo的服务治理功能有哪些?
Dubbo服务治理功能包括:服务降级、熔断、限流、路由等。
Dubbo提供了服务降级功能,当系统负载过高或服务提供方不可用时,可以通过降级策略返回默认值或执行备用逻辑,保证系统的可用性。
Dubbo提供了服务路由功能,可以根据条件对请求进行路由,开发者可以根据需要配置路由规则,将请求路由到不同的服务提供方。
13.Dubbo的扩展点有哪些?
Dubbo提供了多种扩展点,包括Protocol、Transporter、Serialization、Filter等。
14.Dubbo的SPI机制是什么?
Dubbo的SPI机制是一种通过配置文件扩展框架的机制,可以让开发者在不修改框架源码的情况下,自由扩展框架的功能。
15.Dubbo的异步调用是如何实现的?
Dubbo的异步调用是通过将调用请求放入队列中,然后立即返回Future对象,等待服务提供者的响应结果。
当服务提供者响应结果后,将结果存放到Future对象中,通过Future.get()方法获取结果。
16.Dubbo调用流程?
Dubbo调用流程,大致分为如下11步:
1.首先服务提供者会启动服务,然后将服务注册到服务注册中心。
2.服务消费者,会定时拉取服务提供者列表。
3.生成一个动态代理对象,然后通过这个代理对象,去调用远程接口。
4.生成代理对象之后,会走到Cluster层,这里会获取服务提供者列表的数据。
5.然后,Cluster会根据指定的算法做负载均衡,选出要调用的服务提供者。
6.选择好服务提供者之后,再选择指定的协议格式。
7.Exchange会根据指定的协议格式进行请求数据封装,封装成request请求。
8.请求封装好之后,就会通过网络通信框架,将请求发送出去。
9.服务提供者那边,同样会有网络通信框架,会监听指定的端口号,当接收到请求之后会将请求进行反序列化。
10.反序列化之后,再根据Exchange根据指定协议格式将请求解析出来。
11.最后再通过动态代理对象,调用服务提供者的对应接口。
以上就是Dubbo面试题及答案详解,更多Java面试题请查看:史上最全Java面试题及答案总结
陈睿mikechen
十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》