Dubbo核心面试题及详细答案(实战口语版)-1_第1页
Dubbo核心面试题及详细答案(实战口语版)-1_第2页
Dubbo核心面试题及详细答案(实战口语版)-1_第3页
Dubbo核心面试题及详细答案(实战口语版)-1_第4页
Dubbo核心面试题及详细答案(实战口语版)-1_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Dubbo核心面试题及详细答案(实战口语版)一、Dubbo基础认知面试题1、简单说说你对Dubbo的理解,它是做什么的?Dubbo是阿里开源的一款高性能、轻量级的JavaRPC远程调用框架,核心作用是解决分布式项目中的服务调用问题。传统单体项目所有代码都在一个工程里,方法直接本地调用。但微服务架构下,项目会拆分成多个独立服务,不同服务部署在不同服务器上,无法直接本地调用,就需要RPC框架实现跨进程、跨机器的远程方法调用。Dubbo最核心的价值就是透明化远程调用,开发者调用远程服务就像调用本地方法一样简单,不用手动写网络连接、请求收发、数据解析等底层代码。同时它还提供了服务注册发现、负载均衡、容错降级、限流等整套微服务治理能力。2、Dubbo的核心特性有哪些?日常开发和面试中重点关注这几个核心特性:透明化RPC调用:屏蔽网络底层细节,远程调用和本地调用体验一致服务注册与发现:依托注册中心,实现服务自动注册、订阅、动态感知上下线智能负载均衡:提供多种负载均衡策略,分发请求,避免服务单点压力过大丰富的容错机制:失败重试、失败降级、快速失败等,保证服务调用稳定性高可用:注册中心集群、服务集群部署,避免单点故障可扩展:核心组件均可自定义扩展,比如序列化、负载均衡、容错策略等服务治理:支持权重配置、灰度发布、限流、熔断、监控告警3、Dubbo和SpringCloud的区别?项目中为什么用Dubbo?两者核心定位不同,没有绝对优劣,看业务场景:Dubbo:核心是RPC调用框架,主打高性能的远程服务调用,配套完善的服务治理能力。通信基于TCP协议,默认Dubbo序列化,传输效率高、延迟低,适合对接口响应速度、吞吐量要求高的后端微服务场景。SpringCloud:是一套完整的微服务生态全家桶,包含注册发现、网关、配置中心、熔断限流等全套组件,通信基于HTTP协议(Rest接口),通用性强、跨语言友好,但性能比Dubbo弱。项目选型原因:我们后端服务都是Java服务,内部服务调用频繁、并发量大,对性能要求高,所以选用Dubbo做内部服务通信;对外接口会用HTTP,兼顾通用性。二、Dubbo架构核心原理1、Dubbo的核心架构角色有哪些?各自作用?Dubbo经典的五大核心角色,是整个框架的基础:Provider(服务提供者):部署在服务端,暴露自身的业务接口,启动后主动将服务地址、端口、接口信息注册到注册中心Consumer(服务消费者):调用远程服务的客户端,启动后主动向注册中心订阅需要调用的服务,缓存服务列表到本地Registry(注册中心):核心中转站,负责服务注册、服务发现,实时推送服务上下线状态给消费者,常用Zookeeper、NacosMonitor(监控中心):采集服务调用的次数、耗时、异常率等数据,用于服务监控、问题排查,常用DubboAdmin、PrometheusContainer(服务容器):负责启动、加载服务提供者,本质就是Spring容器,用于初始化Dubbo服务2、Dubbo完整的调用流程是什么?我按服务启动、调用、结束完整流程梳理,面试可以直接口述:服务注册:服务提供者启动,初始化Dubbo配置,将自己的接口全限定名、IP、端口、版本等信息注册到注册中心服务订阅:服务消费者启动,根据自身需要调用的服务,向注册中心发起订阅,注册中心返回对应服务的节点列表本地缓存:消费者将服务节点列表缓存到本地,后续调用优先走本地缓存,不用每次请求注册中心负载均衡:消费者发起接口调用时,根据配置的负载均衡策略,从本地服务列表中选中一个服务节点远程调用:通过Dubbo协议(TCP)发起远程请求,经过序列化、网络传输,发送给服务提供者业务执行:服务提供者接收请求,反序列化后匹配对应接口方法,执行本地业务逻辑结果返回:执行结果序列化后回传给消费者,消费者反序列化得到结果,完成调用监控上报:整个调用的耗时、状态、异常信息异步上报到监控中心3、注册中心宕机后,Dubbo服务还能调用吗?可以正常调用,这是Dubbo的高可用设计。消费者启动时已经将服务节点列表缓存到了本地内存,日常调用根本不依赖注册中心实时通信。注册中心的作用只是服务启动注册、动态推送节点变更。如果注册中心宕机,已经运行的服务可以正常调用;唯一影响是:新服务无法注册、消费者无法感知服务节点上下线,直到注册中心恢复。三、Dubbo核心配置与协议1、Dubbo支持哪些协议?各自适用场景?常用四种协议,面试重点区分场景:Dubbo协议(默认):基于TCP,单长连接、NIO异步通信,Dubbo自定义序列化。适合内部服务高频调用、小数据包、高并发场景,是项目最常用协议Http协议:基于HTTP,通用性强、跨语言支持好。适合对外接口、第三方对接场景,性能比Dubbo协议差Rmi协议:Java原生远程调用协议,基于TCP。适合传统老旧项目,性能一般,不适合高并发Redis协议:基于Redis做消息中转,适合简单的消息通知、低频次调用场景2、Dubbo超时时间怎么配置?优先级是什么?Dubbo超时时间(timeout)是接口调用的最大等待时间,超时直接抛出异常,有四级配置优先级,消费者配置优先于提供者:优先级从高到低:方法级配置>接口级配置>消费者全局配置>提供者全局配置这里有个重点:超时控制以消费者为准。哪怕提供者设置的超时时间更长,只要消费者超时时间到了,就会终止调用,避免消费者一直阻塞。日常开发中,一般在消费者端配置超时,更灵活可控。3、Dubbo的版本号和分组有什么作用?版本号(version)用于接口灰度升级、版本兼容迭代。当接口方法参数、逻辑发生不兼容修改时,通过版本号区分新旧接口。消费者指定版本调用,实现新旧服务并行运行、平滑升级,不用停服。分组(group)用于同一接口多套实现、环境隔离。比如同一个支付接口,区分测试环境、预发环境、生产环境,或者区分支付宝、微信支付不同实现,通过分组隔离调用,避免冲突。四、Dubbo负载均衡机制1、Dubbo有哪几种负载均衡策略?默认是哪个?Dubbo内置4种负载均衡策略,默认是加权随机:Random(加权随机)默认:根据服务节点权重随机分配请求。权重越高,分到的请求越多。适合服务节点性能不一致的场景,线上最常用RoundRobin(加权轮询):按权重依次轮流分发请求,性能均匀,适合节点性能一致、请求耗时均匀的场景。缺点是瞬时流量不均可能导致慢节点堆积请求LeastActive(最少活跃数):优先选择当前处理请求最少、响应最快的节点。慢节点会自动减少请求分配,适合接口耗时不稳定、有慢接口的场景,容错性最好ConsistentHash(一致性哈希):相同参数的请求固定分发到同一个节点。适合需要会话保持、缓存复用的场景,比如订单查询、用户信息查询2、线上为什么常用LeastActive负载均衡?线上服务节点偶尔会出现JVM卡顿、网络波动、数据库慢查询等问题,导致节点处理变慢。LeastActive策略会实时统计每个节点的活跃请求数,慢节点因为处理请求慢,活跃数会变高,系统就会自动减少给它分配请求,避免慢节点拖垮整体接口性能,容错性远高于随机和轮询,所以复杂线上环境优先用这个策略。五、Dubbo容错与重试机制(高频面试)1、Dubbo的集群容错策略有哪些?默认是什么?Dubbo一共5种集群容错策略,默认是Failover失败重试,全部是消费者端生效:Failover(失败重试)默认:调用失败后,自动重试其他节点,默认重试2次。适合幂等性查询接口,是线上默认策略;非幂等接口必须关闭重试,避免重复提交FailFast(快速失败):调用失败直接抛出异常,不重试。适合新增、修改、删除等非幂等接口,防止重复操作FailSafe(失败安全):调用失败不抛异常,直接忽略,返回空结果。适合日志上报、埋点统计等非核心业务接口FailBack(失败自动恢复):调用失败后异步记录失败请求,定时重试。适合消息通知、异步任务场景Forking(并行调用):同时调用多个服务节点,只要一个成功就返回结果。适合对响应速度极高、允许少量资源浪费的场景2、Dubbo重试机制的坑?线上如何规避?核心坑点:默认重试机制会导致非幂等接口重复提交,比如下单、扣款、新增数据,重试会产生重复数据、重复扣款问题。线上规避方案:区分接口类型:查询接口保留重试,增删改接口手动改为FailFast快速失败业务层做幂等设计:基于唯一订单号、请求ID做幂等校验,重复请求直接拦截合理配置重试次数和超时时间,避免无效重试拖垮服务3、Dubbo熔断降级怎么实现?Dubbo自带简单的降级能力,同时支持整合Sentinel做完善的熔断降级:1、原生降级:通过mock配置,当服务调用失败、超时次数过多时,直接走本地mock兜底逻辑,不调用远程服务,防止雪崩2、Sentinel熔断降级(主流):结合Sentinel实现限流、熔断、热点参数限流。当服务异常率、耗时达到阈值,自动熔断,短时间内拒绝所有请求,触发降级兜底,保护自身和上游服务。六、Dubbo序列化与性能1、Dubbo支持哪些序列化方式?各自优缺点?Dubbo序列化(默认):Dubbo自定义序列化协议,基于Java序列化优化,速度快、体积小,兼容性好,适合内部服务调用,唯一缺点是跨语言支持差Hessian:经典序列化方式,兼容性强,稳定性高,老项目常用,性能略低于Dubbo序列化Json序列化:可读性高、跨语言友好,但是序列化后数据体积大、速度慢,性能最差Protobuf:谷歌序列化协议,压缩率高、性能极强,适合高性能、跨语言场景,缺点是使用繁琐,需要定义proto文件2、为什么不推荐用Java原生序列化?Java原生序列化存在很多硬伤:序列化后字节数组体积大、传输效率低、性能差;同时兼容性极差,实体类字段轻微修改就会序列化失败;还存在安全漏洞,所以Dubbo完全摒弃了原生Java序列化。七、Dubbo核心底层与常见问题1、Dubbo是同步调用还是异步调用?默认同步阻塞调用:消费者发起调用后,线程会阻塞等待提供者返回结果,拿到结果后再继续执行业务逻辑,适合大部分常规业务场景。同时支持异步调用:通过配置开启异步模式,调用后立刻返回,不阻塞线程,通过Future或者回调接口获取结果,适合耗时较长、无需同步等待的接口,提升吞吐量。2、Dubbo的连接模型是什么?Dubbo默认是单连接、长连接、NIO异步通信模型。单个消费者和单个提供者之间默认只建立一个TCP长连接,所有请求复用这个连接,减少连接创建销毁的开销。基于Netty实现NIO非阻塞通信,一个线程可以处理大量请求,并发性能极高。高并发场景可以手动配置多连接,分担单连接压力。3、Dubbo服务超时的常见原因和排查思路?常见原因:提供者接口内部逻辑慢:数据库慢查询、循环耗时、外部接口阻塞服务节点负载过高:CPU、内存打满,线程池耗尽网络问题:机房网络波动、延迟过高、丢包Dubbo线程池满,请求排队阻塞排查思路:查看监控中心,定位超时接口、超时率、异常节点查看服务日志,确认是网络超时还是业务执行超时排查提供者线程池状态,是否存在线程耗尽、阻塞分析接口内部耗时,优化慢SQL、慢逻辑4、Dubbo线程池满如何解决?Dubbo默认使用固定线程池,默认核心线程数200,接口阻塞、耗时过长就会导致线程池打满,新请求排队超时。解决方案:短期应急:适当调大Dubbo服务线程池大小根本解决:优化慢接口、去除代码阻塞、优化SQL,缩短接口执行耗时治理优化:开启超时熔断、降级,避免慢接口拖

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论