10. Interview-Dubbo&ZooKeeper

2020-08-05  本文已影响0人  allen锅

1 zookeeper原理 / zookeepr分布式一致性原理

2 讲一下CAP原理?ZooKeeper是什么?Eureka是什么?

3 zookeeper能做什么?zookeeper应用场景?

类似Linux文件系统的树形结构,轻量级的内存文件系统,只适合存储少量信息,不适合存储大量文件或大文件,每个znode默认存储1MB的数据,主要是状态数据。

zookeeper应用场景

利用到zookeeper的中间件

4 zookeeper作为注册中心有什么问题?

5 zookeeper与eureka区别

6 master选举/leader选举

zoo.cfg中electionAlg属性指定1~3,分别对应3中leader选举算法:

leader选举过程

7 zookeeper通信模型

ZooKeeper通信模型

8 zookeeper数据结构(znode默认存储1MB数据)

ZooKeeper跟踪时间的多种方式

在ZooKeeper的每个znode节点的数据结构由以下几个字段组成:

9 服务注册到zookeeper,这些数据保存在哪里?

zoo.cfg中dataDir=/tmp/zookeeper

10 zookeeper怎么实现分布式锁

分布式锁的3种实现方案

zookeeper分布式锁实现方式

zookeeper实现分布式锁原理

zookeeper分布式锁开源实现

zookeeper实现分布式锁用临时节点有什么问题?

11 ZooKeeper三种角色

12 ZooKeeper四种节点

13 ZAB协议

13.1 事务编号Zxid

13.2 ZAB协议的两种模式

13.3 ZAB协议的4个阶段

13.4 ZAB协议的java实现

将原生的ZAB协议的发现阶段和同步阶段合并为恢复阶段。

13.5 投票机制

14 判断长连接是否存活?怎么实现心跳检测机制?

当长连接没有流量时,无法判断是通信异常还是通信正常但无业务流量引起的,需要心跳包来实现。

15 zookeeper写数据流程

zookeeper写数据流程

16 paxos & Raft & ZAB

相同点

异同点

使用场景

17 什么是quorum?什么是NWR?

18 Dubbo原理

Dubbo架构图

Dubbo架构主要分为五个模块:容器、服务提供者、服务消费者、注册中心、监控中心。

  1. 容器启动,运行服务提供者,其实就是一个main程序
  2. 服务提供者启动后,发布服务到注册中心
  3. 消费者启动后,向注册中心订阅服务列表;当服务列表有变化时,注册中心基于长连接推送变更给消费者
  4. 消费者调用服务,服务端根据软负载均衡算法选择一台提供者给消费者调用,如果调用失败,再选择另一台提供调用服务
  5. 服务提供者和消费者在内存中累积调用次数和时间,每隔一分钟发送统计数据给监控中心
  6. 注册中心和监控中心是可选的,即使两个都宕机,也不影响服务提供者和消费者,因为消费者本地缓存了服务列表,可以直连服务提供者
  7. Registry、Provider、Consumer三者之间都是基于长连接的,Monitor不是
  8. Provider全部宕机,服务不可使用,Consumer会无限次重连等待Provider恢复

19 Dubbo服务发现与注册流程

Invoker Exporter

1、调用JavassistProxyFactory 生成一个Invoker。 对应Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));这一段

2、用com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol#export方法 进行一个服务的暴露

3、DubboProtocol#export 方法最终会调用com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistryFactory#createRegistry

进行一个服务注册 这时zookeepr相应的目录下面就会有对应的内容.这时服务注册就算完成了。

20 Dubbo序列化方式?效率上各有什么区别?

21 Dubbo的consumer怎么调provider?Dubbo负载均衡策略?

22 Dubbo的容错机制

Dubbo集群容错模式

23 Dubbo的SPI机制跟Java的SPI有什么区别?

  1. SPI定义
    SPI的全名为Service Provider Interface。JDK的SPI实现了为接口自动寻找实现类的功能。

  2. SPI的使用方式
    当服务提供者提供一个接口的多个实现的时候,一般会在META-INF/services/ 下面建立一个与接口全路径同名的文件,在文件里配置接口具体的实现类。当外部调用模块的时候的时候就能实例化对应的实现类。

  3. JDK和Dubbo实现SPI的异同

    • JDK的SPI用ServiceLoader实现,Dubbo的SPI用ExtensionLoader实现
    • JDK的SPI会在一次实例化所有实现,可能会比较耗时,而且有些可能用不到的实现类也会实例化,浪费资源而且没有选择;Dubbo的SPI是延迟加载的。
    • dubbo的spi文件定义在META-INF/dubbo/internal/路径下面和jdk的spi类似。但是dubbo的spi文件里面格式和jdkSPI有点不一样,是key-value形式,格式是扩展名=全路径的类名。
    • dubbo的spi增加了对扩展点IOC和AOP的支持,一个扩展点可以直接setter注入其他扩展点。这是jdk spi不支持的。

24 Dubbo的group和version

24.1 Dubbo的group属性

<!-- dubbo group 使用示例 -->
<bean id="demoA" class="com.xxx.IndexServiceImpl1" />
<dubbo:service group="feedback" interface="com.xxx.IndexService" ref="demoA" />

<bean id="demoB" class="com.xxx.IndexServiceImpl2" />
<dubbo:service group="member" interface="com.xxx.IndexService" ref="demoB" />
<dubbo:reference id="barService" interface="com.foo.BarService" group="*" />

24.2 Dubbo的version属性

<!-- 机器A提供1.0.0版本服务 -->
<dubbo:service interface="com.foo.BarService" version="1.0.0" />
<!-- 机器B提供2.0.0版本服务 -->
<dubbo:service interface="com.foo.BarService" version="2.0.0" />
<!-- 机器C消费1.0.0版本服务 -->
<dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" />
<!-- 机器D消费2.0.0版本服务 -->
<dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />
<dubbo:reference id="barService" interface="com.foo.BarService" version="*" />

25 Dubbo怎么实现灰度发布?

Dubbo服务调用原理

客户端在发起RPC服务调用之前,在客户端首先从服务器列表中选择一个服务调用者,包含如下关键角色:
   1、Directory
   服务的动态发现,通常基于注册中心进行服务的动态注册与发现,其具体实现类为RegistryDirectory。
   2、Router
   路由实现,其含义是根据Directory发现的所有服务提供者列表中,进行路由选择,也就是根据一定的路由规则选择合适的服务提供者,为Directory发现的服务提供者列表子集,可以基于Condition或脚本(默认为JS脚本,其实现类为ScriptRouter)。
   3、LoadBalance
   负载均衡机制,其作用主要是根据负载均衡算法(随机、轮询)
等算法,从(Directory–>Router)中返回的服务提供者列表中选择一个服务提供者,进行本次的RPC服务调用。
4、Cluster
   集群(容错机制),就是当从服务提供者列表中按照负载均衡算法选择一个服务提供者,进行RPC服务调用后,发送了异常后的策略,例如failover(重试)、failfast(快速失败)等。
   服务的灰度发布,其目标是希望根据请求,某些请求走新版本服务器,某些请求走旧版本服务器,其本质就是路由机制,即通过一定的条件来缩小服务的服务提供者列表,正好与Dubbo的Router相吻合。

30 Dubbo源码

上一篇 下一篇

猜你喜欢

热点阅读