Dubbo面试题
文章树列

Dubbo面试题

一.1.1 常考重点

Dubbo是什么?

Dubbo是阿里巴巴开源的基于Java的高性能RPC分布式服务框架,现已成为Apache基金会孵化项目。

面试官问你如果这个都不清楚,那下面的就没必要问了。

官网:http://dubbo.apache.org

什么是Dubbo服务治理?

服务与服务之间会有很多个Url、依赖关系、负载均衡、容错、自动注册服务。

 

Dubbo内置了哪几种服务容器?

SpringContainer

JettyContainer

Log4jContainer

Dubbo的服务容器只是一个简单的Main方法,并加载一个简单的Spring容器,用于暴露服务。

Dubbo推荐使用什么序列化框架,你知道的还有哪些?

推荐使用Hessian序列化,还有Duddo、FastJson、Java自带序列化。

为什么要用Dubbo?

因为是阿里开源项目,国内很多互联网公司都在用,已经经过很多线上考验。内部使用了Netty、Zookeeper,保证了高性能高可用性。

使用Dubbo可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场需求。

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

 

下面是Dubbo的服务治理图。

 

Dubbox与Dubbo区别?

Dubox使用http协议+rest风格传入json或者xml格式进行远程调用。

Dubbo使用Dubbo协议。

SpringCloud与Dubbo区别?

………..

两个没关联,如果硬要说区别,有以下几点。

1)通信方式不同

Dubbo使用的是RPC通信,而SpringCloud使用的是HTTPRESTFul方式。

2)组成部分不同

 

相同点:

dubbo与springcloud都可以实现RPC远程调用。

dubbo与springcloud都可以使用分布式、微服务场景下。

区别:

dubbo有比较强的背景,在国内有一定影响力。

dubbo使用zk或redis作为作为注册中心

springcloud使用eureka作为注册中心

dubbo支持多种协议,默认使用dubbo协议。

Springcloud只能支持http协议。

Springcloud是一套完整的微服务解决方案。

Dubbo目前已经停止更新,SpringCloud更新速度快。

 

说说Dubbo的实现原理

dubbo提供功能来讲,提供基础功能-RPC调用提供增值功能SOA服务治理

dubbo启动时查找可用的远程服务提供者,调用接口时不是最终调用本地实现,而是通过拦截调用(又用上JDK动态代理功能)过程经过一系列的的序列化、远程通信、协议解析最终调用到远程服务提供者

参考:

https://www.cnblogs.com/linlinismine/p/7814521.html

https://blog.csdn.net/chao_19/article/details/51764150

 

 

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

dubbo://(推荐)

rmi://

hessian://

http://

webservice://

thrift://

memcached://

redis://

rest://

Dubbo必须依赖的包有哪些?

Dubbo必须依赖JDK,其他为可选。

Dubbo的管理控制台能做什么?

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

说说Dubbo服务暴露的过程。

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

服务注册与发现的流程图

 

如果你说你熟悉Dubbo,面试官经常会让你画这个图,记好了。

Dubbo默认使用什么注册中心,还有别的选择吗?

推荐使用Zookeeper作为注册中心,还有Redis、Multicast、Simple注册中心,但不推荐。

Dubbo有哪几种配置方式?

1)Spring配置方式

2)JavaAPI配置方式 

Dubbo核心的配置有哪些?

面试官曾经让写这些配置

 

配置之间的关系见下图。

 

你觉得用Dubbo好还是SpringCloud好?

扩展性的问题,没有好坏,只有适合不适合,不过我好像更倾向于使用Dubbo,SpringCloud版本升级太快,组件更新替换太频繁,配置太繁琐,还有很多我觉得是没有Dubbo顺手的地方……

dubbo协议适用范围和适用场景

适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串。

适用场景:常规远程服务方法调用

服务调用是阻塞的吗?

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

默认使用什么序列化框架,你知道的还有哪些?

Dubbo 的整体架构设计有哪些分层?

Dubbo Monitor 实现原理?

Consumer 端在发起调用之前会先走 filter 链; provider 端在接收到请求时也是先走 filter 链, 然后才进行真正的业务逻辑处理。

默认情况下, 在 consumer 和 provider 的 filter 链中都会有 Monitorfilter。1、MonitorFilter 向 DubboMonitor 发送数据

2、DubboMonitor 将数据进行聚合后( 默认聚合 1min 中的统计数据) 暂存到ConcurrentMap<Statistics, AtomicReference> statisticsMap, 然后使用一个含有 3 个线程( 线程名字: DubboMonitorSendTimer)的线程池每隔 1min 钟, 调用 SimpleMonitorService 遍历发送 statisticsMap 中的统计数据,每发送完毕一个, 就重置当前的 Statistics 的 AtomicReference

3、SimpleMonitorService 将这些聚合数据塞入 BlockingQueue queue 中( 队列大写为 100000)

4、SimpleMonitorService 使用一个后台线程( 线程名为:DubboMonitorAsyncWriteLogThread)将 queue 中的数据写入文件( 该线程以死循环的形式来写)

5、SimpleMonitorService 还会使用一个含有 1 个线程( 线程名字:DubboMonitorTimer) 的线程池每隔 5min 钟, 将文件中的统计数据画成图表

Dubbo 用到哪些设计模式?

Dubbo 框架在初始化和通信过程中使用了多种设计模式, 可灵活控制类加载、权限控制等功能。

工厂模式

Provider 在 export 服务时,会调用 ServiceConfig 的 export 方法。ServiceConfig 中有个字段:

private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtensi on();

Dubbo 里有很多这种代码。这也是一种工厂模式, 只是实现类的获取采用了 JDK SPI 的机制。这么实现的优点是可扩展性强, 想要扩展实现, 只需要在 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。

Dubbo 支持分布式事务吗?

目前暂时不支持, 可与通过 tcc-transaction 框架实现

介绍: tcc-transaction 是开源的 TCC 补偿性分布式事务框架

Git 地址: https://github.com/changmingxie/tcc-transaction

 

TCC-Transaction 通过 Dubbo 隐式传参的功能, 避免自己对业务代码的入侵。

Dubbo SPI 和 Java SPI 区别?

JDK SPI

JDK 标准的 SPI 会一次性加载所有的扩展实现,如果有的扩展吃实话很耗时,但也没用上, 很浪费资源。

所以只希望加载某个的实现, 就不现实了

DUBBO SPI

1, 对 Dubbo 进行扩展, 不需要改动 Dubbo 的源码

2, 延迟加载, 可以一次只加载自己想要加载的扩展实现。

3, 增加了对扩展点 IOC 和 AOP  的支持, 一个扩展点可以直接  setter 注入其它扩展点。

 

3, Dubbo 的扩展机制能很好的支持第三方 IoC 容器, 默认支持 Spring Bean。

新版下载
本文原创,商业转载请联系作者获得授权,非商业转载请注明出处。

评论

发送评论 编辑评论


                        

后端技术分类热门文章

标签热门文章排行

☛免责声明 ☛本站使用教程
Theme Argon With Ry-Plus By 清欢
我的第24127位朋友,历经140552次回眸才与你相遇
内容失效/资源代找/交流学习
内容失效/资源代找/交流学习