Spring Cloud系列——使用Sentinel进行微服务保护

简介: Spring Cloud系列——使用Sentinel进行微服务保护

Spring Cloud系列——使用Sentinel进行微服务保护

 

概述

 

Spring Cloud Sentinel 是一个强大的微服务保护框架,提供流量控制、熔断降级、系统负载保护和热点流量防护等功能,帮助开发者保障微服务的高可用性和稳定性。Sentinel 可以与 Spring Cloud 生态系统无缝集成,是分布式系统开发中的重要工具。

 

Sentinel 主要功能

 

1. **流量控制**:基于流量大小和请求速率进行限流。

2. **熔断降级**:根据响应时间和失败率进行熔断处理。

3. **系统负载保护**:基于系统负载进行保护,防止系统过载。

4. **热点流量防护**:对热点参数进行限流保护,防止特定参数的流量激增。

 

环境配置

 

引入依赖

 

在 Spring Cloud 项目中引入 Sentinel 相关依赖。可以在 `pom.xml` 文件中添加以下依赖:

 

```xml
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>
```

 

配置文件

 

在项目的配置文件(如 `application.yml`)中添加 Sentinel 的相关配置:

 

```yaml
spring:
  application:
    name: sentinel-demo
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
      filter:
        enabled: true
```

 

启动 Sentinel Dashboard

 

Sentinel 提供了可视化的 Dashboard 用于监控和管理。可以通过下载 Sentinel Dashboard 的 jar 包并运行:

 

```sh
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
```

 

使用 Sentinel 进行微服务保护

 

流量控制

 

通过注解的方式进行限流控制。例如,对某个服务接口进行限流:

 

```java
@RestController
public class HelloController {
 
    @GetMapping("/hello")
    @SentinelResource(value = "hello", blockHandler = "handleFlowQpsException")
    public String hello() {
        return "Hello Sentinel";
    }
 
    public String handleFlowQpsException(BlockException e) {
        return "Too many requests, please try again later.";
    }
}
```

 

在 Sentinel Dashboard 中,可以对该接口设置流量控制规则。

 

熔断降级

 

通过注解的方式进行熔断降级。例如,对某个服务接口进行熔断处理:

 

```java
@RestController
public class HelloController {
 
    @GetMapping("/hello")
    @SentinelResource(value = "hello", fallback = "fallbackHandler")
    public String hello() {
        if (new Random().nextBoolean()) {
            throw new RuntimeException("Service exception");
        }
        return "Hello Sentinel";
    }
 
    public String fallbackHandler(Throwable e) {
        return "Service is unavailable, please try again later.";
    }
}
```

 

在 Sentinel Dashboard 中,可以对该接口设置熔断降级规则。

 

系统负载保护

 

可以在 Sentinel Dashboard 中配置系统保护规则,防止系统过载。系统保护规则包括 CPU 使用率、系统平均响应时间、入口流量等指标。

 

热点流量防护

 

对某个接口的特定参数进行限流保护。例如,对用户登录接口进行参数限流:

 

```java
@RestController
public class LoginController {
 
    @PostMapping("/login")
    @SentinelResource(value = "login", blockHandler = "handleHotParamException")
    public String login(@RequestParam String username) {
        return "Welcome " + username;
    }
 
    public String handleHotParamException(String username, BlockException e) {
        return "Too many requests with username: " + username;
    }
}
```

 

在 Sentinel Dashboard 中,可以对 `username` 参数设置热点限流规则。

 

示例代码

 

以下是一个完整的示例代码,演示如何使用 Sentinel 进行流量控制、熔断降级、系统负载保护和热点流量防护。

 

```java
package com.example.sentineldemo;
 
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.Random;
 
@RestController
public class DemoController {
 
    @GetMapping("/hello")
    @SentinelResource(value = "hello", blockHandler = "handleFlowQpsException", fallback = "fallbackHandler")
    public String hello() {
        if (new Random().nextBoolean()) {
            throw new RuntimeException("Service exception");
        }
        return "Hello Sentinel";
    }
 
    public String handleFlowQpsException(BlockException e) {
        return "Too many requests, please try again later.";
    }
 
    public String fallbackHandler(Throwable e) {
        return "Service is unavailable, please try again later.";
    }
 
    @PostMapping("/login")
    @SentinelResource(value = "login", blockHandler = "handleHotParamException")
    public String login(@RequestParam String username) {
        return "Welcome " + username;
    }
 
    public String handleHotParamException(String username, BlockException e) {
        return "Too many requests with username: " + username;
    }
}
```

 

总结

 

通过引入 Sentinel 并在 Spring Cloud 项目中进行配置和使用,可以有效保护微服务系统的高可用性和稳定性。Sentinel 提供的流量控制、熔断降级、系统负载保护和热点流量防护功能,可以帮助开发者在分布式系统中应对各种突发情况,保障系统的平稳运行。

目录
相关文章
|
25天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
47 2
|
28天前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
24天前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
63 1
|
27天前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
1月前
|
Java 数据库 数据安全/隐私保护
Spring 微服务提示:使用环境变量抽象数据库主机名
Spring 微服务提示:使用环境变量抽象数据库主机名
40 1
|
1月前
|
监控 Java 对象存储
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
42 1
|
1月前
|
安全 Java 对象存储
安全性考量:Spring Security与Netflix OSS在微服务安全中的作用
安全性考量:Spring Security与Netflix OSS在微服务安全中的作用
41 1
|
2月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
97 5
|
2月前
|
前端开发 API 微服务
SpringCloud微服务之间使用Feign调用不通情况举例
SpringCloud微服务之间使用Feign调用不通情况举例
455 2
|
1月前
|
负载均衡 算法 Nacos
SpringCloud 微服务nacos和eureka
SpringCloud 微服务nacos和eureka
58 0