本文
前往“校招VIP”小程序,访问更方便

【校招VIP】手撸架构,Dubbo面试49问

csdn 10月18日

转载声明:文章来源:https://blog.csdn.net/wuzhiwei549/article/details/122540158

Dubbo是什么?
Dubo是阿里巴巴开源的基于Java的高性能RPC分布式服务框架,现已成为 Apache基金会孵化项目。官网:http://dubbo.apacheorg

为什么要用 Dubbo?
因为是阿里开源项目,国内很多互联网公司都在用,已经经过很多线上考验。内部使用了 Netty、Zookeeper,保证了高性能高可用性。
使用 Dubbo可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场需求。

下面这张图可以很清楚的诠释,最重要的一点是,分布式架构可以承受更大规模的并发流量

下⾯是 Dubbo 的服务治理图

Dubbo 的架构设计

Dubbo 框架设计一共划分了 10 个层:
1、服务接口层(Service):该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。
2、配置层(Config):对外配置接口,以 ServiceConfig 和 ReferenceConfig 为中心。
3、服务代理层(Proxy):服务接口透明代理,生成服务的客户端 Stub和服务器端 Skeleton。
4、服务注册层(Registry):封装服务地址的注册与发现,以服务 URL为中心。
5、集群层(Cluster):封装多个提供者的路由及负载均衡,并桥接注册中心,以 Invoker 为中心。
6、监控层(Monitor):RPC 调用次数和调用时间监控。
7、远程调用层(Protocol):封将 RPC 调用,以 Invocation 和 Result为中心,扩展接口为 Protocol、Invoker 和 Exporter。
8、信息交换层(Exchange):封装请求响应模式,同步转异步,以Request 和 Response 为中心。
9、网络传输层(Transport):抽象 mina 和 netty 为统一接口,以Message 为中心。

Dubbo 和 Spring Cloud 区别

通信方式不同
1、Dubo使用的是RPC通信,而 Spring cloud使用的是 Http Resteu方式。
2、Dubbo由于是二进制的传输,占用带宽会更少(基于netty等),springCloud是http协议传输,带宽会比较多,同时使用htt协议(http+restfulapi一般会使用JsON报文,消耗会更大)
3、dubo的开发难度较大,原因是 dubbo的jar包依赖(存在代码级别的强依赖)问题很多大型工程无法解决,springcloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级
4、dubo的改进是通过 dubbofilter,很多东西没有,需要自己继承,如监控,如日志,如限流,如追踪,springcloud具有配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性 token、全局锁、选主、分布式会话和集群状态等,满足了构建微服务所需的所有解决方案。

组成部分不同

Dubbo都支持什么协议,推荐用哪种?

   · dubo://(推荐)
适用范围:传入传出参数数据包较小(建议小于 100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。
适用场景:常规远程服务方法调用
dubbo 协议补充:
连接个数:单连接
连接方式:长连接
传输协议:TCP
传输方式:NIO 异步传输
序列化:Hessian 二进制序列化

  · rmi: //
采用 JDK 标准的 java.rmi.*实现,采用阻塞式短连接和 JDK 标准序列化方式,Java 标准的远程调用协议。
连接个数:多连接
连接方式:短连接
传输协议:TCP
传输方式:同步传输
序列化:Java 标准二进制序列化
适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件
适用场景:常规远程服务方法调用,与原生 RMI 服务互操作

hessian: //
Hessian 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现基于 Hessian 的远程调用协议。
连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:Hessian 二进制序列化
适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。
适用场景:页面传输,文件传输,或与原生 hessian 服务互操作

http://
采用 Spring 的 HttpInvoker 实现基于 http 表单的远程调用协议。
连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:表单序列化(JSON)
适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或 URL 传入参数,暂不支持传文件。
适用场景:需同时给应用程序和浏览器 JS 使用的服务。

webservice://
基于 CXF 的 frontend-simple 和 transports-http 实现,基于 WebService 的远程调用协议。
连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:SOAP 文本序列化
适用场景:系统集成,跨语言调用。

thrift: //
Thrift 是 Facebook 捐给 Apache 的一个 RPC 框架,当前 dubbo 支持的 thrift协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等

memcached : //
基于 memcached 实现的 RPC 协议

redis: //
基于 redis 实现的 RPC 协议

rest: //

Dubbo需要Web容器吗?
不需要,如果硬要用web容器,只会增加复杂性,也浪费资源

Dubbo内置了哪几种服务容器?
  · Spring Container
  · Jetty container
  · Log 4j Container
Dubbo的服务容器只是一个简单的Main方法,并加载一个简单的 Spring容器,用于暴露服务。

Dubbo里面有哪几种节点角色
   · Provider:暴露服务的服务提供方。
   · Consumer:调用远程服务的服务消费方。
   · Registry:服务注册与发现的注册中心。 hunting2
   · Monitor:统计服务的调用次调和调用时间的监控中心
   · Container:服务运行容器

服务注册与发现的流程图

Dubbo默认使用什么注册中心,还有别的选择吗?
推荐使用 Zookeeper作为注册中心,还有 Redis、 Multicast、 Simple注册中心,但不推荐。
Redis方案需要服务器时间同步,且性能消耗过大

Dubbo有哪几种配置方式?
1、Spring配置方式
2、Java ap|配置方式

Dubbo核心的配置有哪些?

配置关系如下:

在 Provider上可以配置的 Consumer端的属性有哪些?
1、timeout:方法调用超时
2、retries:失败重试次数,默认重试2次
3、loadbalance:负载均衡算法,默认随机
4、actives消费者端,最大并发调用限制

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

Dubbo推荐使用什么序列化框架,你知道的还有哪些?
推荐使用 Hessian序列化,还有 Duddo、 FastJjson、Java自带序列化。

Dubbo默认使用的是什么通信框架,还有别的选择吗?
Dubo默认使用Netty框架,也是推荐的选择,另外内容还集成有Mina、 Grizzly

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

Dubbo有哪几种负载均衡策略,默认是哪种?

注册了多个同一样的服务,如果测试指定的某一个服务呢?
可以配置环境点对点直连,绕过注册中心,将以服务接口为单位,忽略注册中心的提供者列表

Dubbo 连接注册中心和直连的区别
在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表,服务注册中心,动态的注册和发现服务,使服务的位置透明,并通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover, 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外,注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者。
注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表。
注册中心和监控中心都是可选的,服务消费者可以直连服务提供者。

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

当一个服务接口有多种实现时怎么做?
当一个接口有多种实现时,可以用 group属性来分组,服务提供方和消费方都指定同一个 group即可。

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

Dubbo可以对结果进行缓存吗?
可以, Dubbo提供了声明式缓存,用于加速热门数据的访问速度,以减少用户加缓存的工作量。

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

Dubbo支持分布式事务吗?
目前暂时不支持,后续可能采用基于JTA/XA规范实现,或者TCC等方式、

Dubbo telnet命令能做什么?
dubo通过 telnet命令来进行服务治理

telnet local host 8090

Dubbo支持服务降级吗?
Dubbo2.2.0以上版本支持。

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

服务提供者能实现失效踢出是什么原理?
服务失效踢岀基于 Zookeeper的临时节点原理。(服务机器会在k上注册一个临时节点,服务失效则临时节点被删除)

如何解决服务调用链过长的问题?
Dubo可以使用 Pinpoint和 Apache Skywalking( Incubator)实现分布式服务追踪,当然还有其他很多方案。

服务读写推荐的容错策略是怎样的?
读操作建议使用 Failove失败自动切换,默认重试两次其他服务器。写操作建议使用 Failfast快速失败,发一次调用失败就立即报错。

Dubbo必须依赖的包有哪些?
Dubbo必须依赖JDK,其他为可选。

Dubbo的管理控制台能做什么?
管理控制台主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能

说说 Dubbo服务暴露的过程。
Dubbo会在 Spring实例化完bean之后,在刷新容器最后一步发布 Context RefreshEvent事件的时候,通知实现了ApplicationListener的 ServiceBean类进行回调 onApplication Event事件方法,Dubbo会在这个方法中调用 ServiceBean父类 ServiceConfig的 export方法,而该方法真正实现了服务的(异步或者非异步)发布。

Dubbo停止维护了吗?
2014年开始停止维护过几年,17年开始重新维护,并进入了 Apache项目

Dubbo和 Dubbox有什么区别?
Dubbox是继 Dubbo停止维护后,当当网基于Dubo做的一个扩展项目,如加了服务可 Restful调用,更新了开源组件等。

你还了解别的分布式框架吗?
别的还有 Spring cloud、 Facebook的 Thrift、 Twitter的 Finagle等。

Dubbo能集成 Spring Boot吗?
可以的

在使用过程中都遇到了些什么问题?
单一长连接和NIO异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。 Dubbo的设计目的是为了满足高并发小数据量的rpc调用,在大数据量下的性能表现并不好,建议使用rmi或http协议

Dubbo 通信协议 为什么要消费者比提供者个数多
因 dubbo 协议采用单一长连接,假设网络为千兆网卡(1024Mbit=128MByte),根据测试经验数据每条连接最多只能压满 7MByte(不同的环境可能不一样,供参考),理论上 1 个服务提供者需要 20个服务消费者才能压满网卡。

Dubbo 通信协议 dubbo 协议为什么不能传大包
因 dubbo 协议采用单一长连接,如果每次请求的数据包大小为 500KByte,假设网络为千兆网卡(1024Mbit=128MByte),每条连接最大 7MByte(不同的环境可能不一样,供参考),
单个服务提供者的 TPS(每秒处理事务数)最大为:128MByte / 500KByte = 262。
单个消费者调用单个服务提供者的 TPS(每秒处理事务数)最大为:7MByte / 500KByte = 14。
如果能接受,可以考虑使用,否则网络将成为瓶颈。
你读过 Dubbo的源码吗?

你觉得用 Dubbo好还是 Spring Cloud好?
扩展性的问题,没有好坏,只有适合不适合,不过我好像更倾向于使用Dubbo, Spring Cloud版本升级太快,组件更新替换太频繁,配置太繁琐.... (公司需要什么架构就夸什么)

注册中心挂了,消费者还能调用服务者吗?
注册中心对等集群,任意一台宕掉后,会自动切换到另一台
注册中心全部宕掉,服务提供者和消费者仍可以通过本地缓存通讯
服务提供者无状态,任一台宕机后,不影响使用
服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复

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

暂无回复