Spring Cloud 面试题(五)
1. Eureka的自我保护模式是什么?
Eureka的自我保护模式是一种应对网络异常的安全保护措施,旨在防止因网络分区或其他异常情况导致服务实例被错误地注销。当Eureka Server在短时间内丢失过多的客户端心跳时,会触发自我保护机制。以下是自我保护模式的几个关键点[40][41][46]:
-
触发条件:
- 当Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,且这种情况在15分钟内超过85%的客户端节点发生时,Eureka Server将认为出现了网络故障,并自动进入自我保护模式。
-
行为变化:
- 在自我保护模式下,Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务实例。
-
继续服务:
- Eureka Server仍然能够接受新服务的注册和查询请求,但这些信息不会被同步到其他节点上,保证当前节点依然可用。
-
网络恢复:
- 当网络稳定时,当前Eureka Server上新的注册信息会被同步到其他节点中。
-
设计哲学:
- 自我保护模式的设计理念是宁可同时保留所有微服务(包括健康的和不健康的),也不盲目注销任何健康的微服务。
-
退出机制:
- 一旦网络分区故障恢复,Eureka Server节点会自动退出自我保护模式,并恢复正常的服务注册和注销行为。
-
参数配置:
- Eureka Server的自我保护模式默认是开启的,可以通过参数
eureka.server.enable-self-preservation=false
来关闭。 - 还有一个参数
eureka.server.renewalPercentThreshold
用于设置触发自我保护的心跳丢失阈值(默认值为0.85,即85%)。
- Eureka Server的自我保护模式默认是开启的,可以通过参数
自我保护模式使得Eureka集群在面对网络异常时能够更加健壮和稳定,避免因网络问题导致的服务不可用。然而,在实际生产环境中,如果网络环境稳定,可以考虑关闭自我保护模式以避免长时间保留不健康的服务实例[41]。
2. 简述什么是CAP,并说明Eureka包含CAP中的哪些?
CAP定理,又称为布鲁尔定理(Brewer’s theorem),是分布式计算中的一个概念,由计算机科学家埃里克·布鲁尔(Eric Brewer)提出。CAP定理指出,在网络分区发生的情况下,一个分布式系统不可能同时满足以下三个特性:
-
一致性(Consistency):在分布式系统中,所有数据的副本始终保持一致的状态。
-
可用性(Availability):系统在任何时刻都能够响应客户的请求。
-
分区容错性(Partition Tolerance):系统在网络分区(即网络通信不可靠的场景下)仍然能够继续运作。
CAP定理的核心思想是,一个分布式系统在发生分区故障时,只能在一致性和可用性之间选择两个来保证。
Eureka 是Netflix开源的服务发现框架,它是Spring Cloud体系中的核心组件之一。Eureka包含CAP定理中的分区容错性(Partition Tolerance),因为它的主要目的是在分布式系统中提供服务的注册与发现,即使在网络分区发生的情况下,Eureka集群中的节点也能够独立地继续提供服务。
Eureka本身并不强调强一致性(Consistency),而是更倾向于最终一致性。这意味着在正常情况下,Eureka能够保证服务注册信息的一致性,但在网络分区或其他异常情况下,它可能会暂时允许一些不一致性存在,直到系统恢复到正常状态。
Eureka通过以下机制来实现CAP中的分区容错性:
-
服务注册与续约机制:服务实例在启动时向Eureka注册自己,并定期发送心跳(续约)以表明自己的存活状态。
-
服务下线保护:Eureka提供了服务下线保护机制,避免因网络抖动导致的服务下线。
-
区域感知性:Eureka客户端优先访问同一区域的服务实例,增强了系统的可用性。
-
自我保护机制:在网络分区或其他异常情况下,Eureka会启动自我保护机制,避免因过度的网络通信导致系统雪崩。
总的来说,Eureka作为服务发现组件,其设计重点在于保证系统的高可用性和分区容错性,而在一致性方面,它允许一定程度的最终一致性,以适应分布式系统的需求。
3. 什么是Spring Cloud Zuul(服务网关)
Spring Cloud Zuul是Netflix开源的一个微服务网关组件,它在Spring Cloud体系中作为服务网关使用,用于在微服务架构中统一处理外部请求。Zuul提供了路由、过滤、监控等功能,是微服务架构中不可或缺的一部分。
Spring Cloud Zuul的主要特点和功能包括:
-
路由转发:
- Zuul可以根据路由规则将外部请求转发到后端的特定服务。
-
过滤器:
- Zuul拥有一套强大的过滤器机制,可以在请求到达后端服务之前或之后执行过滤逻辑,如身份验证、日志记录、请求头修改等。
-
服务发现集成:
- Zuul可以与Eureka等服务发现组件集成,动态地感知服务实例的变化。
-
负载均衡:
- Zuul可以与Ribbon等负载均衡器集成,实现请求的负载均衡。
-
认证和安全:
- Zuul提供了认证和安全机制,可以拦截请求并进行用户认证、权限校验等。
-
压力测试:
- Zuul可以用来模拟高负载情况,对后端服务进行压力测试。
-
服务降级:
- 当检测到服务不可用时,Zuul可以返回预定义的错误页面或进行服务降级处理。
-
弹性和容错:
- Zuul支持断路器模式,可以提高系统的弹性和容错能力。
-
简化的服务治理:
- Zuul作为统一的请求入口,简化了服务治理和请求路由。
-
统一的跨服务请求处理:
- Zuul可以统一处理跨服务的请求,如统一添加或删除请求头、参数等。
-
插件系统:
- Zuul拥有丰富的插件系统,可以通过插件扩展功能,如日志记录、请求修改等。
-
配置管理:
- Zuul支持动态配置,可以实时更新路由规则和过滤器逻辑。
-
响应式编程支持:
- Zuul支持响应式编程,与Spring WebFlux等响应式堆栈兼容。
-
易于集成:
- Zuul可以轻松地集成到Spring Cloud体系中,与Spring Boot应用无缝协作。
-
容器化和微服务架构:
- Zuul适合在容器化和微服务架构中使用,支持服务的快速迭代和持续部署。
-
请求日志和调试:
- Zuul可以记录详细的请求日志,方便问题追踪和调试。
-
API版本管理:
- Zuul可以方便地管理API版本,简化版本迁移和兼容性管理。
使用Zuul作为服务网关,可以为微服务架构带来统一的请求处理、安全认证、服务路由和监控等功能,提高系统的可维护性和可扩展性。
4. Zuul与Nginx有什么区别?
Zuul和Nginx都是流行的网关服务器,它们可以处理HTTP请求的路由、负载均衡、认证等,但它们有一些关键的区别:
-
开发语言:
- Zuul是用Java开发的,并且是Spring Cloud体系中的一个开源API Gateway服务器。
- Nginx是用C语言开发的,是一个高性能的HTTP和反向代理服务器,同时也是IMAP/POP3/SMTP服务器。
-
负载均衡实现:
- Nginx实现负载均衡通常是在服务器端进行,通过自身的配置来实现。
- Zuul实现负载均衡是通过与Spring Cloud的其他组件(如Ribbon和Eureka)结合使用来实现客户端负载均衡。
-
适用场景:
- Nginx通常用于服务器端负载均衡,适合处理静态内容和代理大量并发请求。
- Zuul更适合在微服务架构中作为服务网关,处理动态请求并提供微服务间的路由。
-
功能丰富性:
- Nginx功能相对更加强大,可以整合脚本语言如Lua,提供更灵活的扩展。
- Zuul提供了动态路由、监控、弹性和安全等边缘服务的框架,但相比Nginx可能在某些方面功能上不够强大。
-
性能:
- Nginx由于是用C语言编写,性能通常非常高,特别是在处理静态内容和高并发请求时。
- Zuul的性能可能会受到Java虚拟机(JVM)性能的影响,特别是启动时的加载时间。
-
异步处理:
- Zuul 1是基于Servlet框架构建的,采用阻塞和多线程方式处理请求。
- Nginx通常以同步方式处理请求,但社区版和Plus版提供了一些异步处理能力。
-
版本更新:
- Zuul 2在设计上运行在异步和非阻塞框架上,每个CPU核一个线程,处理所有的请求和响应,这可以显著提升性能。
-
社区和生态:
- Nginx拥有一个非常活跃的社区,并且有许多第三方模块可供扩展。
- Zuul作为Spring Cloud生态的一部分,与Spring Boot、Spring Cloud Config等组件紧密集成。
总的来说,选择Zuul还是Nginx取决于具体的应用场景、技术栈以及性能要求。如果项目已经基于Spring Cloud,Zuul可能会更自然地融入整个技术生态;而对于需要高性能、处理大量静态内容或需要高度定制化的场景,Nginx可能是更好的选择。
5. ZuulFilter常用有哪些方法?
在Spring Cloud Zuul中,ZuulFilter
是一个过滤器的抽象类,开发者可以通过继承这个类来创建自定义的过滤器。ZuulFilter
中定义了一些方法,这些方法可以在请求的不同阶段执行特定的逻辑。以下是一些常用的ZuulFilter
方法:
-
init():
- 过滤器初始化方法,Zuul会在过滤器实例化时调用此方法一次。
-
run():
- 过滤器执行方法,包含过滤器的主要逻辑。此方法必须被实现,并且会针对每个请求调用。
-
shouldFilter():
- 决定是否执行过滤器的方法。如果返回
false
,则run()
方法不会被调用。
- 决定是否执行过滤器的方法。如果返回
-
preRoute():
- 在路由请求之前调用,在请求被发送到后端服务之前进行前置处理。
-
postRoute():
- 在路由请求之后调用,在请求已经被发送到后端服务并且响应返回之后进行后置处理。
-
onError():
- 当请求处理过程中发生错误时调用,可以用于错误处理和记录。
-
filterType():
- 定义过滤器的类型,常见的类型有
pre
、route
、post
和error
。
- 定义过滤器的类型,常见的类型有
-
filterOrder():
- 返回过滤器的顺序值,决定过滤器链中各个过滤器的执行顺序。
-
isAsync():
- 标识过滤器是否异步执行,默认为同步。
通过实现ZuulFilter
类并覆盖这些方法,开发者可以插入自己的逻辑来处理请求,例如身份验证、日志记录、请求修改、响应修改、异常处理等。自定义过滤器可以注册为Spring Bean,并配置它们的顺序和类型,以便在Zuul的过滤器链中按照预期的方式执行。
使用ZuulFilter
时,需要考虑过滤器的执行顺序和类型,以确保过滤器逻辑的正确性和高效性。开发者可以根据需要选择性地实现这些方法,构建满足特定业务需求的过滤器。
6. Ribbon是什么?
Ribbon是一个客户端负载均衡器,它提供了一种在客户端应用中实现负载均衡的机制。Ribbon通常与服务发现组件(如Eureka)结合使用,在Spring Cloud体系中,它被广泛用于微服务架构中各个服务之间的调用。
Ribbon的主要特点包括:
-
负载均衡:Ribbon能够在多个服务实例之间分配请求,以实现负载均衡。
-
服务发现集成:Ribbon可以与Eureka、Consul等服务发现组件集成,动态地感知服务实例的变化。
-
多种负载均衡策略:Ribbon支持多种负载均衡算法,如轮询、随机、权重响应等。
-
可扩展性:Ribbon允许开发者自定义负载均衡策略,以满足特定的业务需求。
-
与Spring Cloud集成:Ribbon与Spring Cloud紧密集成,提供了对Spring Cloud应用的原生支持。
-
客户端功能:Ribbon作为一个客户端组件,可以与任何客户端库一起工作,如RestTemplate、FeignClient等。
-
配置灵活性:Ribbon可以通过配置文件或编码方式进行灵活配置。
-
监控和度量:Ribbon提供了对服务调用的监控和度量支持,有助于性能优化。
-
容错性:Ribbon可以与断路器模式(如Hystrix)结合使用,提高系统的容错性。
Ribbon的设计目标是简化客户端的负载均衡实现,使得开发者可以专注于业务逻辑,而不必担心后端服务的负载均衡和故障转移等问题。通过Ribbon,开发者可以很容易地为Spring Cloud应用添加负载均衡功能,提高系统的可用性和伸缩性。
相关文章:
Spring Cloud 面试题(五)
1. Eureka的自我保护模式是什么? Eureka的自我保护模式是一种应对网络异常的安全保护措施,旨在防止因网络分区或其他异常情况导致服务实例被错误地注销。当Eureka Server在短时间内丢失过多的客户端心跳时,会触发自我保护机制。以下是自我保…...

源码编译安装LAMP
1.LAMP介绍 LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词,具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP(…...

html5网页-浏览器中实现高德地图定位功能
介绍 HTML5是当前Web开发中最常用的技术之一,而地图应用又是其中一个非常常见的需求。高德地图是国内最受欢迎的地图服务提供商之一,他们提供了一系列的API,方便开发者在自己的网站或应用中集成地图功能。 接下来我们如何使用HTML5浏览器和高…...

C从零开始实现贪吃蛇大作战
个人主页:星纭-CSDN博客 系列文章专栏 : C语言 踏上取经路,比抵达灵山更重要!一起努力一起进步! 有关Win32API的知识点在上一篇文章: 目录 一.地图 1.控制台基本介绍 2.宽字符 1.本地化 2.类项 3.setlocale函…...
国内外相机在LabVIEW图像处理的对比
概述 本文对比国内外相机在LabVIEW进行图像处理的区别,探讨各自的特点。国内相机如大恒和海康威视,具有较高性价比和本地化支持;国外品牌如Basler和FLIR则以高性能和稳定性著称。两者在驱动兼容性、图像质量和技术支持方面各有优势。 详细对…...
第四十五天 | 322.零钱兑换
题目:322.零钱兑换 尝试解答: 1.确定dp[j]含义:装满容量为j的背包所需要放的硬币个数为dp[j]; 2.动态转移方程:dp[j] dp[j - coins[i]] 1; 3.遍历顺序:本题应该为组合类题目,不考虑装入的顺序&#x…...

3D 生成重建011-LucidDreamer 优化SDS过平滑结果的一种探索
3D 生成重建011-LucidDreamer 优化SDS过平滑结果的一种探索 文章目录 0论文工作1论文方法2 效果 0论文工作 文本到3D生成的最新进展标志着生成模型的一个重要里程碑,为在各种现实场景中创建富有想象力的3D资产打开了新的可能性。虽然最近在文本到3D生成方面的进展…...
ES6 笔记04
01 异步函数的使用 es6推出了一种按照顺序执行的异步函数的方法 async 异步函数 async异步函数可以解决promise封装异步代码,调用时一直then链式编程时比较麻烦的问题 定义异步函数: async function 函数名(){ await 表达式1或者函数的调用1 await 表达式2或者函数的调用2 ...…...

中间件-------RabbitMQ
同步和异步 异步调用 MQ MQ优势:①服务解耦 ②异步调用 ③流量削峰 结构 消息模型 RabbitMQ入门案例,实现消息发送和消息接收 生产者: public class PublisherTest {Testpublic void testSendMessage() throws IOException, TimeoutExce…...
flink Data Source数据源
flink Data Source数据源 Source 并行度 非并行:并行度只能为1 并行 基于集合的Source fromElements package com.pxj.sx.flink; import org.apache.flink.configuration.Configuration; import org.apache.flink.configuration.RestOptions; import org.ap…...
网络七层模型与云计算中的网络服务
网络七层模型,也称为OSI(Open System Interconnection)模型,是由国际标准化组织(ISO)制定的一个概念性框架,用于描述网络通信过程中信息是如何被封装、传输和解封装的。这一模型将复杂的网络通信…...

word一按空格就换行怎么办?word文本之间添加空格就换行怎么办?
如上图,无法在Connection和con之间添加空格,一按空格就会自动换行。 第一步:选中文本,打开段落。 第二步:点击中文版式,勾选允许西文在单词中间换行。 确定之后就解决一按空格就自动换行啦!...
Python 遍历字典的方法,你都掌握了吗
Python中的字典是一种非常灵活的数据结构,它允许通过键来存储和访问值。在处理字典时,经常需要遍历字典中的元素,以下是几种常见的遍历字典的方法。 1. 使用 for 循环直接遍历字典的键 字典的键是唯一的,可以直接通过 for 循环来…...

MySQL 8.4.0 LTS 变更解析:I_S 表、权限、关键字和客户端
↑ 关注“少安事务所”公众号,欢迎⭐收藏,不错过精彩内容~ MySQL 8.4.0 LTS 已经发布 ,作为发版模型变更后的第一个长期支持版本,注定要承担未来生产环境的重任,那么这个版本都有哪些新特性、变更,接下来少…...

LeetCode 124 —— 二叉树中的最大路径和
阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 二叉树的问题首先我们要想想是否能用递归来解决,本题也不例外,而递归的关键是找到子问题。 我们首先来看看一棵最简单的树,也就是示例 1。这样的一棵树总共有六条路径…...

美甲店会员预约系统管理小程序的作用是什么
女性爱美体现在方方面面,美丽好看的指甲也不能少,市场中美甲店、小摊不少,也跑出了不少连锁品牌,70后到00后,每个层级都有不少潜在客户,商家需要获取和完善转化路径,不断提高品牌影响力与自身内…...

..堆..
堆 堆是完全二叉树,即除了最后一列之外,上面的每一层都是满的(左右严格对称且每个节点都满子节点) 最后一列从左向右排序。 默认大根堆:每一个节点都大于其左右儿子,根节点就是整个数据结构的最大值 pr…...

【LLM多模态】综述Visual Instruction Tuning towards General-Purpose Multimodal Model
note 文章目录 note论文1. 论文试图解决什么问题2. 这是否是一个新的问题3. 这篇文章要验证一个什么科学假设4. 有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员?5. 论文中提到的解决方案之关键是什么?6. 论文中的…...
探索Linux中的神奇工具:重定向符的妙用
探索Linux中的神奇工具:重定向符的妙用 在Linux系统中,重定向符是一个强大的工具,用于控制命令的输入和输出,实现数据流的定向。本文将详细介绍重定向符的基本用法和一些实用技巧,帮助读者更好地理解和运用这个功能。…...
Kubernetes 文档 / 概念 / 工作负载 / 工作负载管理 / Job
Kubernetes 文档 / 概念 / 工作负载 / 工作负载管理 / Job 此文档从 Kubernetes 官网摘录 中文地址 英文地址 Job 会创建一个或者多个 Pod,并将继续重试 Pod 的执行,直到指定数量的 Pod 成功终止。 随着 Pod 成功结束,Job 跟踪记录成功完成的…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...

PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...

【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...