Dubbo面试回答简单版

一、dubbo特性

  1. 超时重试机制
  2. 地址缓存
  3. 多版本
  4. 负载均衡:随机、权重轮询、最少活跃调用、一致性哈希
  5. 集群容错:失败重试、快速失败、失败安全、失败自动恢复、并行调用、广播
  6. 服务降级:异常时返回mock

集群容错

FailOver 失败重试,读操作

FailFast 快速失败,只调用一次,失败后立即抛出异常。 写操作

FailSafe 失败安全 出现异常 直接忽略,记录日志不抛出异常,返回空结果

failBack 失败自动恢复,失败后记录日志和调用信息,返回空结果,每隔5秒重试

forking 并行调用,有一个结果返回就返回成功

广播,逐个调用,其中有一个失败,抛出异常

二、服务暴露

简单的很:IOC实例化bean后,事件启动后-》根据配置获取url-》根据URL获取实现类->动态封装实现类->暴露出invoker-》封装成exporter等待消费者调用-》注册信息到注册中心

首先,服务器端(服务提供者)在框架启动时,会初始化服务实例,通过Proxy组件调 用具体协议(Protocol ),把服务端要暴露的接口封装成Invoker (真实类型是 AbstractProxylnvoker ,然后转换成Exporter,这个时候框架会打开服务端口等并记录服务实例 到内存中,最后通过Registry把服务元数据注册到注册中心。这就是服务端(服务提供者)整 个接口暴露的过程。

Proxy组件:我们知道,Dubbo中只需要引用一个接口就可以调用远程的服务,并且

只需要像调用本地方法一样调用即可。其实是Dubbo框架为我们生成了代理类,调用

的方法其实是Proxy组件生成的代理方法,会自动发起远程/本地调用,并返回结果,

整个过程对用户完全透明。

• Protocol:顾名思义,协议就是对数据格式的一种约定。它可以把我们对接口的配置,

根据不同的协议转换成不同的Invoker对象。例如:用DubboProtocol可以把XML文

件中一个远程接口的配置转换成一个Dubbolnvoker。

• Exporter:用于暴露到注册中心的对象,它的内部属性持有了 Invoker对象,我们可以

认为它在Invoker上包了 一层。

• Registry:把Exporter注册到注册中心。

服务调用

调用之前生成的代理类,从cluster中经过负载均衡等选择一个invoker进行调用,会记录请求和请求id,服务端根据参数选择exporter,调用真正的实现类,得到结果后,根据请求id将结果放到等待的线程中,消费者最后得到响应。

服务引入

ReferenceBean实现了FactoryBean接口,当对任意服务Interface进行自动注入或者getBean获取时,就会触发getObject()函数的服务引用过程。-》获取注册中心实例-》向注册中心注册自己,并订阅provoder configurator router 节点-》触发invoker的生产:cluster将多个服务调用者进行封装返回i一个invoker-》通过配置map构建url,再根据url上的协议调用其refer获得invoker-》构建代理,封装invoker返回代理类给consumer调用

分层


工作流程

节点角色说明:

Provider:暴露服务的服务提供方。

Consumer::调用远程服务的服务消费方。

Registry:服务注册与发现的注册中心。

Monitor:统计服务的调用次调和调用时间的监控中心。

Container:服务运行容器。

调用关系说明:

0.服务容器负责启动,加载,运行服务提供者。

1.服务提供者在启动时,向注册中心注册自己提供的服务。

2.服务消费者在启动时,向注册中心订阅自己所需的服务。

3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送次统计数据到监控中心。

配置中心的订阅/发布

订阅通常有pull和push两种方式,一种是客户端定时轮询注册中心拉取配置,另一种是注册中心主动推送数据给客户端。这两种方式各有利弊,Dubbo采用的是第一次启动拉取方

式,后续接收事件重新拉取数据。

在服务暴露时,服务端会订阅configurators用于监听动态配置,在消费端启动时,消费端会订阅providers、routers和configuratops这三个目录,分别对应服务提供者、路由和动

态配置变更通知。

ZooKeeper注册中心采用的是"事件通知" + "客户端拉取"的方式,客户端在第一次连接上注册中心时,会获取对应目录下全量的数据。并在订阅的节点上注册一个watcher,客户端与

注册中心之间保持TCP长连接,后续每个节点有任何数据变化的时候,注册中心会根据watcher的回调主动通知客户端(事件通知),客户端接到通知后,会把对应节点下的全量数据都拉取过

来(客户端拉取),这一点在NotifyListener#notify List urls 接口上就有约束的注释说明。全量拉取有一个局限,当微服务节点较多时会对网络造成很大的压力。

zk集群挂掉,provider和consumer还能通信吗

可以,因为当启动dubbo容器时,消费者会去zookeeper拉取注册的生产者地址列表,并将其缓存在本地。每次发起调用时,都会按照本地的地址列表,以负载均衡的策略去进行调用。但是zookeeper挂掉则后续新的生产者无法被消费

者发现。

1、注册中心对等集群,任意一台宕掉后,会自动切换到另一台

2、注册中心全部宕掉,服务提供者和消费者仍可以通过本地缓存通讯

3、服务提供者无状态,任一台宕机后,不影响使用

4、服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复

相关推荐
测试界萧萧6 小时前
15:00面试,15:08就出来了,问的问题有点变态。。。
自动化测试·软件测试·功能测试·程序人生·面试·职场和发展
先生先生3936 小时前
Java小公司面试
面试
小天努力学java7 小时前
【面试系列】深入浅出 Spring
java·spring·面试
-$_$-8 小时前
【LeetCode 面试经典150题】详细题解之哈希表篇
leetcode·面试·散列表
正在绘制中8 小时前
Java重要面试名词整理(八):RabbitMQ
java·面试·java-rabbitmq
唐 城9 小时前
Solon v3.0.5 发布!(Spring 可以退休了吗?)
java·spring·log4j
Mr.朱鹏10 小时前
操作002:HelloWorld
java·后端·spring·rabbitmq·maven·intellij-idea·java-rabbitmq
小小药11 小时前
009-spring-bean的实例化流程
java·数据库·spring
-$_$-11 小时前
【LeetCode 面试经典150题】详细题解之滑动窗口篇
算法·leetcode·面试
DogDaoDao13 小时前
leetcode 面试经典 150 题:矩阵置零
数据结构·c++·leetcode·面试·矩阵·二维数组·矩阵置零