面试题-Dubbo

188 阅读5分钟

Dubbo面试题

Dubbo 和 spring Cloud (或者和feign)区别?

相同点 1、dubbo 和 feign 都依赖于注册中心 2、都是框架 dubbo 是alibaba开源的,已经贡献给了apache。feign 是netflix 开源的,spring cloud 生态的。

不同点 1、从协议角度考虑,
dubbo 是基于网络层TCP/IP协议,它支持多种传输协议 ://dubo协议、://http协议、://rmi协议、://redis协议等。默认是://dubbo协议(采用netty组件实现),使用长连接,适用于数量量小、高并发服务。
feign 是基于应用层http协议,使用短连接,不太适合高并发服务。

2、从负载均衡角度考虑
dubbo支持4种负载均衡(3之前版本),随机、轮询、活跃度、hash一致,而且加了权重的概念;
feign支持更多负载均衡方式,随机、轮询、最小响应等;
feign的负载均衡是基于client端的,而dubbo是基于服务端的,而且配置灵活(可以基于代码级别配置,dubbo控制台也可以动态配置),并且负载均衡算法开源精确到接口级别(3版本之后不是如此了)。

3、从容错机制角度考虑
dubbo的容错机制有多种,failover、failfast、broadcast、forking等;
feign的容错机制,采用熔断机制。

4、从程序的可扩展性、生态角度考虑
dubbo采用SPI,扩展性较强;
feign 有这spring cloud 的生态,但dubbo也在逐渐形成spring cloud alibaba 生态(2022-6-8);

Dubbo支持哪些协议?

dubbo支持很多协议
dubbo协议,也是dubbo的默认协议,基于TCP实现,采用长连(TCP长连接)接和NIO异步通信(netty组件),非常适合小数据高并发场景
http协议,采用短连接同步传输(http1.1版本才开始支持长连接,而且也不是很准确,http是应用,TCP是网络传输层,传输层才能建立连接和断开连接)。

Dubbo负载均衡有哪些?

1、轮询
2、随机
3、最少活跃数(活跃度)
4、hash一致,同样的请求参数会发给同一个服务提供者

Dubbo服务降级实现原理?

dubbo的服务降级,采用Mock机制实现

使用姿势:

// 消费端
@DubboReference(timeout = 1000,check = false,mock = “fail:return null”)

// mock="return null" 直接返回null 适用于临时规避方案
// mock ="fail:return null",服务可用返回结果,服务不可用返回null
// mock="true" 或者 mock="服务替代类" 服务可用是返回结果,服务不可用是返回降级的服务调用结果

MockClusterInvoker 加载 1、dubbo加载cluster接口,采用了包装类 MockClusterWrapper,来包装Invoke,如下:

image.png <mark 借的图/>

2、MockClusterWrapper 类试下 Invoke接口,并重写join方法

3、消费端服务加载远程服务的代理类(dubbo rpc 调用采用了代理模式)时候,对mock试下进行校验,AbstractInterfaceConfig#checkock方法,关在方法在MockInvoker#normalizeMock中,fial:、force:这些的判断和截取。

Dubbo 服务暴露过程

服务暴露的过程起始于 Spring IOC 容器刷新完成之时,具体的流程就是根据配置得到 URL,再利用 Dubbo SPI 机制根据 URL 的参数选择对应的实现类,实现扩展。
通过 javassist 动态封装 ref (你写的服务实现类),统一暴露出 Invoker 使得调用方便,屏蔽底层实现细节,然后封装成 exporter 存储起来,等待消费者的调用,并且会将 URL 注册到注册中心,使得消费者可以获取服务提供者的信息。

整理流程,分为3块:
1)检查配置,组装成URI
2)暴露服务,暴露服务到本地和远程
3)注册服务到注册中心,用于服务发现

1、dubbo 采用URI的方式,来约定参数的类型,即公共契约

protocol://username:password@host:port/path?key=value&key=value

// protocol:指的是 dubbo 中的各种协议,如:dubbo thrift http
// username/password:用户名/密码
// host/port:主机/端口
// path:接口的名称
// parameters:参数键值对

2、配置解析

采用xml和注解方式
xml ,采用spring 自定义配置文件扩展, 如 dubbo.xsd ,spring 在解析时候回找到spring.schemas 和 spring.handlers ,就是到固定路径下的固定文件中找扩展的内容。
DubboNamespaceHandler 类,负责把标签和对应的解析类关联起来,最终是生成spring的bean定义 BeanDefinition,利用spring 创建对象。

3、Invoker 和 Export
1)服务配置类(ServiceConfig)把具体的服务实现(要暴露的服务),通过代理工厂转成成Invoker
2)Invoker,通过具体的协议,如dubbo协议,转成成Export 。
3)ServiceBean 继承ServiceConfig类型和实现spring的aware ApplicationListener等接口。spring IOC 容器刷新完成后会调用onApplicationEvent方法,暴露服务即在这个方法中。
export方法、doExport方法、doExportUrls方法。dubbo是支持多注册中心和多协议。
loadRegistries方法解析后拼接的结果如下:

registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.2&pid=7960&qos.port=22222&registry=zookeeper&timestamp=1599894821286

doExportUrlsFor1Protocol方法是把配置组成成URL,dubbo暴露服务是根据URL进行服务暴露的(3.0版本是按照应用级别进行暴露的,有差异)

4、本地暴露
exportLocal方法,进行本地暴露,采用injvm协议。涉及了自适应扩展,SPI.Invoker实际是javassist创建的,因为它很快,dubbo 没有使用jdk的动态代理。

5、远程暴露
和本地暴露类似,也是要封装成Invoker。走registry协议 。// TODO 没写完 2022-6-8

Dubbo服务引入过程

Dubbo服务调用过程

Dubbo SPI

参考说明

1、dubbo 2.7 版本官网文档 dubbo.apache.org/zh/docs/v2.…

2、《深入理解 Apache duboo与实战》

3、《深度剖析 Apache dubbo 核心技术内幕》 2.7版本