Java 分布式框架面试题合集

Java 分布式框架面试题合集

1.什么是 ZooKeeper?

答:ZooKeeper 是一个开源的分布式应用程序协调服务,是一个典型的分布式数据一致性解决方案。设计目的是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的系统,并以一系列简单易用的原子操作提供给用户使用。

2.ZooKeeper 提供了哪些功能?

答:ZooKeeper 主要提供以下功能:

  • 分布式服务注册与订阅:在分布式环境中,为了保证高可用性,通常同一个应用或同一个服务的提供方都会部署多份,达到对等服务。而消费者就须要在这些对等的服务器中选择一个来执行相关的业务逻辑,比较典型的服务注册与订阅,如 Dubbo。
  • 分布式配置中心:发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZooKeeper 节点上,供订阅者获取数据,实现配置信息的集中式管理和动态更新。
  • 命名服务:在分布式系统中,通过命名服务客户端应用能够根据指定名字来获取资源、服务地址和提供者等信息。
  • 分布式锁:这个主要得益于 ZooKeeper 为我们保证了数据的强一致性。

3.ZooKeeper 有几种搭建模式?

答:ZooKeeper 通常有三种搭建模式:

  • 单机模式:zoo.cfg 中只配置一个 server.id 就是单机模式了,此模式一般用在测试环境,如果当前主机宕机,那么所有依赖于当前 ZooKeeper 服务工作的其他服务器都不能进行正常工作;
  • 伪分布式模式:在一台机器启动不同端口的 ZooKeeper,配置到 zoo.cfg 中,和单机模式相同,此模式一般用在测试环境;
  • 分布式模式:多台机器各自配置 zoo.cfg 文件,将各自互相加入服务器列表,上面搭建的集群就是这种完全分布式。

4.ZooKeeper 有哪些特性?

答: ZooKeeper 特性如下:

  • 顺序一致性(Sequential Consistency):来自相同客户端提交的事务,ZooKeeper 将严格按照其提交顺序依次执行;
  • 原子性(Atomicity):于 ZooKeeper 集群中提交事务,事务将“全部完成”或“全部未完成”,不存在“部分完成”;
  • 单一系统镜像(Single System Image):客户端连接到 ZooKeeper 集群的任意节点,其获得的数据视图都是相同的;
  • 可靠性(Reliability):事务一旦完成,其产生的状态变化将永久保留,直到其他事务进行覆盖;
  • 实时性(Timeliness):事务一旦完成,客户端将于限定的时间段内,获得最新的数据。

5.以下关于 ZooKeeper 描述错误的是?

A:所有的节点都具有稳定的存储能力 B:ZooKeeper 任意节点之间都能够进行通信(消息发送 & 接收) C:为了提高性能,ZooKeeper 允许同一份数据存在一部分节点写成功,另一部分节点写失败 D:ZooKeeper 集群运行期间,只要半数以上节点存活,ZooKeeper 就能正常服务 答:C 题目解析:ZooKeeper 不允许同一份数据存在一部分节点写成功,另一部分节点写失败的情况,这不符合 ZooKeeper“一致性”的原则。

6.ZooKeeper 如何实现分布式锁?

答:ZooKeeper 实现分布式锁的步骤如下:

  • 客户端连接 ZooKeeper,并在 /lock 下创建临时的且有序的子节点,第一个客户端对应的子节点为 /lock/lock-10000000001,第二个为 /lock/lock-10000000002,以此类推。
  • 客户端获取 /lock 下的子节点列表,判断自己创建的子节点是否为当前子节点列表中序号最小的子节点,如果是则认为获得锁,否则监听刚好在自己之前一位的子节点删除消息,获得子节点变更通知后重复此步骤直至获得锁;
  • 执行业务代码;
  • 完成业务流程后,删除对应的子节点释放锁。

7.ZooKeeper 如何实现分布式事务?

答:ZooKeeper 实现分布式事务,类似于两阶段提交,总共分为以下 4 步:

  • 客户端先给 ZooKeeper 节点发送写请求;
  • ZooKeeper 节点将写请求转发给 Leader 节点,Leader 广播给集群要求投票,等待确认;
  • Leader 收到确认,统计投票,票数过半则提交事务;
  • 事务提交成功后,ZooKeeper 节点告知客户端。

8.集群中为什么要有主节点?

答:在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的机器可以共享这个结果,这样可以大大减少重复计算,提高性能,这就是主节点存在的意义。

9.Dubbo 是什么?

答:Dubbo 是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

10.Dubbo 有哪些特性?

答:Dubbo 特性如下:

  • 面向接口代理的高性能 RPC 调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节;
  • 智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量;
  • 服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知;
  • 高度可扩展能力:遵循微内核+插件的设计原则,所有核心能力如 Protocol、Transport、Serialization 被设计为扩展点,平等对待内置实现和第三方实现;
  • 运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能;
  • 可视化的服务治理与运维:提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

11.Dubbo 有哪些核心组件?

答:Dubbo 核心组件如下:

  • Provider:服务提供方
  • Consumer:服务消费方
  • Registry:服务注册与发现的注册中心
  • Monitor:主要用来统计服务的调用次数和调用时间
  • Container:服务的运行容器

12.Dubbo 有哪些负载均衡策略?

答:Dubbo 负责均衡策略如下:

  • 随机负载均衡(Random LoadBalance):按权重设置随机概率,在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重;
  • 轮询负载均衡(RoundRobin LoadBalance):按公约后的权重设置轮询比率,存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上;
  • 最少活跃调用数负载均衡(LeastActive LoadBalance):使用最少活跃调用数,活跃数指调用前后计数差;
  • 哈希负载均衡(ConsistentHash LoadBalance):使用哈希值转发,相同参数的请求总是发到同一提供者。

负载均衡配置如下

服务端服务级别

\

客户端服务级别

\

服务端方法级别

\
   \
\

客户端方法级别

\
   \
\

13.Dubbo 不支持以下哪种协议?

A:dubbo://
B:rmi://
C:redis://
D:restful://

答:D

题目解析:restful 是一种编程规范,并不是一种传输协议,也不被 Dubbo 支持。

14.Dubbo 默认使用什么注册中心,还有别的选择吗?

答:推荐使用 ZooKeeper 作为注册中心,还有 Nacos、Redis、Simple 注册中心(普通的 Dubbo 服务)。

15.Dubbo 支持多注册中心吗?

答:Dubbo 支持同一服务向多注册中心同时注册,或者不同服务分别注册到不同的注册中心上去,甚至可以同时引用注册在不同注册中心上的同名服务。

多注册中心注册:

\
\
    \
    \
                    

你可能感兴趣的:(Java 分布式框架面试题合集)