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种方式:

  1. 静态服务器列表:通过BaseLoadBalancer的setServersList()方法进行设置。
  2. 基于配置的服务器列表:配置文件中通过<服务名称>.ribbon.listOfServers 属性进行配置。
  3. 基于服务发现的服务器列表:当在应用中同时使用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:绑定请求体数据。

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

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

相关文章

Ubuntu 22.04 一键部署MinerU1.1.0

MinerU MinerU是一款将PDF转化为机器可读格式的工具&#xff08;如markdown、json&#xff09;&#xff0c;可以很方便地抽取为任意格式。 MinerU诞生于书生-浦语的预训练过程中&#xff0c;我们将会集中精力解决科技文献中的符号转化问题&#xff0c;希望在大模型时代为科技发…

如何才能写出好的prompt?

好的prompt设计需要遵循"明确具体、提供上下文、设定输出格式"三大原则。以下通过"解释量子计算"的案例展示优化过程: 优化前: Prompt:解释量子计算 输出结果: “量子计算是一种基于量子力学原理的新型计算模式,利用量子比特的叠加和纠缠特性实现并行…

计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

c++:模板进阶

1.非类型模板参数 我们之前的模板参数是类型模板参数&#xff0c;而非类型模板参数是常量&#xff0c;和宏功能类似 但是宏有个缺点&#xff0c;因为同一个宏的常量在一个项目中只有一个值&#xff0c;所以不能满足更加灵活多变的项目需求&#xff0c;但是非类型模板参数就可以…

Java 集合数据处理技巧:使用 Stream API 实现多种操作

​ 在 Java 开发中&#xff0c;对集合数据进行处理是非常常见的需求&#xff0c;例如去重、排序、分组、求和等。Java 8 引入的 Stream API 为我们提供了一种简洁、高效的方式来处理集合数据。本文将详细介绍如何使用 Stream API 实现多种集合数据处理操作&#xff0c;并给出相…

计算机网络基础杂谈(局域网、ip、子网掩码、网关、DNS)

目录 1. 简单局域网的构成 2. IP 地址 3. 子网掩码 4. IP地址详解自定义IP 5. IP 地址详解 6. 网关 7. DNS 域名解析 8. ping 1. 简单局域网的构成 交换机是组建局域网最重要的设备&#xff0c;换句话说&#xff0c;没有交换机就没法搭建局域网 交换机不能让局域网连…

基于SpringBoot的高校教学资料管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Rust 未来会成为主流的编程语言吗?

Rust是由Mozilla团队主导开发的编程语言&#xff0c;首次亮相是在2010年。自发布以来&#xff0c;Rust凭借其内存安全性、出色的性能和对并发操作的支持&#xff0c;逐渐吸引了众多开发者的关注。据Stack Overflow的2021年调查数据显示&#xff0c;Rust连续多年被开发者评为最喜…

【Java】代理模式

代理模式 代理模式是指给某一个对象提供一个代理&#xff0c;并由代理对象来控制对真实对象的访问 代理模式是一种结构型设计模式 背景 如果不采用代理&#xff0c;对一个类的多个方法进行监控时&#xff0c;重复的代码总是重复出现&#xff0c;不但破坏了原方法&#xff0c;…

STM32 看门狗

目录 背景 独立看门狗&#xff08;IWDG&#xff09; 寄存器访问保护 窗口看门狗&#xff08;WWDG&#xff09; 程序 独立看门狗 设置独立看门狗程序 第一步、使能对独立看门狗寄存器的写操作 第二步、设置预分频和重装载值 第三步、喂狗 第四步、使能独立看门狗 喂狗…

LLM论文笔记 15: Transformers Can Achieve Length Generalization But Not Robustly

Arxiv日期&#xff1a;2024.2.14机构&#xff1a;Google DeepMind / University of Toronto 关键词 长度泛化位置编码数据格式 核心结论 1. 实验结论&#xff1a;十进制加法任务上的长度泛化最佳组合&#xff1a; FIRE位置编码 随机化位置编码 反向数据格式 索引提示&…

超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环

本文目录 一、知识点1. PID是什么&#xff1f;2. 积分限幅--用于限制无限累加的积分项3. 输出值限幅--用于任何pid的输出4. PID工程 二、各类PID1. 位置式PID&#xff08;用于位置环&#xff09;&#xff08;1&#xff09;公式&#xff08;2&#xff09;代码使用代码 2. 增量式…

【Linux探索学习】第二十八弹——信号(下):信号在内核中的处理及信号捕捉详解

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 在前面我们已经学习了有关信号的一些基本的知识点&#xff0c;包括&#xff1a;信号的概念、信号产生和信号处理等&#xff0c;今天我们重…

Qt中使用QPdfWriter类结合QPainter类绘制并输出PDF文件

一.类的介绍 1.QPdfWriter介绍 Qt中提供了一个直接可以处理PDF的类&#xff0c;这就是QPdfWriter类。 &#xff08;1&#xff09;PDF文件生成 支持创建新的PDF文件或覆盖已有文件&#xff0c;通过构造函数直接绑定文件路径或QFile对象&#xff1b; 默认生成矢量图形PDF&#…

快速上手gdb/cgdb

Linux调试器-gdb使用 1.背景2.调试原理、技巧命令2.1指令2.2 本质2.3 技巧 1.背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g…

linux网络编程(1.5w字+内部程序理解网络)

目录 核心大图&#xff1a; 网络字节序 网络字节序与主机字节序 地址转换函数 一、inet_ntoa函数 二、inet_aton函数 三、inet_aton和inet_ntoa的测试 in_addr转字符串的函数: socket编程接口 socket 常见API 1.socket 参数1&#xff1a;int af 参数2&#xff1a;…

windows环境下用docker搭建php开发环境dnmp

安装WSL WSL即Linux子系统&#xff0c;比虚拟机占用资源少&#xff0c;安装的前提是系统必须是win10以上。 WSL的安装比较简单&#xff0c;网上有很多教程&#xff0c;例如&#xff1a;WSL简介与安装流程&#xff08;Windows 下的 Linux 子系统&#xff09;_wsl安装-CSDN博客&…

Nginx之rewrite重写功能

目录 一、rewrite概述 1、rewrite功能 2、跳转场景 二、标准配置指令 1、rewrite日志记录指令 2、未初始化变量告警日志记录指令 3、rewrite 指令 3.1 正则表达式 三、rewrite模块使用实例 1.基于域名的跳转 2.基于客户端 IP 访问跳转 3.?基于旧域名跳转到新域名后…

Mybatis(一)

配置文件 必要的用户密码要修改, 还有绿色线的名字要修改成数据库的 配置文件直接cv 创建 复习之前的知识进行分层处理 与前面一一对应, 后面三个发现后面输出是null, 没有一一对应, 后面再解释解决方法 运行发现, 输出正常 idea的测试类 两个注解了解 记得加上这个, 不然无…

一周学会Flask3 Python Web开发-http响应状态码

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Flask程序中&#xff0c;客户端发出的请求触发相应的视图函数&#xff0c;获取返回值会作为响应的主体&#xff0c;最后生成…