前言
Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 近程服务调用计划,以及 SOA 服务治理计划。简略的说,dubbo 就是个服务框架,如果没有分布式的需要,其实是不须要用的,只有在分布式的时候,才有 dubbo 这样的分布式服务框架的需要,并且实质上是个服务调用的东东,说白了就是个近程服务调用的分布式框架(辞别 Web Service 模式中的 WSdl,以服务者与消费者的形式在 dubbo 上注册)。
很多时候,其实咱们应用这个技术的时候,可能都是因为我的项目须要,所以,咱们就用了,然而,至于为什么咱们须要用到这个技术,可能本身并不是很理解的,然而,其实理解技术的来由及背景常识,对于了解一项技术还是有帮忙的。
对于 Dubbo 的常识总结了个思维导图
Dubbo 面试题
1、为什么要用 Dubbo?
2、Dubbo 的整体架构设计有哪些分层?
3、默认应用的是什么通信框架,还有别的抉择吗?
4、服务调用是阻塞的吗?
5、个别应用什么注册核心?还有别的抉择吗?
6、默认应用什么序列化框架,你晓得的还有哪些?
7、服务提供者能实现生效踢出是什么原理?
8、服务上线怎么不影响旧版本?
9、如何解决服务调用链过长的问题?
10、说说外围的配置有哪些?
11、Dubbo 举荐用什么协定?
12、同一个服务多个注册的状况下能够直连某一个服务吗?
13、画一画服务注册与发现的流程图?
14、Dubbo 集群容错有几种计划?
15、Dubbo 服务降级,失败重试怎么做?
16、Dubbo 应用过程中都遇到了些什么问题?
17、Dubbo Monitor 实现原理?
18、Dubbo 用到哪些设计模式?
19、Dubbo 配置文件是如何加载到 Spring 中的?
20、Dubbo SPI 和 Java SPI 区别?
21、Dubbo 反对分布式事务吗?
22、Dubbo 能够对后果进行缓存吗?
23、服务上线怎么兼容旧版本?
24、Dubbo 必须依赖的包有哪些?
25、Dubbo telnet 命令能做什么?
26、Dubbo 反对服务降级吗?
27、Dubbo 如何优雅停机?
28、Dubbo 和 Dubbox 之间的区别?
29、Dubbo 和 Spring Cloud 的区别?
30、你还理解别的分布式框架吗?
上面是 Dubbo 面试题答案解析
1、为什么要用 Dubbo?
随着服务化的进一步倒退,服务越来越多,服务之间的调用和依赖关系也越来越简单,诞生了面向服务的架构体系(SOA),也因而衍生出了一系列相应的技术,如对服务提供、服务调用、连贯解决、通信协议、序列化形式、服务发现、服务路由、日志输入等行为进行封装的服务框架。就这样为分布式系统的服务治理框架就呈现了,Dubbo 也就这样产生了。
2、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
3、默认应用的是什么通信框架,还有别的抉择吗?
默认也举荐应用 netty 框架,还有 mina。
4、服务调用是阻塞的吗?
默认是阻塞的,能够异步调用,没有返回值的能够这么做。Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不须要启动多线程即可实现并行调用多个近程服务,绝对多线程开销较小,异步调用会返回一个 Future 对象。
5、个别应用什么注册核心?还有别的抉择吗?
举荐应用 Zookeeper 作为注册核心,还有 Redis、Multicast、Simple 注册核心,但不举荐。
6、默认应用什么序列化框架,你晓得的还有哪些?
举荐应用 Hessian 序列化,还有 Duddo、FastJson、Java 自带序列化。
7、服务提供者能实现生效踢出是什么原理?
服务生效踢出基于 zookeeper 的长期节点原理。
8、服务上线怎么不影响旧版本?
采纳多版本开发,不影响旧版本。
9、如何解决服务调用链过长的问题?
能够联合 zipkin 实现分布式服务追踪。
10、说说外围的配置有哪些?
11、Dubbo 举荐用什么协定?
12、同一个服务多个注册的状况下能够直连某一个服务吗?
能够点对点直连,批改配置即可,也能够通过 telnet 间接某个服务。
13、画一画服务注册与发现的流程图?
14、Dubbo 集群容错有几种计划?
15、Dubbo 服务降级,失败重试怎么做?
能够通过 dubbo:reference 中设置 mock=”return null”。mock 的值也能够批改为 true,而后再跟接口同一个门路下实现一个 Mock 类,命名规定是“接口名称 +Mock”后缀。而后在 Mock 类里实现本人的降级逻辑
16、Dubbo 应用过程中都遇到了些什么问题?
在注册核心找不到对应的服务, 查看 service 实现类是否增加了 @service 注解无奈连贯到注册核心, 查看配置文件中的对应的测试 ip 是否正确
17、Dubbo Monitor 实现原理?
Consumer 端在发动调用之前会先走 filter 链;provider 端在接管到申请时也是先走 filter 链,而后才进行真正的业务逻辑解决。默认状况下,在 consumer 和 provider 的 filter 链中都会有 Monitorfilter。
- MonitorFilter 向 DubboMonitor 发送数据
- DubboMonitor 将数据进行聚合后(默认聚合 1min 中的统计数据)暂存到 ConcurrentMap<Statistics, AtomicReference> statisticsMap,而后应用一个含有 3 个线程(线程名字:DubboMonitorSendTimer)的线程池每隔 1min 钟,调用 SimpleMonitorService 遍历发送 statisticsMap 中的统计数据,每发送结束一个,就重置以后的 Statistics 的 AtomicReference
- SimpleMonitorService 将这些聚合数据塞入 BlockingQueue queue 中(队列大写为 100000)
- SimpleMonitorService 应用一个后盾线程(线程名为:DubboMonitorAsyncWriteLogThread)将 queue 中的数据写入文件(该线程以死循环的模式来写)
- SimpleMonitorService 还会应用一个含有 1 个线程(线程名字:DubboMonitorTimer)的线程池每隔 5min 钟,将文件中的统计数据画成图表
18、Dubbo 用到哪些设计模式?
Dubbo 框架在初始化和通信过程中应用了多种设计模式,可灵便管制类加载、权限管制等性能。
工厂模式
Provider 在 export 服务时,会调用 ServiceConfig 的 export 办法。ServiceConfig 中有个字段:
private static final Protocol protocol =
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtensi
on();
Dubbo 里有很多这种代码。这也是一种工厂模式,只是实现类的获取采纳了 JDKSPI 的机制。这么实现的长处是可扩展性强,想要扩大实现,只须要在 classpath 下减少个文件就能够了,代码零侵入。另外,像下面的 Adaptive 实现,能够做到调用时动静决定调用哪个实现,然而因为这种实现采纳了动静代理,会造成代码调试比拟麻烦,须要剖析出理论调用的实现类。
装璜器模式
Dubbo 在启动和调用阶段都大量应用了装璜器模式。以 Provider 提供的调用链为例,具体的调用链代码是在 ProtocolFilterWrapper 的 buildInvokerChain 实现的,具体是将注解中含有 group=provider 的 Filter 实现,依照 order 排序,最初的调用程序是:
EchoFilter -> ClassLoaderFilter -> GenericFilter -> ContextFilter ->
ExecuteLimitFilter -> TraceFilter -> TimeoutFilter -> MonitorFilter ->
ExceptionFilter
更确切地说,这里是装璜器和责任链模式的混合应用。例如,EchoFilter 的作用是判断是否是回声测试申请,是的话间接返回内容,这是一种责任链的体现。而像 ClassLoaderFilter 则只是在主性能上增加了性能,更改以后线程的 ClassLoader,这是典型的装璜器模式。
观察者模式
Dubbo 的 Provider 启动时,须要与注册核心交互,先注册本人的服务,再订阅本人的服务,订阅时,采纳了观察者模式,开启一个 listener。注册核心会每 5 秒定时查看是否有服务更新,如果有更新,向该服务的提供者发送一个 notify 音讯,provider 承受到 notify 音讯后,运行 NotifyListener 的 notify 办法,执行监听器办法。
动静代理模式
Dubbo 扩大 JDK SPI 的类 ExtensionLoader 的 Adaptive 实现是典型的动静代理实现。Dubbo 须要灵便地管制实现类,即在调用阶段动静地依据参数决定调用哪个实现类,所以采纳学生成代理类的办法,可能做到灵便的调用。生成代理类的代码是 ExtensionLoader 的 createAdaptiveExtensionClassCode 办法。代理类次要逻辑是,获取 URL 参数中指定参数的值作为获取实现类的 key。
19、Dubbo 配置文件是如何加载到 Spring 中的?
Spring 容器在启动的时候,会读取到 Spring 默认的一些 schema 以及 Dubbo 自定义的 schema,每个 schema 都会对应一个本人的 NamespaceHandler,NamespaceHandler 外面通过 BeanDefinitionParser 来解析配置信息并转化为须要加载的 bean 对象!
20、Dubbo SPI 和 Java SPI 区别?
JDK SPI:
JDK 规范的 SPI 会一次性加载所有的扩大实现,如果有的扩大吃瞎话很耗时,但也没用上,很浪费资源。所以只心愿加载某个的实现,就不事实了
DUBBO SPI:
1、对 Dubbo 进行扩大,不须要改变 Dubbo 的源码
2、提早加载,能够一次只加载本人想要加载的扩大实现。
3、减少了对扩大点 IOC 和 AOP 的反对,一个扩大点能够间接 setter 注入其它扩大点。
4、Dubbo 的扩大机制能很好的反对第三方 IoC 容器,默认反对 Spring Bean。
21、Dubbo 反对分布式事务吗?
目前临时不反对,可与通过 tcc-transaction 框架实现
介绍:tcc-transaction 是开源的 TCC 补偿性分布式事务框架
TCC-Transaction 通过 Dubbo 隐式传参的性能,防止本人对业务代码的入侵。
22、Dubbo 能够对后果进行缓存吗?
为了进步数据拜访的速度。Dubbo 提供了申明式缓存,以缩小用户加缓存的工作量 <dubbo:reference cache=”true” />
其实比一般的配置文件就多了一个标签 cache=”true”
23、服务上线怎么兼容旧版本?
能够用版本号(version)过渡,多个不同版本的服务注册到注册核心,版本号不同的服务相互间不援用。这个和服务分组的概念有一点相似。
24、Dubbo 必须依赖的包有哪些?
Dubbo 必须依赖 JDK,其余为可选。
25、Dubbo telnet 命令能做什么?
dubbo 服务公布之后,咱们能够利用 telnet 命令进行调试、治理。Dubbo2.0.5 以上版本服务提供端口反对 telnet 命令
连贯服务
telnet localhost 20880 // 键入回车进入 Dubbo 命令模式。
查看服务列表
dubbo>ls
com.test.TestService
dubbo>ls com.test.TestService
create
delete
query
· ls (list services and methods)
· ls : 显示服务列表。
· ls -l : 显示服务详细信息列表。
· ls XxxService:显示服务的办法列表。
· ls -l XxxService:显示服务的办法详细信息列表。
26、Dubbo 反对服务降级吗?
以通过 dubbo:reference 中设置 mock=”return null”。mock 的值也能够批改为 true,而后再跟接口同一个门路下实现一个 Mock 类,命名规定是“接口名称 +Mock”后缀。而后在 Mock 类里实现本人的降级逻辑
27、Dubbo 如何优雅停机?
Dubbo 是通过 JDK 的 ShutdownHook 来实现优雅停机的,所以如果应用 kill -9 PID 等强制敞开指令,是不会执行优雅停机的,只有通过 kill PID 时,才会执行。
28、Dubbo 和 Dubbox 之间的区别?
Dubbox 是继 Dubbo 进行保护后,当当网基于 Dubbo 做的一个扩大我的项目,如加了服务可 Restful 调用,更新了开源组件等。
29、Dubbo 和 Spring Cloud 的区别?
依据微服务架构在各方面的因素,看看 Spring Cloud 和 Dubbo 都提供了哪些反对。
应用 Dubbo 构建的微服务架构就像组装电脑,各环节咱们的抉择自由度很高,然而最终后果很有可能因为一条内存品质不行就点不亮了,总是让人不怎么释怀,然而如果你是一名高手,那这些都不是问题;而 Spring Cloud 就像品牌机,在 Spring Source 的整合下,做了大量的兼容性测试,保障了机器领有更高的稳定性,然而如果要在应用非原装组件外的货色,就须要对其根底有足够的理解。
30、你还理解别的分布式框架吗?
别的还有 spring 的 spring cloud,facebook 的 thrift,twitter 的 finagle 等