首页 > 编程知识 正文

麦肯锡经典咨询面试题,dubbo高级面试题

时间:2023-05-06 15:57:39 阅读:33764 作者:3188

前言针对最近在网络公司面试中听到的知识点,总结了Java程序员面试中涉及的大部分问题和答案。 我想有助于面试前的复习,找到好的工作,也节约在网上搜索资料的时间进行学习。

内容: Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、rabbb

完整版Java面试问题地址: Java后端面试问题集成

1、为什么要用Dubbo? 随着服务化的发展,服务增加,服务之间的调用和依赖关系也变得复杂,面向服务的体系结构(SOA )应运而生。

因此,还产生了封装服务提供、服务呼叫、连接处理、通信协议、串行化方式、服务发现、服务路由、日志输出等行为的服务框架等一系列适当的技术。

这样出现了用于分布式系统的服务治理框架,Dubbo也是这样产生的。

2、Dubbo的总体架构设计有哪些层次? 接口服务层(Service )此层与业务逻辑相关,根据提供商和顾问的业务设计相应的接口和实现

配置层(configuration layer (config ) ) :围绕服务配置和参考配置的外部配置界面

以服务代理层(Proxy )服务接口透明代理、生成服务的客户端Stub和服务端Skeleton、服务代理为中心,扩展接口为代理工厂

封装服务注册层(Registry )服务地址的注册和发现,以服务URL为中心,将扩展接口设为注册工厂、注册、注册服务

路由层(Cluster )封装多个提供商的路由和负载均衡,桥接注册中心。 以Invoker为中心,扩展接口为集群、目录、路由器、LoadBlancce

监视层(Monitor ) RPC的调用次数和调用时间的监视,以Statistics为中心,扩展接口为MonitorFactory、Monitor、MonitorService

远程调用层(Protocal ) (封装RPC调用,以Invocation和Result为中心,扩展接口为Protocal、Invoker和Exporter

封装信息交换层(Exchange )请求响应模式,异步传输。 以请求和响应为中心,扩展界面为Exchanger、ExchangeChannel、Exchanger客户端和ExchangeServer

网络传输层(Transport )抽象mina和netty是统一接口,以消息为中心,扩展接口为Channel、Transporter、Client、Server和Codec

序列化数据层:可重用的工具。 扩展接口为序列化、对象输入、对象输出、线程池

3、默认使用什么样的通信框架? 有其他选择吗? 默认情况下,还建议使用netty框架和mina。 默认情况下,还建议使用netty框架和mina。

4、服务呼叫被屏蔽了吗? 默认被阻止,可以异步调用,没有返回值的可以这样做。

Dubbo是基于NIO的无阻塞实现的并行调用,客户端可以同时调用多个远程服务,而无需启动多线程。 多线程开销相对较小,异步调用返回Future对象。

5、一般使用什么注册中心? 有其他选择吗? 推荐Zookeeper作为注册中心。 此外,正在注册Redis、Multicast和Simple

对不起,我不推荐你。

6、默认情况下使用的是哪个序列化框架? 你知道什么? 建议Hessian序列化。 Duddo、FastJson和Java还附带序列化。

7、服务提供者能实现失效踢出局是什么原理? 服务禁用基于zookeeper的临时节点原理。

8、服务上线如何不影响旧版? 采用多版本开发,不影响旧版本。

9、如何解决服务呼叫链过长的问题? 可以与zipkin合作实现分布式服务跟踪。

10、核心配置是什么?

11、Dubbo推荐什么协议? dubbo://(推荐) ) ) ) ) ) ) ) ) )。

rmi://

hessian://

http://

web服务:/

thrift://

memcached://

redis://

rest://

12、同一服务注册多个时,可以直接连接一个服务吗? 您可以点对点直接连接、更改配置或通过telnet直接连接到服务。

13、绘制服务注册和发现流程图?

14、Dubbo集群容错有几种方案吗?

15、Dubbo服务降级,失败后如何重试? 在dubbo :参考中mock=“retur”

n null”。mock 的值也可以修改为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名规则是 “接口名称+Mock” 后缀。然后在 Mock 类里实现自己的降级逻辑

16、Dubbo 使用过程中都遇到了些什么问题?

在注册中心找不到对应的服务,检查 service 实现类是否添加了@service 注解无法连接到注册中心,检查配置文件中的对应的测试 ip 是否正确

17、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 钟,将文件中的统计数据画成图表

18、Dubbo 用到哪些设计模式?

Dubbo 框架在初始化和通信过程中使用了多种设计模式,可灵活控制类加载、限控制等功能。工厂模式Provider 在 export 服务时,会调用 ServiceConfig 的 export 方法。ServiceConfig中有个字段:private static final Protocol protocol =ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();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 SPIJDK 标准的 SPI 会一次性加载所有的扩展实现,如果有的扩展吃实话很耗时,但也没用上,很浪费资源。所以只希望加载某个的实现,就不现实了DUBBO SPI

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

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

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

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

21、Dubbo 支持分布式事务吗?

Spring 容器在启动的时候,会读取到 Spring 默认的一些 schema 以及 Dubbo 自定义的 schema,每个 schema 都会对应一个自己的 NamespaceHandler,NamespaceHandler 里面通过 BeanDefinitionParser 来解析配置信息并转化为需要加载的 bean 对象!

22、Dubbo 可以对结果进行缓存吗?

JDK SPIJDK 标准的 SPI 会一次性加载所有的扩展实现,如果有的扩展吃实话很耗时,但也没用上,很浪费资源。
所以只希望加载某个的实现,就不现实了DUBBO SPI1,对 Dubbo 进行扩展,不需要改动 Dubbo 的源码2,延迟加载,可以一次只加载自己想要加载的扩展实现。3,增加了对扩展点 IOC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。3,Dubbo 的扩展机制能很好的支持第三方 IoC 容器,默认支持 Spring Bean。

23、服务上线怎么兼容旧版本?

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

24、Dubbo 必须依赖的包有哪些?

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

25、Dubbo telnet 命令能做什么?

dubbo 服务发布之后,我们可以利用 telnet 命令进行调试、管理。Dubbo2.0.5 以上版本服务提供端口支持 telnet 命令
连接服务telnet localhost 20880 //键入回车进入 Dubbo 命令模式。查看服务列表dubbo>lscom.test.TestService
dubbo>ls com.test.TestServicecreatedeletequery· 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 调用,更新了开源组件等。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。