程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 微服务基础

    • 了解SpringCloud微服务架构
    • 启动多个微服务项目
    • Eureka 服务注册
    • Ribbon 负载均衡
    • Nacos 下载与安装
    • Nacos 服务注册
    • Nacos 配置管理
    • openFeign 远程调用
    • OpenFeign 最佳实践
    • Gateway 网关
    • Gateway 进阶使用
    • Sentinel 服务保护
    • Sentinel 整合 Feign
      • 1. 背景介绍
        • 主要概念:
      • 2. Feign 整合 Sentinel 的实现步骤
        • 2.1 修改服务配置,开启 Feign 对 Sentinel 的支持
        • 2.2 实现 Fallback(降级)逻辑
        • 2.3 注册 Fallback Bean
        • 2.4 配置 FeignClient 使用 Fallback
        • 2.5 启动 Sentinel 控制台并测试
      • 3. Feign 降级策略的补充说明
      • 4. 线程隔离和熔断策略简介
        • 4.1 线程隔离
        • 4.2 熔断降级
        • 4.3 熔断策略
        • Sentinel 控制台熔断配置示例
        • 4.4 熔断恢复过程
      • 5. Sentinel 整合 Feign小结
      • 6、整合 Sentinel 到现有项目
        • 6.1 简介
        • 6.2 引入 Sentinel 依赖
        • 6.3 Sentinel 的基本配置
        • 6.4 启动并测试 Sentinel 整合
        • 6.5 整合后的效果
        • 6.6 注意事项
    • 分布式事务 Seata
    • 什么是分布式
    • 什么是RPC框架
  • 微服务之DDD架构思想

  • 微服务
  • 微服务基础
scholar
2024-08-24
目录

Sentinel 整合 Feign

# Sentinel 整合 Feign

# 1. 背景介绍

在微服务架构中,限流 和 熔断 是保护系统稳定性的重要手段。通过将 Sentinel 与 Feign 进行整合,我们可以对服务调用的流量进行限流,并通过熔断机制防止服务雪崩。当某个服务出现问题或流量激增时,Sentinel 可以自动降级或隔离这些问题,保护系统的其余部分不受影响。

限流、熔断和线程隔离

虽然限流可以缓解高并发问题,但服务有时仍会因为其他原因发生故障。为了防止这些故障蔓延到整个系统,我们需要使用 线程隔离 和 熔断降级。这些技术可以在客户端(调用方)一侧保护系统,确保单个故障不会影响整个微服务链路。

熔断降级与保护系统

# 主要概念:

  • 限流:限制瞬时高并发,保护系统免受流量冲击。
  • 熔断:当检测到服务故障时,主动断开调用链路,防止连锁故障蔓延。
  • 线程隔离:通过信号量或线程池将服务调用隔离开,防止故障扩散。

# 2. Feign 整合 Sentinel 的实现步骤

# 2.1 修改服务配置,开启 Feign 对 Sentinel 的支持

首先,在你的项目中启用 Feign 对 Sentinel 的支持。你需要在 application.yml 文件中添加以下配置:

feign:
  sentinel:
    enabled: true # 启用 Feign 与 Sentinel 的集成
1
2
3

# 2.2 实现 Fallback(降级)逻辑

当远程服务调用失败时,我们可以通过 Feign 的 Fallback 机制,执行自定义的降级逻辑。例如,如果 UserService 服务出现问题,我们可以让它返回一个空的用户对象或预设的默认值,防止系统崩溃。

代码示例:

@Slf4j
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable throwable) {
        return new UserClient() {
            @Override
            public User findById(Long id) {
                log.error("调用失败,异常信息:", throwable); // 记录失败的详细异常信息
                // 返回一个默认的空用户对象
                return new User();
            }
        };
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

说明:这里使用了 FallbackFactory,它能够捕获并处理远程调用中的异常信息,比单纯使用 FallbackClass 更灵活。你可以记录异常日志或根据异常类型返回不同的降级结果。

# 2.3 注册 Fallback Bean

在 Spring 配置类中,将 FallbackFactory 注册为一个 Spring Bean,以便 Feign 可以使用它来处理降级逻辑。

代码示例:

@Configuration
public class DefaultFeignConfiguration {
    @Bean
    public UserClientFallbackFactory userClientFallbackFactory() {
        return new UserClientFallbackFactory();
    }
}
1
2
3
4
5
6
7

说明:FallbackFactory 在配置类中注册为 Bean,确保 FeignClient 可以使用它来处理服务调用失败时的降级操作。

# 2.4 配置 FeignClient 使用 Fallback

在定义 FeignClient 接口时,指定使用哪个 FallbackFactory 来处理远程服务调用失败后的逻辑。

代码示例:

@FeignClient(value = "userservice", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}
1
2
3
4
5

说明:通过 fallbackFactory = UserClientFallbackFactory.class,你可以确保当 Feign 调用失败时,会触发指定的降级逻辑。这样可以在远程调用失败时返回默认的数据或错误提示,防止系统宕机。

# 2.5 启动 Sentinel 控制台并测试

启动 Sentinel 控制台,并为你的微服务设置限流、熔断和降级规则。你可以根据实际情况设置最大并发线程数、QPS 限制等。控制台还允许你观察系统在高并发或调用失败情况下的表现。

Sentinel 控制台配置

# 3. Feign 降级策略的补充说明

Feign 降级策略主要有两种方式:

  1. FallbackClass:当远程服务调用失败时,直接返回预设的降级结果。这种方式无法获取到具体的异常信息。
  2. FallbackFactory:通过工厂模式,提供更灵活的降级处理方式。它不仅可以返回降级结果,还可以捕获并处理异常信息,适合复杂场景的处理。

通过整合 Feign 和 Sentinel,你可以:

  • 在服务调用失败时执行自定义的降级逻辑。
  • 使用 Sentinel 控制台设置流控、熔断和降级规则,确保微服务系统在高并发或服务故障时的稳定性。
  • 使用 FallbackFactory 可以捕获异常并执行更加灵活的降级策略,提升系统的容错能力。

# 4. 线程隔离和熔断策略简介

# 4.1 线程隔离

线程隔离是防止一个服务调用故障扩散的重要手段。Sentinel 支持两种隔离方式:

  • 信号量隔离(默认):基于 PV 操作的信号量进行限流。
  • 线程池隔离:为不同的服务调用分配独立的线程池,适合隔离性要求高的场景。

# 4.2 熔断降级

熔断降级是应对雪崩效应的重要手段。Sentinel 的断路器有三个阶段:

  1. Closed:正常状态,服务处于可用状态。
  2. Open:当达到熔断条件时,断路器打开,直接拒绝请求。
  3. Half-Open:在一段时间后,断路器尝试恢复部分请求,观察服务是否恢复正常。

断路器状态

# 4.3 熔断策略

Sentinel 提供三种熔断策略:

  1. 慢调用比例:当业务响应时间(RT,Response Time)超过设定的阈值时,将其认定为慢调用。系统会监控慢调用的比例,当该比例达到设定的限值时,触发熔断。

  2. 异常比例:监控指定时间窗口内的业务异常比例。当异常比例超过设定的阈值时,系统会进入熔断状态。

  3. 异常数:监控指定时间窗口内的异常总数。当异常数超过设定的阈值时,触发熔断。

# Sentinel 控制台熔断配置示例

在 Sentinel 控制台中,可以配置熔断策略如下:

  • 设置慢调用比例熔断规则:

慢调用比例熔断配置

  • 设置异常比例熔断规则:

异常比例熔断配置

通过这些配置,Sentinel 会在检测到异常比例或响应时间过长时自动触发熔断机制,保障系统的稳定性。

# 4.4 熔断恢复过程

熔断降级后,系统会进入一个短暂的休眠期(Open 状态)。在休眠期结束后,Sentinel 会进入 Half-Open 状态,允许少量请求通过,测试系统的稳定性。如果这些请求执行正常,系统将恢复到 Closed 状态;否则,熔断状态将继续。

# 5. Sentinel 整合 Feign小结

通过 Sentinel 整合 Feign,我们可以在微服务调用中引入限流、熔断等机制,实现服务的稳定性保护。主要内容包括:

  • 限流:通过配置流控规则,限制服务的并发量和 QPS,防止因突发流量导致的服务崩溃。
  • 熔断降级:当检测到服务异常时,通过熔断机制主动断开调用链路,避免故障蔓延。
  • 线程隔离:通过信号量或线程池隔离不同服务调用的资源,提升系统的鲁棒性。

Sentinel 的强大之处在于其灵活的配置和多种保护机制,使得微服务在高并发和复杂场景下也能保持稳定运行。结合 Feign,可以实现对远程调用的全面保护。

重要提醒:在实际项目中,需根据具体业务场景合理配置限流、熔断和线程隔离策略,以确保系统的可靠性和高可用性。

# 6、整合 Sentinel 到现有项目

# 6.1 简介

将 Sentinel 集成到现有项目中非常简单。只需要引入依赖并进行简单的配置即可。但是需要注意,Sentinel 与 Spring Boot 的兼容性问题,尤其是当 Spring Boot 版本过新时,可能需要适当降级以避免兼容性问题。

另外,在没有持久化的情况下,服务的稳定性仍然存在问题,因为规则配置会在服务重启后丢失。

# 6.2 引入 Sentinel 依赖

在 pom.xml 中添加 Sentinel 依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2021.1</version> <!-- 注意版本的兼容性,可能需要根据 Spring Boot 版本调整 -->
</dependency>
1
2
3
4
5

代码说明:

  • spring-cloud-starter-alibaba-sentinel 是 Sentinel 的核心依赖,提供了 Sentinel 的流量控制、熔断降级、系统自适应保护等功能。
  • 版本号 2021.1 适用于 Spring Boot 2.x 系列。如果使用更高版本的 Spring Boot,可能会遇到兼容性问题,需要根据实际项目选择合适的版本。

# 6.3 Sentinel 的基本配置

在 application.yml 中添加 Sentinel 的基础配置:

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8090 # 配置 Sentinel 控制台的地址
  # 允许循环依赖,解决可能出现的依赖问题
  main:
    allow-circular-references: true
1
2
3
4
5
6
7
8

代码说明:

  • dashboard: localhost:8090 指定了 Sentinel 控制台的地址,项目启动后,Sentinel 的监控数据会自动发送到该地址。
  • allow-circular-references: true 允许 Spring Boot 在存在循环依赖的情况下正常启动。部分项目可能会遇到循环依赖问题,此配置可以避免启动报错。

# 6.4 启动并测试 Sentinel 整合

  1. 启动 Sentinel 控制台:

    java -Dserver.port=8090 -jar sentinel-dashboard-1.8.6.jar
    
    1

    通过该命令启动 Sentinel 控制台,默认地址为 http://localhost:8090。

  2. 启动你的 Spring Boot 项目并访问一个接口,确保 Sentinel 生效。你可以在 Sentinel 控制台中看到相应的监控数据。

# 6.5 整合后的效果

在 Sentinel 控制台中,可以看到项目中所有被监控的资源(如 Controller 的每个端点)。根据需求,你可以对这些资源设置限流、降级、热点参数限流等规则。

Sentinel 控制台

# 6.6 注意事项

  1. Spring Boot 版本兼容性:确保项目的 Spring Boot 版本与 Sentinel 兼容,尤其是在使用 Spring Boot 3.x 及更高版本时,可能需要使用最新的 Sentinel 版本或调整兼容性配置。

  2. 持久化问题:没有持久化的 Sentinel 配置意味着重启后所有规则会丢失,导致服务在实际生产中仍然不够稳定。推荐使用 Nacos 或其他配置中心进行规则的持久化管理。

总结

通过简单的依赖引入和配置,Sentinel 就能轻松整合到现有项目中,提供强大的流量控制、熔断降级等保护机制。然而,为了在生产环境中确保服务的高可用性,建议进一步研究规则的持久化方案。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
Sentinel 服务保护
分布式事务 Seata

← Sentinel 服务保护 分布式事务 Seata→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式