Dubbo面试

DUBBO原理、应用与面经总结

SPI

你是否了解SPI,讲一讲什么是SPI,为什么要使用SPI?

SPI具体约定:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入(从使用层面来说,就是运行时,动态给接口添加实现类)。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定(不需要在代码里写死)。

这样做的好处:java设计出SPI目的是为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。这样程序运行的时候,该机制就会为某个接口寻找服务的实现,有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。例如,JDBC驱动,可以加载MySQL、Oracle、或者SQL Server等,目前有不少框架用它来做服务的扩张发现。

回答这个问题可以延伸一下和API的对比,API是将方法封装起来给调用者使用的,SPI是给扩展者使用的。

Dubbo的SPI和JDK的SPI有区别吗?有的话,究竟有什么区别?

Dubbo 的扩展点加载是基于JDK 标准的 SPI 扩展点发现机制增强而来的,Dubbo 改进了 JDK 标准的 SPI 的以下问题:

  • JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源。
  • 增加了对扩展点 IoC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。

Dubbo的IOC是怎么实现的,和Spring有什么差别?

Dubbo的AOP是怎么实现的,和Spring有什么差别?

Dubbo原理

有没有考虑过自己实现一个类似dubbo的RPC框架,如果有,请问你会如果着手实现?

可从两个方面去入手,考虑接口扩展性,改造JDK的SPI机制来实现自己的扩展SPI机制。另外就是从动态代理入手,从网络通信、编码解码这些步骤以动态代理的方式植入远程调用方法中,实现透明化的调用

服务发布过程中做了哪些事?

暴露本地服务、暴露远程服务、启动netty、连接zookeeper、到zookeeper注册、监听zookeeper。

dubbo都有哪些协议,他们之间有什么特点,缺省值是什么?

dubbo支持多种协议,默认使用的是dubbo协议,具体介绍官方文档写得很清楚,传送地址:相关协议介绍,重点是掌握好推荐dubbo协议。Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。

什么是本地暴露和远程暴露,他们的区别?

在dubbo中我们一个服务可能既是Provider,又是Consumer,因此就存在他自己调用自己服务的情况,如果再通过网络去访问,那自然是舍近求远,因此他是有本地暴露服务的这个设计.从这里我们就知道这个两者的区别

  • 本地暴露是暴露在JVM中,不需要网络通信.
  • 远程暴露是将ip,端口等信息暴露给远程客户端,调用时需要网络通信.

ZK

一般选择什么注册中心,还有别的选择吗?

zk为默认推荐,其余还有Multicast、redis、Simple等注册中心。

dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?(面试高频题)

zookeeper的信息会缓存到服务器本地作为一个cache缓存文件,并且转换成properties对象方便使用,每次调用时,按照本地存储的地址进行调用,但是无法从注册中心去同步最新的服务列表,短期的注册中心挂掉是不要紧的,但一定要尽快修复。所以挂掉是不要紧的,但前提是你没有增加新的服务,如果你要调用新的服务,则是不能办到的。

项目中有使用过多线程吗?有的话讲讲你在哪里用到了多线程?(面试高频题)

以dubbo为例,这里的做法是:建立线程池,定时的检测并连接注册中心,如果失败了就重连,其实也就是一个定时任务执行器。可能做了两三年java还没真正在项目中开启过线程,问到这个问题时菊花一紧,但是定时任务执行器这种需求在项目中还是很常见的,比如失败重连、轮询执行任务等等,可以参考这个例子,把你们的定时任务场景和这里的多线程用法套在一起。

服务提供者能实现失效踢出是什么原理(高频题)

在分布式系统中,我们常常需要知道某个机器是否可用,传统的开发中,可以通过Ping某个主机来实现,Ping得通说明对方是可用的,相反是不可用的,ZK 中我们让所有的机器都注册一个临时节点,我们判断一个机器是否可用,我们只需要判断这个节点在ZK中是否存在就可以了,不需要直接去连接需要检查的机器,降低系统的复杂度。

在dubbo中,什么时候更新本地的zookeeper信息缓存文件?订阅zookeeper信息的整体过程是怎么样的?

dubbo向zk发送了订阅请求以后,会去监听zk的回调,(如果zk有回调就会去调用notify方法),接着会去创建接口配置信息的持久化节点,同时dubbo也设置了对该节点的监听,zk节点如果发生了变化那么会触发回调方法,去更新zk信息的缓存文件,同时注册服务在调用的时候会去对比最新的配置信息节点,有差别的话会以最新信息为准重新暴露。《dubbo源码解析-zookeeper订阅》

动态代理

dubbo的服务引用中封装通信细节是用到了动态代理,那请问创建动态代理常用的方式有哪些,他们又有什么区别?dubbo中用的是哪一种?(高频题)

jdk、cglib还有javasisit,JDK的动态代理代理的对象必须要实现一个接口,而针对于没有接口的类,则可用CGLIB。要明白两者区别必须要了解原理,明白了原理自然一通百通,CGLIB其原理也很简单,对指定的目标类生成一个子类,并覆盖其中方法实现增强,但由于采用的是继承,所以不能对final修饰的类进行代理。除了以上两种大家都很熟悉的方式外,其实还有一种方式,就是javassist生成字节码来实现代理(dubbo多处用到了javassist)。

集群容错

dubbo提供了几种集群容错模式?

谈谈dubbo中的负载均衡算法及特点?最小活跃数算法中是如何统计活跃数的?简单谈谈一致性哈希算法

怎么通过dubbo实现服务降级的,降级的方式有哪些,又有什么区别?

当网站处于高峰期时,并发量大,服务能力有限,那么我们只能暂时屏蔽边缘业务,这里面就要采用服务降级策略了。首先dubbo中的服务降级分成两个:屏蔽(mock=force)、容错(mock=fail)。

  • mock=force:return+null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
  • mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。

要生效需要在dubbo后台进行配置的修改。

dubbo监控平台能够动态改变接口的一些设置,其原理是怎样的?

改变注册在zookeeper上的节点信息,从而zookeeper通知重新生成invoker(这些具体细节在zookeeper创建节点,zookeeper连接,zookeeper订阅中都详细讲了,这里不再重复)。

原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/11421600.html

时间: 2024-11-10 18:16:32

Dubbo面试的相关文章

Dubbo面试踩坑

1.Dubbo支持哪些协议,每种协议的应用场景,优缺点? dubbo: 单一长连接和NIO异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者.传输协议TCP,异步,Hessian序列化: rmi: 采用JDK标准的rmi协议实现,传输参数和返回参数对象需要实现Serializable接口,使用java标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议TCP. 多个短连接,TCP协议传输,同步传输,适用常规的远程服务调用和rmi互操作.在

有关dubbo面试的那些事儿

dubbo是什么 dubbo是一个分布式框架,远程服务调用的分布式框架,其核心部分包含: 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式. 自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器. dubbo能做什么 透明化的远程方法调用,就像调用本

Dubbo面试八连问,这些你都能答上来吗?

Dubbo是什么? Dubbo能做什么? Dubbo内置了哪几种服务容器? Dubbo 核心的配置有哪些? Dubbo有哪几种集群容错方案,默认是哪种? Dubbo有哪几种负载均衡策略,默认是哪种? Dubbo默认使用的是什么通信框架,还有别的选择吗? 你觉得用Dubbo好还是SpringCloud好? 1.Dubbo是什么? Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目.致力于提供高性能和透明化的RPC远程服务调用方案,以及

Dubbo的核心组件、架构设计与Dubbo面试考点

1.Dubbo是什么? Dubbo 是一个分布式.高性能.透明化的 RPC 服务框架,提供服务自动注册.自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成. RPC 指的是远程调用协议,也就是说两个服务器交互数据. 2.Dubbo的由来? 互联网的快速发展,Web应用程序的规模不断扩大,一般会经历如下四个发展阶段. 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起即可. 垂直应用架构 当访问量逐渐增大,单一应用按照有业务线拆成多个应用,以提升效率. 此时,用于加

dubbo面试题目

1.为什么要用 Dubbo? 随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供.服务调用.连接处理.通信协议.序列化方式.服务发现.服务路由.日志输出等行为进行封装的服务框架.就这样为分布式系统的服务治理框架就出现了,Dubbo 也就这样产生了. 2.服务调用是阻塞的吗? 默认是阻塞的,可以异步调用,没有返回值的可以这么做.Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动

(转)史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!

背景:因为自己的简历写了dubbo,面试时候经常被问到.实际自己对dubbo的认识只停留在使用阶段,所以有必要好好补充下基础的理论知识. https://zhuanlan.zhihu.com/p/45846108 想往高处走,怎么能不懂 Dubbo? Dubbo是国内最出名的分布式服务框架,也是 Java 程序员必备的必会的框架之一.Dubbo 更是中高级面试过程中经常会问的技术,无论你是否用过,你都必须熟悉. 下面我为大家准备了一些 Dubbo 常见的的面试题,一些是我经常问别人的,一些是我过

阿里P7Java最全面试296题:阿里天猫、蚂蚁金服含答案文档解析

[阿里天猫.蚂蚁.钉钉面试专题题目加答案] 不会做别着急:文末有答案以及视频讲解,架构师资料 1. junit用法,before,beforeClass,after, afterClass的执行顺序 2. 分布式锁 3. nginx的请求转发算法,如何配置根据权重转发 4. 用hashmap实现redis有什么问题(死锁,死循环,可用ConcurrentHashmap) 5. 线程的状态 5. 线程的阻塞的方式 6. sleep和wait的区别 7. hashmap的底层实现 8. 一万个人抢1

7年Java老兵闭关整理出430道面试真题,全部掌握阿里也不过如此!

题目基本覆盖了整个Java后端题,因文章篇幅问题,我这里就不解答了,我已把题目整理成pdf文档,内容很全面,有需要的可以 点击这里 获取资料 话不多说,直接往下看↓ ↓ ↓ 一.性能调优面试专栏 1.1.tomcat性能优化整理 你这样给tomcat调优 如何加大comcat连接数 怎样加大tomcat的内存 Tomcat有几种部署方式 Tomcat的优化经验 1.2.JVM性能优化整理 Java类加载过程 Java内存分配 描述一下jVM加载class文件的原理机制? GC是什么?为什么要有G

为了升级到架构师,程序员无需过度关注哪些技能?哪些技能不可缺?

如果走技术路线,架构师是个关键的结点.如果在大厂,一般有有6年时间足以升级到高级开发.因为在大厂里,能提供架构师所需的分布式组件开发调试以及上线的经验,上进点的程序员只要跟着大流,多通过排查问题观察底层,多通过压测或部署组件多实践缓存.高并发高可能之类的技术,想不升级到架构师都难. 但不少程序员止步于高级开发,在我之前的博文为什么很多程序员没有升级到架构师?里讲述了这一现象并分析了原因.如果是因为主观不上进导致自身发展受限,那么别人也帮不了你,不过我在面试候选人的时候,发现一些态度积极的程序员把