17 个必问 Dubbo 面试题
1.Dubbo是什么?RPC又是什么?
1.Dubbo是什么?RPC又是什么?
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底>层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络>通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发>送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为>止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户>端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。有多种 RPC模式和执行。
-
-
远程通讯:dubbo-remoting模块, 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 -
-
集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 -
-
自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
3.能说下Dubbo的总体的调用过程吗?
-
1.Proxy持有一个Invoker对象,使用Invoker调用 -
2.之后通过Cluster进行负载容错,失败重试 -
3.调用Directory获取远程服务的Invoker列表 -
4.负载均衡 -
用户配置了路由规则,则根据路由规则过滤获取到的Invoker列表 -
用户没有配置路由规则或配置路由后还有很多节点,则使用LoadBalance方法做负载均衡,选用一个可以调用的Invoker -
5.经过一个一个过滤器链,通常是处理上下文、限流、计数等。 -
6.会使用Client做数据传输 -
7.私有化协议的构造(Codec) -
8.进行序列化 -
9.服务端收到这个Request请求,将其分配到ThreadPool中进行处理 -
10.Server来处理这些Request -
11.根据请求查找对应的Exporter -
12.之后经过一个服务提供者端的过滤器链 -
13.然后找到接口实现并真正的调用,将请求结果返回
4.说说Dubbo 支持哪些协议,每种协议的应用场景和优缺点
-
1.dubbo 单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步,Hessian 序列化 -
2.rmi 采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。多个短连接,TCP 协议传输,同步传输,适用常规的远程服务调用和 rmi 互 操作。在依赖低版本的 Common-Collections 包,java 序列化存在安全漏洞 -
3.webservice 基于 WebService 的远程调用协议,集成 CXF 实现,提供和原生 WebService 的互操作。多个短连接,基于 HTTP 传输,同步传输,适用系统集成和跨语言调用; -
4.http 基于 Http 表单提交的远程调用协议,使用 Spring 的 HttpInvoke 实 现。多个短连接,传输协议 HTTP,传入参数大小混合,提供者个数多于消 费者,需要给应用程序和浏览器 JS 调用 -
5.hessian 集成 Hessian 服务,基于 HTTP 通讯,采用 Servlet 暴露服务,Dubbo 内嵌 Jetty 作为服务器时默认实现,提供与 Hession 服务互操作。多个短连接,同步 HTTP 传输,Hessian 序列化,传入参数较大,提供者大于消费者,提供者压力较大,可传文件; -
6.memcache 基于 memcached 实现的 RPC 协议 -
7.redis 基于 redis 实现的 RPC 协议
5.Dubbo中都用到哪些设计模式?
责任链模式在Dubbo中发挥的作用举足轻重,就像是Dubbo框架的骨架。Dubbo的调用链组织是用责任链模式串连起来的。责任链中的每个节点实现Filter接口,然后由ProtocolFilterWrapper,将所有Filter串连起来。Dubbo的许多功能都是通过Filter扩展实现的,比如监控、日志、缓存、安全、telnet以及RPC本身都是。
Dubbo中使用观察者模式最典型的例子是RegistryService。消费者在初始化的时候回调用subscribe方法,注册一个观察者,如果观察者引用的服务地址列表发生改变,就会通过NotifyListener通知消费者。此外,Dubbo的InvokerListener、ExporterListener 也实现了观察者模式,只要实现该接口,并注册,就可以接收到consumer端调用refer和provider端调用export的通知。
Dubbo中还大量用到了修饰器模式。比如ProtocolFilterWrapper类是对Protocol类的修饰。在export和refer方法中,配合责任链模式,把Filter组装成责任链,实现对Protocol功能的修饰。其他还有ProtocolListenerWrapper、 ListenerInvokerWrapper、InvokerWrapper等。
CacheFactory的实现采用的是工厂方法模式。CacheFactory接口定义getCache方法,然后定义一个AbstractCacheFactory抽象类实现CacheFactory,并将实际创建cache的createCache方法分离出来,并设置为抽象方法。这样具体cache的创建工作就留给具体的子类去完成。
ProxyFactory及其子类是Dubbo中使用抽象工厂模式的典型例子。ProxyFactory提供两个方法,分别用来生产Proxy和Invoker(这两个方法签名看起来有些矛盾,因为getProxy方法需要传入一个Invoker对象,而getInvoker方法需要传入一个Proxy对象,看起来会形成循环依赖,但其实两个方式使用的场景不一样)。AbstractProxyFactory实现了ProxyFactory接口,作为具体实现类的抽象父类。然后定义了JdkProxyFactory和JavassistProxyFactory两个具体类,分别用来生产基于jdk代理机制和基于javassist代理机制的Proxy和Invoker。
为了让用户根据自己的需求选择日志组件,Dubbo自定义了自己的Logger接口,并为常见的日志组件(包括jcl, jdk, log4j, slf4j)提供相应的适配器。并且利用简单工厂模式提供一个LoggerFactory,客户可以创建抽象的Dubbo自定义Logger,而无需关心实际使用的日志组件类型。在LoggerFactory初始化时,客户通过设置系统变量的方式选择自己所用的日志组件,这样提供了很大的灵活性。
Dubbo consumer使用Proxy类创建远程服务的本地代理,本地代理实现和远程服务一样的接口,并且屏蔽了网络通信的细节,使得用户在使用本地代理的时候,感觉和使用本地服务一样。
6.如果Dubbo中provider提供的服务由多个版本怎么办?
<dubbo:service interface="com.xxxx.rent.service.IDemoService" ref="iDemoServiceFirst" version="1.0.0"/>
<dubbo:service interface="com.xxxx.rent.service.IDemoService" ref="iDemoServiceSecond" version="1.0.1"/>
7. 服务暴露的流程是怎么样的?
8.服务引用的流程是怎么样的?
9.Dubbo的注册中心有哪些?
10.聊聊Dubbo SPI机制?
-
1.META-INF/services/ 目录:该目录下的 SPI 配置文件是为了用来兼容 Java SPI 。 2.META-INF/dubbo/ 目录:该目录存放用户自定义的 SPI 配置文件。
key=com.xxx.xxx
3.META-INF/dubbo/internal/ 目录:该目录存放 Dubbo 内部使用的 SPI 配置文件。
11.Dubbo的SPi和JAVA的SPI有什么区别?
-
Java SPI 在查找扩展实现类的时候遍历 SPI 的配置文件并且将实现类全部实例化
-
1,对 Dubbo 进行扩展,不需要改动 Dubbo 的源码 -
2,延迟加载,可以一次只加载自己想要加载的扩展实现。 -
3,增加了对扩展点 IOC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。 -
4,Dubbo 的扩展机制能很好的支持第三方 IoC 容器,默认支持 Spring Bean。
12.有哪些负载均衡策略?
-
首先求出memcached服务器(节点)的哈希值,并将其配置到0~2的32次方的圆(continuum)上。 -
然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。 -
然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2的32次方仍然找不到服务器,就会保存到第一台memcached服务器上。
13.集群容错方式有哪些?
14.说说Dubbo的分层?
-
business业务逻辑层由我们自己来提供接口和实现还有一些配置信息 -
RPC层就是真正的RPC调用的核心层,封装整个RPC的调用过程、负载均衡、集群容错、代理 -
remoting则是对网络传输协议和数据转换的封装。
15.服务提供者能实现失效踢出是什么原理?
16.为什么要通过代理对象通信??
17.怎么设计一个RPC框架?