Sentinel 断路器在Spring Cloud使用详解

2025-02-06 04:50

本文主要是介绍Sentinel 断路器在Spring Cloud使用详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Sentinel断路器在SpringCloud使用详解》Sentinel是阿里巴巴开源的一款微服务流量控制组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、...

Sentinel 介绍

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

同类对比

Hystrix:

  • 熔断器:当服务调用失败率达到阈值时,自动熔断,避免雪崩。
  • 降级:提供 fallback 机制,在服务不可用时返回默认值或执行备用逻辑。
  • 隔离:通过线http://www.chinasem.cn程池或信号量隔离资源,防止单个服务的故障影响整个系统。
  • 监控:提供 Hystrix Dashboard 实时监控服务状态。

Sentinel:

  • 流量控制:支持 QPS、线程数等多种维度的限流。
  • 熔断降级:基于响应时间、异常比例等指标进行熔断。
  • 热点参数限流:针对特定参数(如用户 ID)进行精细化限流。
  • 系统自适应保护:根据系统负载(如 CPU 使用率)动态调整流量。
  • 实时监控:提供 Dashboard 实时查看流量、熔断等信息。

微服务雪崩问题

微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。

问题原因

微服务相互调用,服务提供者出现故障或阻塞。
服务调用者没有做好异常处理,导致自身故障。
调用链中的所有服务级联失败,导致整个集群故障

问题解决方案

尽量避免服务出现故障或阻塞。
保证代码的健壮性;
保证网络畅通;
能应对较高的并发请求;
服务调用者做好远程调用异常的后备方案,避免故障扩散

请求限流

请求限流:限制访问微服务的请求的并发量,避免服务因流量激增出现故障。

线程隔离

线程隔离:也叫做舱壁模式,模拟船舱隔板的防水原理。通过限定每个业务能使用的线程数量而将故障业务隔离,避免故障扩散。

失败处理

快速失败:给业务编写一个调用失败时的处理的逻辑,称为fallback。当调用出现故障(比如无线程可用)时,按照失败处理逻辑执行业务并返回,而不是直接抛出异常。

服务熔断

服务熔断:由断路器统计请求的异常比例或慢调用比例,如果超出阈值则会熔断该业务,则拦截该接口的请求。
熔断期间,所有请求快速失败,全都走fallback逻辑。

解决雪崩问题的常见方案有哪些?

请求限流:限制流量在服务可以处理的范围,避免因突发流量而故障
线程隔离:控制业务可用的线程数量,将故障隔离在一定范围
服务熔断:将异常比例过高的接口断开,拒绝所有请求,直接走fallback
失败处理:定义fallbachttp://www.chinasem.cnk逻辑,让业务失败时不再抛出异常,而是返回默认数据或友好提示

Sentinel

Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址: https://sentinelguard.io/zh-cn/index.html

docker 安装

docker search sentinel
docker pull bladex/sentinel-dashboard
# 简化
docker run --name sentinel -p 8858:8858 -d bladex/sentinel-dashboard:latest
# 开机启动
docker run --name sentinel --restart=always -p 8858:8858 -p 8719:8719 -d bladex/sentinel-dashboard:latest

账号/ 密码

用户名/密码:sentinel / sentinel

项目导入

<!--nacos配置管理-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--读取bootstrap文件-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--sentinel配置-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  • spring.cloud.sentinel.transport.dashboard:
    • 这个配置指定了 Sentinel 控制台的地址。Sentinel 控制台用于监控和管理流量控制规则、熔断降级规则等。
    • 你配置的地址是 127.0.0.1:8858,表示 Sentinel 控制台运行在本地的 8858 端口。
  • spring.cloud.sentinel.http-method-specify:
    • 这个配置项设置为 true,表示开启请求方式前缀。
    • 当这个选项开启时,Sentinel 会根据 HTTP 请求方法(如 GET、POST 等)来区分资源。例如,GET:/api/resource 和 POST:/api/resource 会被视为不同的资源,从而可以针对不同的 HTTP 方法设置不同的流控规则。
spring:
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8858
      http-method-specify: true # 开启请求方式前缀

除了上述配置,Sentinel 还支持其他一些常用配置,例如:

  • spring.cloud.sentinel.eager: 是否在应用启动时立即初始化 Sentinel。默认为 false,表示在首次访问时初始化。
  • spring.cloud.sentinel.filter.enabled: 是否启用 Sentinel 的 Web 过滤器。默认为 true。
  • spring.cloud.sentinel.metric.file-single-size: 单个监控日志文件的大小。默认为 52428800(50MB)。
  • spring.cloud.sentinel.metric.file-total-count: 最多保留的监控日志文件数量。默认为 6
spring:
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8858  # Sentinel 控制台地址
      http-method-specify: true     # 开启请求方式前缀
      eager: true                   # 应用启动时立即初始化 Sentinel
      filter:
        enabled: true               # 启用 Sentinel 的 Web 过滤器
      mejstric:
        file-single-size: 52428800  # 单个监控日志文件的大小
        file-total-count: 6         # 最多保留的监控日志文件数量

Feign 集成 Sentinel 的作用

  • 流量控制:限制 Feign 客户端的调用频率,防止下游服务被压垮。
  • 熔断降级:当下游服务出现异常或响应时间过长时,快速失败并执行降级逻辑。
  • 系统保护:通过 Sentinel 的规则配置,保护系统的稳定性。
feign:
  sentinel:
    enabled: true  # 启用 Feign 的 Sentinel 支持

簇点链路

簇点链路,就是单机调用链路。是一次请求进入服务后经过的每一个被Sentinel监控的资源链。默认Sentinel会监控SpringMVC的每一个Endpoint(http接口)。限流、熔断等都是针对簇点链路中的资源设置的。而资源名默认就是接口的请求路径:

Sentinel 断路器在Spring Cloud使用详解

请求限流

Sentinel 断路器在Spring Cloud使用详解

线程隔离

当商品服务出现阻塞或故障时,调用商品服务的购物车服务可能因此而被拖慢,甚至资源耗尽。所以必须限制购物车服务中查询商品这个业务的可用线程数,实现线程隔离。

Sentinel 断路器在Spring Cloud使用详解

Sentinel 断路器在Spring Cloud使用详解

Fallback

FeignClient的Fallback有两种配置方式:
方式一:FallbackClass,无法对远程调用的异常做处理
方式二:FallbackFactory,可以对远程调用的异常做处理,通常都会选择这种

Sentinel 断路器在Spring Cloud使用详解

主要用于处理 服务调用失败 的情况,比如服务掉线、超时、异常等。它的核心作用是为 Feign 客户端提供 容错机制,确保在服务不可用时,系统仍然能够正常运行或提供有意义的反馈。

服务掉线时的处理流程

假设 item-service 服务掉线,以下是 Feign 客户端的处理流程:
Feign 客户端尝试调用远程服务:
调用 queryItemByIds 或 deductStock 方法。
由于服务掉线,Feign 会抛出异常(如 FeignException)。
FallbackFactory 捕获异常:
异常会被 ItemClientFallbackFactory 捕获。
create 方法中的 Throwable cause 参数会包含具体的异常信息。
执行降级逻辑:
对于 queryItemByIds,返回一个空js列表。
对于 deductStock,记录日志并抛出 RuntimeException。
调用方处理降级结果:
如果调用方是查询商品列表,可以继续使用空列表作为返回值。
如果调用方是扣减库存,需要捕获 RuntimeException 并决定是否重试或回滚事务。

@Slf4j
public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> {
    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            @Override
            public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
                log.error("查询商品失败!", cause);
                return CollUtandroidils.emptyList();
            }
            @Override
            public void deductStock(List<OrderDetailDTO> items) {
                log.error("扣减商品库存失败!", cause);
                throw new RuntimeException(cause);
            }
        };
    }
}

注入配置类

public class FallbackConfig {
    @Bean
    public ItemClientFallbackFactory itemClientFallbackFactory(){
        return new ItemClientFallbackFactory();
    }
}

@FeignClient 注解:
value = “item-service” 指定了这个 Feign 客户端将要请求的服务名称。
fallbackFactory = ItemClientFallbackFactory.class 提供了容错机制,当 item-service 不可用时,会使用 ItemClientFallbackFactory 生成的降级逻辑。

@FeignClient(value = "item-service", fallbackFactory = ItemClientFallbackFactory.class)
public interface ItemClient {
    @GetMapping("/items")
    List<ItemDTO> queryItemByIds(@RequestParam Collection<Long> ids);
    @PutMapping("/items/stock/deduct")
    public void deductStock(@RequestParam List<OrderDetailDTO> items);
}

服务熔断

熔断是解决雪崩问题的重要手段。思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。
 

Sentinel 断路器在Spring Cloud使用详解

Sentinel 断路器在Spring Cloud使用详解

Sentinel 断路器在Spring Cloud使用详解

到此这篇关于Sentinel 断路器在Spring Cloud使用详解的文章就介绍到这了,更多相关Spring Cloud使用Sentinel 内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Sentinel 断路器在Spring Cloud使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153301

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os