写在前面

🔥我把后端Java面试题做了一个汇总,有兴趣大家可以看看!这里👉

⭐️在反复复习面试题时,我发现不同资料的解释五花八门,容易造成概念混淆。尤其是很多总结性的文章和视频,要么冗长难记,要么过于简略,导致关键知识点含糊不清。

⭐️为了系统梳理知识,我决定撰写一份面试指南,不只是简单汇总,而是融入个人理解,层层拆解复杂概念,构建完整的知识体系。我希望它不仅帮助自己更自信地应对面试,也能为同行提供清晰、实用的参考。


微服务相关面试题

面试官: Spring Cloud 5大组件有哪些?

候选人:

早期我们一般认为的Spring Cloud五大组件是 :

  • Eureka : 注册中心
  • Ribbon : 负载均衡
  • Feign : 远程调用
  • Hystrix : 服务熔断
  • Zuul/Gateway : 网关

随着SpringCloudAlibba在国内兴起 , 我们项目中使用了一些阿里巴巴的组件:

  • 注册中心/配置中心 Nacos

  • 负载均衡 Ribbon

  • 服务调用 Feign

  • 服务保护 sentinel

  • 服务网关 Gateway

面试官: 服务注册和发现是什么意思?Spring Cloud 如何实现服务注册发现?

候选人:

我理解的是主要三块大功能,分别是服务注册 、服务发现、服务状态监控

我们当时项目采用的Eureka作为注册中心,这个也是Spring Cloud体系中的一个核心组件。

  • 服务注册:服务提供者需要把自己的信息注册到Eureka,由Eureka来保存这些信息,比如服务名称、ip、端口等等。

  • 服务发现:消费者向Eureka拉取服务列表信息,如果服务提供者有集群,则消费者会利用负载均衡算法,选择一个发起调用。

  • 服务监控:服务提供者会每隔30秒向Eureka发送心跳,报告健康状态,如果Eureka服务90秒没接收到心跳,从Eureka中剔除。

面试官: 你能说下nacos与eureka的区别?

候选人:

我当时有个项目就是采用的Nacos作为注册中心,选择Nacos还要一个重要原因就是它支持配置中心,不过Nacos作为注册中心,也比Eureka要方便好用一些,主要相同不同点在于几点:

  • 共同点:Nacos与Eureka都支持服务注册和服务拉取,都支持服务提供者心跳方式做健康检测。

  • Nacos与Eureka的区别

①Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式

②临时实例心跳不正常会被剔除,非临时实例则不会被剔除

③Nacos支持服务列表变更的消息推送模式,服务列表更新更及时

④Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

面试官: 你们项目负载均衡如何实现的 ?

候选人:

在服务调用过程中的负载均衡一般使用SpringCloud的Ribbon 组件实现 , Feign的底层已经自动集成了Ribbon , 使用起来非常简单。

当发起远程调用时,Ribbon先从注册中心拉取服务地址列表,然后按照一定的路由策略选择一个发起远程调用,一般的调用策略是轮询。

面试官: Ribbon负载均衡策略有哪些 ?

候选人:

我想想啊,有很多种,我记得几个:

  • RoundRobinRule:简单轮询服务列表来选择服务器

  • WeightedResponseTimeRule:按照权重来选择服务器,响应时间越长,权重越小

  • RandomRule:随机选择一个可用的服务器

  • ZoneAvoidanceRule:区域敏感策略,以区域可用的服务器为基础进行服务器的选择(就近原则)。

面试官: 如果想自定义负载均衡策略如何实现 ?

候选人:

提供了两种方式:

1,创建类实现IRule接口,可以指定负载均衡策略,这个是全局的,对所有的远程调用都起作用

public class CustomLoadBalancer implements IRule {private Random random = new Random();private ZoneAwareLoadBalancer<Server> loadBalancer;@Overridepublic Server choose(Object key) {List<Server> servers = loadBalancer.getAllServers();return servers.get(random.nextInt(servers.size())); // 随机选择一个服务器}@Overridepublic void setLoadBalancer(ZoneAwareLoadBalancer<Server> lb) {this.loadBalancer = lb;}@Overridepublic ZoneAwareLoadBalancer<Server> getLoadBalancer() {return loadBalancer;}
}

2,在客户端的配置文件中,可以配置某一个服务调用的负载均衡策略,只是对配置的这个服务生效

serviceName:ribbon:NIWSServerList: "service1,service2,service3"rule: "customRule" # 指定使用自定义的负载均衡策略

面试官: 什么是服务雪崩,怎么解决这个问题?

候选人:

服务雪崩是指一个服务失败,导致整条链路的服务都失败的情形,一般我们在项目解决的话就是两种方案,第一个是服务降级,第二个是服务熔断,如果流量太大的话,可以考虑限流。

服务熔断:当某个微服务不可用或者响应时间太长时,会进行服务降级,进而熔断该结点微服务的调用,快速返回“错误”的响应信息。当检测到该结点微服务调用响应正常后恢复调用链路。在 Spring Cloud 框架里熔断机制通过 Hystrix 实现, Hystrix 会监控微服务间调用的状况,当失败的调用到一定阈值,默认是5s 内调用 20 次,如果失败,就会启动熔断机制。(服务熔断 是为了防止系统因某个服务故障而崩溃,快速停止对该服务的调用)

服务降级:服务降级,一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的 fallback 回调,返回一个默认值。这样做,虽然服务水平下降,但比直接挂掉强。(服务降级 是在服务熔断后,提供一个简化的响应或默认值,确保用户仍然能继续使用系统的其他功能)

在这里插入图片描述

在Feign接口上的@FeignClient里添加fallback配置,配置的是实现服务降级的类,这类继承了当前接口,并覆盖接口类中的相应方法,方法中实现用户想做的fallback处理。

面试官: 你们项目中有没有做过限流 ? 怎么做的 ?

候选人:

针对XXX项目的XXX模块,我们实现了限流,以应对优质课程发布时可能出现的高QPS。具体做法:我们采用了令牌桶算法,每秒生成固定数量的令牌,只有在获取到令牌后,请求才能被处理,确保流量在可控范围内。

我的思路是通过创建一个 TokenBucket 类来实现令牌桶算法,包含四个主要属性:桶的容量、令牌生成速率、当前令牌数量,以及上次补充令牌的时间。定义了一个 tryConsume 方法,用于尝试获取令牌。在这个方法中,首先调用 refill 方法计算可用的令牌数量。如果当前桶中有令牌,就消费一个;否则返回失败,表示流量受限。在 refill 方法中,根据当前时间和上次补充时间的差值计算可以生成的令牌数量,并更新当前令牌数量,确保不超过桶的最大容量。

import java.util.concurrent.TimeUnit;public class TokenBucket {private final long capacity; // 桶的容量private final long rate; // 令牌生成速率private long tokens; // 当前令牌数量private long lastRefillTimestamp; // 上次补充令牌的时间public TokenBucket(long capacity, long rate) {this.capacity = capacity;this.rate = rate;this.tokens = 0;this.lastRefillTimestamp = System.currentTimeMillis();}public synchronized boolean tryConsume() {refill();if (tokens > 0) {tokens--;return true; // 成功获取令牌}return false; // 令牌不足}private void refill() {long now = System.currentTimeMillis();long newTokens = (now - lastRefillTimestamp) * rate / 1000; // 计算补充的令牌数量tokens = Math.min(capacity, tokens + newTokens);lastRefillTimestamp = now;}
}

面试官: 限流常见的算法有哪些呢?

候选人:

比较常见的限流算法有漏桶算法令牌桶算法

漏桶算法是把请求存入到桶中,以固定速率从桶中流出,可以让我们的服务做到绝对的平均,起到很好的限流效果。

令牌桶算法在桶中存储的是令牌,按照一定的速率生成令牌,每个请求都要先申请令牌,申请到令牌以后才能正常请求,也可以起到很好的限流作用。

☘️区别:

漏桶算法可以平滑处理流量,确保请求按照一定的速率被处理。即使有很多请求涌入,桶只会以固定速度漏出,保证流量平稳。但是不能解决流量突发的问题。Nginx通常采用漏桶算法,适合需要严格控制流量的场景。

令牌桶算法能处理突发流量,如果在某段时间没有请求,桶里会积累令牌;当请求突然增多时,可以一次性处理多个请求。Spring Cloud Gateway:它支持令牌桶算法,更适合需要灵活处理流量的场景,能够容忍短时间内的流量突发。

面试官:什么是CAP理论?

候选人

CAP主要是在分布式项目下的一个理论。包含了三项,一致性、可用性、分区容错性

image

  • **一致性(Consistency)**是指更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致(强一致性),不能存在中间状态。

  • 可用性(Availability) 是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。

  • 分区容错性(Partition tolerance) 是指分布式系统在遇到任何网络分区故障时,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。

面试官:为什么分布式系统中无法同时保证一致性和可用性?

候选人

首先一个前提,对于分布式系统而言,分区容错性是一个最基本的要求,因此基本上我们在设计分布式系统的时候只能从一致性(C)和可用性(A)之间进行取舍。

如果保证了一致性(C):对于节点N1和N2,当往N1里写数据时,N2上的操作必须被暂停,只有当N1同步数据到N2时才能对N2进行读写请求,在N2被暂停操作期间客户端提交的请求会收到失败或超时。显然,这与可用性是相悖的。

如果保证了可用性(A):那就不能暂停N2的读写操作,但同时N1在写数据的话,这就违背了一致性的要求。

面试官:什么是BASE理论?

候选人

BASE是CAP理论中AP方案的延伸,核心思想是即使无法做到强一致性,但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。它的思想包含三方面:

在这里插入图片描述

1、Basically Available(基本可用):基本可用是指分布式系统在出现不可预知的故障的时候,允许损失部分可用性,但不等于系统不可用。

2、Soft state(软状态):即是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。

3、Eventually consistent(最终一致性):强调系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。其本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94857.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94857.shtml
英文地址,请注明出处:http://en.pswp.cn/web/94857.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

循环神经网络——pytorch实现循环神经网络(RNN、GRU、LSTM)

循环神经网络——pytorch实现循环神经网络&#xff08;RNN、GRU、LSTM&#xff09; 本文将深入探讨循环神经网络的理论基础&#xff0c;并通过PyTorch深度学习框架来展示如何实现循环神经网络模型。我们将首先介绍循环神经网络的基本概念。通过PyTorch代码示例&#xff0c;我们…

系统架构设计师备考第8天——嵌入式系统

一、嵌入式系统概述定义 为特定应用构建的专用计算机系统&#xff0c;软硬件紧密结合&#xff0c;满足功能、可靠性、成本、体积、功耗等严格要求。核心特征&#xff1a;专用性强、技术融合&#xff08;计算机通信半导体技术&#xff09;、软硬一体以软件为主、资源受限、程序固…

HarmonyOS 中的 sharedTransition:实现流畅的页面过渡动画

HarmonyOS 中的 sharedTransition&#xff1a;实现流畅的页面过渡动画 在移动应用开发中&#xff0c;页面之间的过渡动画是提升用户体验的关键因素之一。HarmonyOS 提供了 sharedTransition 功能&#xff0c;让开发者能够轻松实现元素在不同页面间的平滑过渡效果&#xff0c;创…

【服务器】Apache Superset MCP接入与使用

1. 概述 Apache Superset MCP 集成&#xff08;superset-mcp&#xff09;是一个基于 Model Control Protocol&#xff08;MCP&#xff09;的服务器工具&#xff0c;旨在实现 AI 代理与 Apache Superset 的程序化交互。该项目通过提供标准化的工具接口&#xff0c;使 AI 助手&a…

Postman接口测试:postman设置接口关联,实现参数化

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快postman设置接口关联在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这个过程的…

第一个,QT版本问题:no member named SkipEmptyParts‘in namespace ‘Qt

这是我朋友给我发过来的代码&#xff0c;但是在我电脑上报错了&#xff0c;遇到的问题是 Qt 版本兼容导致的编译错误。这是因为我的是5.12版本&#xff0c;他的是6.4版本&#xff0c;Qt::SkipEmptyParts只能在6版本使用&#xff0c;无法在5.12甚至更早的版本使用&#xff0c;具…

【PostgreSQL内核学习:通过 ExprState 提升哈希聚合与子计划执行效率(二)】

PostgreSQL内核学习&#xff1a;通过 ExprState 提升哈希聚合与子计划执行效率&#xff08;二&#xff09;引言ExecBuildHash32FromAttrs示例 SQL 查询函数运行流程与代码解释最终 ExprState 结构执行示例总结ExecComputeSlotInfo示例 SQL 查询函数注释与解释作用参数返回值执行…

技术分析 | Parasoft C/C++test如何突破单元测试的隔离难题

单元测试是保证软件质量的第一道防线&#xff0c;但其推行往往面临两大阻力&#xff1a;一是编写和维护测试用例耗时费力&#xff0c;二是难以与现有项目和团队习惯无缝集成。Parasoft C/Ctest 通过其强大的图形化测试创建能力、自动桩函数技术以及卓越的生态集成性&#xff0c…

K8S架构与组件完全解析

目录 K8S-组件介绍 一、概述 K8S的由来 K8S的功能 K8S解决的问题 K8S的特性 二、K8S架构与组件 K8S架构 K8S组件 master 节点组件 Kube-apiserver Kube-controller-manager Kube-scheduler etcd node节点组件 Kubelet Kube-Proxy Controller Runtime Pod 三…

Jenkins 执行器(Executor)并发数量修改

Jenkins 执行器&#xff08;Executor&#xff09;并发数量修改一、什么是 Jenkins 执行器&#xff08;Executor&#xff09;&#xff1f;二、为什么默认是 2&#xff1f;三、如何修改 Jenkins 执行器数量&#xff1f;1. 进入 Jenkins 管理页面2. 找到节点配置3. 选择需要修改的…

vue3使用reactive和ref

<script setup>import { ref } from vueconst count ref(0) console.log(count.value)</script><template></template>ref需要注意&#xff0c;在script脚本区域需要加上.value&#xff0c;然后在template模板区域使用不需要带.value

(笔记)InputChannel跨进程传输机制深度分析

概述 InputChannel是Android输入系统中负责跨进程事件传输的核心组件&#xff0c;它建立了InputDispatcher&#xff08;SystemServer进程&#xff09;与应用程序&#xff08;App进程&#xff09;之间的高效通信通道。本文深入分析InputChannel的实现机制&#xff0c;包括socket…

AI实时故障诊断系统(实时采集信号)

1.摘要 本文设计了一套“基于Labview的旋转机械信号分析与故障诊断系统&#xff08;可部署AI模型和实时监测设备运行状态&#xff09;”。首先&#xff0c;LabVIEW 端构建了信号采集与设备状态实时监测模块和本地数据故障诊断模块。该系统实现了“数据采集、数据处理、时频域特…

【51单片机】【protues仿真】基于51单片机篮球计时计分器数码管系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、数码管显示 1、比赛时间为15&#xff1a;00&#xff0c;甲乙队比分默认000&#xff0c;通过按键修改 3、比赛运行的状态下&#xff0c;按开始暂停键&#xff0c;比赛暂停&#…

[读论文]Hunyuan 3D 系列

1.0&#xff1a; &#xff08;adaptive clasisfier guidance&#xff0c;input 输入一个没cam的branch&#xff1b;提高triplane分辨率&#xff09; 总结&#xff1a; 大规模再train zero123&#xff0c;但角度设置不同&#xff1b;adaptive clasisfier guidance&#xff08;f…

深入理解文本向量嵌入(Vector Embeddings):原理、实践与应用场景

深入理解文本向量嵌入&#xff08;Vector Embeddings&#xff09;&#xff1a;原理、实践与应用场景 1. 什么是向量嵌入&#xff1f; 文本向量嵌入&#xff08;Vector Embedding&#xff09;是一种将文本转化为数值向量的技术&#xff0c;使得字符串之间的关联性可以通过数值…

微论-神经网络中记忆的演变

从微突触到宏认知&#xff1a;论神经网络中记忆的生成、固化与演化人脑的智能&#xff0c;并非源于单个神经元的孤立活动&#xff0c;而是诞生于由万亿突触连接所构成的庞大而复杂的网络动态之中。在这个网络中&#xff0c;连接权重的强度分布——即强的约束与弱的变数——共同…

机器视觉学习-day07-图像镜像旋转

图像的镜像旋转分为三种&#xff0c;分别使用filpcode的参数表示&#xff1a;flipcode0&#xff0c;垂直翻转&#xff08;x轴为中线&#xff09; 垂直翻转可以把src沿着x轴翻转&#xff0c;坐标从&#xff08;x,y&#xff09;翻转为(x,-y)。flipcode>0&#xff0c;水平翻转&…

Python备份实战专栏第2/6篇:30分钟搭建企业级API认证系统,安全性吊打90%的方案

30分钟搭建企业级API认证系统&#xff0c;安全性吊打90%的方案 专栏导语&#xff1a;《从零到一&#xff1a;构建企业级Python Web自动化备份系统实战指南》第2篇 作者简介&#xff1a;madechango架构师&#xff0c;负责设计零安全事故的API认证系统&#xff0c;拦截100%非法请…

第6篇:链路追踪系统 - 分布式环境下的请求跟踪

项目地址&#xff1a;https://github.com/nemoob/atlas-log 开箱即用。前言 在微服务架构中&#xff0c;一个用户请求往往会经过多个服务的协作处理。本章将实现一个轻量级的链路追踪系统&#xff0c;让日志具备分布式追踪能力。 分布式链路追踪基础概念 链路追踪的核心价值 #m…