Spring Cloud — 深入了解Eureka、Ribbon及Feign
Eureka 负责服务注册与发现;Ribbon负责负载均衡;Feign简化了Web服务客户端调用方式。这三个组件可以协同工作,共同构建稳定、高效的微服务架构。
1 Eureka
分布式系统的CAP定理:
一致性(Consistency):同一个数据在集群中的所有节点,同一时刻都是同样的值。
可用性(Availability):集群中一部分节点故障后,集群整体还能处理客户端的请求。即每个请求都能收到一个(无论成功或失败)响应,且不会出现超时等情况。
分区容忍性(Partition tolerance):系统可用容忍消息的丢失或节点间通信的延迟。即分布式系统出现网络分区(由于网络故障导致系统中一部分节点无法与其他节点通信,从而形成孤立的分区)时,系统能否继续提供服务并保持数据一致性的能力。
在任何分布式系统中,不可能同时满足这三项,最多同时满足两项。
微服务的治理,核心是服务的注册和发现,针对同一服务,即使注册中心的不同节点保存的服务提供者信息不尽相同,也不会造成灾难性后果。对于消费者来说,能消费服务才是最重要的。即对于微服务的治理,遵循的是AP。
1.1 实现原理

图 服务提供者的服务生命周期
1.1.1 服务注册 Register
在服务提供者配置文件中将eureka.client.register-with-eureka的属性配置为true时,当服务提供者启动时,会调用Eureka所提供的服务注册相关方法,向Eureka服务器注册自己的信息。Eureka服务器会维护一个已注册的服务列表。
Eureka的AbstractInstanceRegistry类的ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry 字段存储了已注册的服务列表,
key 是服务的应用名称。value包含了服务实例的详细信息。
当服务实例状态发生变化时(比如不可用),服务提供者会向Eureka服务器更新自己的服务状态,同时会向其他Eureka服务器节点做状态同步。
1.1.2 服务续约 Renew
当将服务成功注册到Eureka服务器后,客户端会默认以30s(客户端配置属性eureka.instance.lease-renewal-interval-in-seconds)的频率向Eureka服务器发生一次心跳(即执行服务续约操作),来避免自己的注册信息被Eureka服务器剔除。
Eureka如果在90s内(客户端配置属性eureka.instance.lease-expiration-duration-in-seconds)没有收到客户端的心跳,则会将该服务实例从所维护的服务注册表中剔除,以禁止流向该实例的流量。
不过,当Eureka服务器处于自护保护模式时,不会清除服务实例信息。
1.1.3 获取服务
消费者端(fetch-registry属性配置为true)启动时会从Eureka服务器中获取注册表信息,并将其缓存在本地。并定期(默认30s)从Eureka服务器进行同步。
1.1.4 服务下线与剔除
当服务实例关闭时,会先向Eureka服务器发送服务下线请求,Eureka收到请求后,会将该服务实例信息从实例注册表中删除。
1.2 Eureka自我保护模式

图 处于自我保护模式下的Eureka服务
当Eureka处于自我保护模式时,会出现上面的红字提示,大概意思是:Eureka可能错误地报告服务实例为在线状态,而实际上它们可能并不在线。
这个问题是由于续租(Renewals)的数量低于阈值,导致服务实例没有被正确地标记为过期,从而可能影响到系统的稳定性和可用性。当Eureka每分钟收到心跳续租的数量恢复到阈值以上时,就会退出自我保护模式。
1.3 Eureka 高可用集群
Eureka服务器采用的是P2P(Peer to Peer)对等通信,是一种去中心化的结构。每个节点都是对等的。为了让Eureka服务高可用,必须让Eureka服务器之间能互相复制、同步所注册服务的实例信息。

图 Eureka集群注册模式
Eureka服务器配置文件中,register-with-eureka及fetch-registry属性都需要配置为true。eureka.client.service-url.defaultZone属性需要配置其他两个Eureka的服务器地址。
2 Bibbon
![]()
图 负载均衡方案核心部分
2.1 Ribbon 组件
Ribbon在实现负载均衡主要使用了6个组件。
2.1.1 服务器列表 ServerList
客户端负载均衡所使用的各服务实例列表,Ribbon支持下面3种方式:
- 静态服务器列表:通过BaseLoadBalancer的setServersList()方法进行设置。
- 基于配置的服务器列表:配置文件中通过<服务名称>.ribbon.listOfServers 属性进行配置。
- 基于服务发现的服务器列表:当在应用中同时使用Ribbon和Eureka时,默认会使用这种方式。当客户端启动时Ribbon会从Eureka服务器中获取所有注册服务的列表数据,并保持同步。
2.1.2 服务器列表过滤器 ServerListFilter
使用动态服务器列表时,过滤器会对原始服务列表使用一定的策略进行过滤。
| ZoneAffinityServerList Filter | 仅返回与本身所处区域一致的服务提供者实例列表。 |
| ServerListSubset Filter | 继承了ZoneAffinityServerListFilter,经过区域过滤后,仅返回一个固定大小的服务列表。 |
| ZonePreferenceServerList Filter | 通过配置或Eureka所属区域来过滤出同区域的服务实例列表。使用Spring Cloud整合Eureka和Ribbon时会默认使用该过滤器。 |
图 具体的服务器列表过滤器
2.1.3 服务实例存活探测 IPing
就像ping指令一样,用来监测一个微服务实例是否有响应。如果监测到某服务实例不再可用则会从列表中及时剔除。
2.1.4 负载均衡策略 IRule
负责选择一个最终服务实例地址作为负载均衡处理结果。Ribbon提供的选择策略有轮询、根据响应时间加权、断路由等。
2.1.5 负载均衡器 ILoadBalancer
负载均衡的具体实现。
| DynamicServerList LoadBalancer | 运行期间对服务实例动态更新和过滤。 |
| ZoneAware LoadBalancer | 基础上面的类。并增加防止跨区域访问的功能。 |
| NoOp LoadBalancer | 不执行实际的负载均衡操作。不会将请求分发到不同的服务实例上。 |
表 ILoadBalancer接口的具体实现类
2.1.6 服务调用器 RestClient
负载均衡后,Ribbon向服务提供者发起REST请求的工具。
2.2 负载均衡策略
Ribbon提供了以下几种负载均衡策略:
1. 轮询策略,RoundRobinRule。轮询方式选择服务实例。即每次调度执行i=(count + 1) mod n,来选出第i台服务器实例。count为执行请求的计数次数。
2. 随机选择,RandomRule。随机从可用的服务实例列表中选择一个。
3. 带有加权的轮询策略,WeightedResponseTimeRule。对各个服务实例响应时间进行加权处理,然后再采用轮询的方式。
Ribbon会对每个服务实例的响应时间进行统计,根据记录的时间计算每个服务实例的权重,最后根据每个实例的权重进行概率选择。
4 .可用过滤策略,AvailabilityFilteringRule。先过滤出有故障或并发请求大于阈值的部分服务实例,然后再以线性轮询的方式。
5 .区域感知策略,ZoneAvoidanceRule。先使用主过滤条件(区域负载器,选择最优区域)来进行过滤,然后使用次过滤条件进行过滤。最后对满足条件的服务实例使用轮询策略。
3 Feigh
Feign 提供了一个简洁的接口来定义和调用远程服务。
3.1 参数绑定
在Spring MVC 中注解会以参数每次作为默认值,但Feign不会,必须声明。
@RequestMapping(value = "/user/info",method = RequestMethod.GET)
String info(@RequestParam String name);
例如上面的代码,在Spring MVC中能获取到name这个参数值,但在Feign中不会,必须写为 @RequestParam(“name”) String name。
Feign 支持Spring MVC的注解,Spring MVC中常用的注解有以下几种:
@RequestParam: 绑定单个请求参数值。
@PathVariable:绑定URI模板变量值。
@RequestHeader:绑定请求头数据。
@RequestBody:绑定请求体数据。
相关文章:
Spring Cloud — 深入了解Eureka、Ribbon及Feign
Eureka 负责服务注册与发现;Ribbon负责负载均衡;Feign简化了Web服务客户端调用方式。这三个组件可以协同工作,共同构建稳定、高效的微服务架构。 1 Eureka 分布式系统的CAP定理: 一致性(Consistency)&am…...
全排列(力扣46)
这道题让我们求这个集合有多少种排列方式,那么与之前组合问题的不同就在于要考虑元素之间的顺序了,所以每一层递归的or循环的起始值无需变量控制,都从0开始。但是一个排列中不能出现相同元素,所以别忘了去重,这里的去重…...
Mac部署Jenkins 一
Mac部署Jenkins 一 一.Jenkins 部署依赖 JDK 环境 查看 Mac JDK 环境,如果没有安装,先安装 打开终端输入命令:java -version Mac安装配置 JDK 二. 检查 HomeBrew 安装 检查 HomeBrew 是否安装,终端输入命令:brew -v Mac安装HomeBrew …...
附录1:组维英文简写大全
附录1:组维英文简写大全 中央处理器 一、技术与厂商 FSB 前端总线频率 HT 超线程技术 Intel 英特尔 AMD 美国超微 VIA 威盛 二、CPU插座 Slot 针插式 ZIF 零插拔力的插座 Socket 触点式 LGA (IntelCPU封装形式名称) 三…...
SQL Server:查看内存使用情况
目录标题 **1. 使用系统视图和动态管理视图****查看 SQL Server 进程的内存使用情况****查看系统级别的内存使用情况****查看 SQL Server 内存管理器的状态** **2. 使用性能监视器(PerfMon)****添加内存使用情况计数器** **3. 使用 DBCC MEMORYSTATUS 命…...
chrome-mojo C++ Bindings API
概述 Mojo C 绑定 API 利用C 系统 API提供一组更自然的原语,用于通过 Mojo 消息管道进行通信。结合从Mojom IDL 和绑定生成器生成的代码,用户可以轻松地跨任意进程内和进程间边界连接接口客户端和实现。 本文档通过示例代码片段提供了绑定 API 用法的详…...
uniapp + vite + 使用多个 ui 库
样式冲突 新建了个项目 安装多个 ui 库 发现 uview-plus 和 Ant Design Vue 3.2.20 的 按钮样式 冲突uvuew-plus 的按钮样式 会被 ant 的样式给覆盖解决方式 找到圆满 ant.css 注释 button, html [type"button"], [type"reset"], [type"submit&quo…...
Unity3D 制作动画的时间轴管理方案: Timeline编
在 Unity3D 中使用 Timeline 实现所见即所得(WYSIWYG)的动画制作,合理的项目设置、资源管理和工作流程优化。以下基于本人实践之最佳方案总结: 1. 项目与场景设置 渲染模式与分辨率 在 Game 视图中选择与目标平台匹配的分辨率和屏幕比例(如 16:9 或 4:3),确保编辑时预览…...
逻辑回归不能解决非线性问题,而svm可以解决
逻辑回归和支持向量机(SVM)是两种常用的分类算法,它们在处理数据时有一些不同的特点,特别是在面对非线性问题时。 1. 逻辑回归 逻辑回归本质上是一个线性分类模型。它的目的是寻找一个最适合数据的直线(或超平面&…...
Prompt通用技巧1
Prompt 的典型构成 角色:给 AI定义一个最匹配任务的角色,比如:「你是一位软件工程师」「你是一位小学老师」指示:对任务进行描述上下文: 给出与任务相关的其它背景信息(尤其在多轮交互中)。例子 : 必要时给出举例,学术中称为 one-shot learning,few-sho…...
C# 上位机--枚举
一、引言 在 C# 上位机开发过程中,枚举(Enum)是一种非常实用的数据类型,它可以将一组相关的常量组织在一起,使代码更加清晰、易读和易于维护。 二、枚举的基本概念 枚举(Enum)是一种值类型&a…...
01docker run
docker run 用于从镜像创建并启动容器。下面是一些常用的选项: -d: 让容器在后台运行,即以守护进程模式运行。--name: 给容器指定一个名称,便于识别和管理。-p: 将宿主机的端口映射到容器内的端口,实现网络通信。-e: 设置环境变量…...
易语言.飞扬特性展示2
类型反射:编译后的类型具有“自省”性。可以在运行时获取类型(或类库)的定义信息。可以根据类名称动态创建类对象,并调用对象指定方法。提供“反射”类库供程序员使用。静态编译: 源代码将被直接编译为可执行代码。 没…...
FlashDecoding
Flash Attention是将Q划分到所有SM block上。每个SM block上的Q,负责和所有K和所有V进行计算,得到对应的结果。期间,SM block彼此之间,不需要通信。 在prefill阶段,seqLength*batchSize*Heads足够多,所以每…...
提示词生成新方法,用Make自动化生成
提示词生成新方法!用Make自动化生成! 在当今快速发展的科技时代,人工智能(AI)正在改变我们如何创作内容。然而,待人青睐的诀窍——提示词生成,可能令许多创作者感到迷惘。你是否曾在写作中挣扎…...
每日一题——括号生成
题解 给定 n 对括号,要求编写一个函数生成所有合法的括号组合。合法的括号组合必须满足每一对括号中的左括号必须先于右括号,并且括号数量必须平衡。 题目描述 输入: 一个整数 n,表示括号的对数,满足 0 ≤ n ≤ 1…...
实操部署DeepSeek,添加私有知识库
目录 一、环境介绍 PowerShell版本: wsl版本: 虚拟机版本: 本机IP: 虚拟机IP: 容器宿主机IP(host.docker.internal): Docker版本: Docker Compose版本ÿ…...
宜宾数字经济新标杆:树莓集团赋能区域产业转型升级
树莓集团在宜宾成为数字经济新标杆,有力地赋能区域产业转型升级。在传统产业数字化转型方面,树莓集团针对宜宾的制造业企业,引入工业互联网技术。 通过搭建工业互联网平台,实现企业生产设备的联网和数据采集,帮助企业…...
8.大规模推荐系统的实现
接下来我们将学习大规模推荐系统的实现。在实际应用中,推荐系统需要处理海量数据,并在短时间内生成推荐结果。这要求我们在设计和实现推荐系统时,考虑到数据的分布式存储与处理、计算的高效性和系统的可扩展性。在这一课中,我们将…...
第三届通信网络与机器学习国际学术会议(CNML 2025)
在线投稿: 学术会议-学术交流征稿-学术会议在线-艾思科蓝 通信网络机器学习 通信理论 通信工程 计算机网络和数据通信 信息分析和基础设施 通信建模理论与实践 无线传感器和通信网络 云计算与物联网 网络和数据安全 光电子学和光通信 无线/移动通信和技术 智能通信…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
Python环境安装与虚拟环境配置详解
本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南,适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者,都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...
PostgreSQL 对 IPv6 的支持情况
PostgreSQL 对 IPv6 的支持情况 PostgreSQL 全面支持 IPv6 网络协议,包括连接、存储和操作 IPv6 地址。以下是详细说明: 一、网络连接支持 1. 监听 IPv6 连接 在 postgresql.conf 中配置: listen_addresses 0.0.0.0,:: # 监听所有IPv4…...
