首页 > 其他分享 >使用Sentinel进行服务调用的熔断和限流管理(SpringCloud2023实战)

使用Sentinel进行服务调用的熔断和限流管理(SpringCloud2023实战)

时间:2024-06-21 09:10:04浏览次数:25  
标签:spring alibaba sentinel 限流 SpringCloud2023 Sentinel 控制台 cloud

你好,这里是codetrend专栏“SpringCloud2023实战”。

本文简单介绍SpringCloud2023中使用Sentinel进行限流管理。

前言

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。

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

Sentinel 同时提供系统维度的自适应保护能力。

防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。

如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。

Spring Cloud Alibaba 默认为 Sentinel 整合了 Servlet、RestTemplate、FeignClient 和 Spring WebFlux。

Sentinel 在 Spring Cloud 生态中,不仅补全了 Hystrix 在 Servlet 和 RestTemplate 这一块的空白,而且还完全兼容了 Hystrix 在 FeignClient 中限流降级的用法,并且支持运行时灵活地配置和调整限流降级规则。

Sentinel工作机制

Sentinel 的使用可以分为两个部分:

  • 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持(见 主流框架适配)。
  • 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。

Sentinel 的主要工作机制如下:

  • 对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。
  • 根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。
  • Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。

Sentinel特点

Sentinel 具有以下特征:

  • 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
  • 完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。

Sentinel集成之控制台(Dashboard)

Sentinel 控制台提供一个轻量级的控制台,它提供机器发现、单机资源实时监控、集群资源汇总,以及规则管理的功能。您只需要对应用进行简单的配置,就可以使用这些功能。

java -Dserver.port=10300 -Dcsp.sentinel.dashboard.server=localhost:10300 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
# 如若8080端口冲突,可使用 -Dserver.port=新端口 进行设置。
  • 配置控制台信息,application.yml 。
spring:
  cloud:
    sentinel:
      transport:
        port: 10201
        dashboard: localhost:10300

这里的 spring.cloud.sentinel.transport.port 端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。

Sentinel集成之普通服务

引入pom.xml

  • 引入Sentinel主要是引入 spring-cloud-starter-alibaba-sentinel
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <dependencies>
        <!-- sentinel核心包引入 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
        </dependency>
        <!-- sentinel-springboot引入 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
    </dependencies>
</project>

修改配置

  • 新增配置文件 application.yml,配置主要是 spring.cloud.sentinel 下面的配置。
spring.application.name: banana-client4-sentinel
spring:
  cloud:
    sentinel:
      transport:
        port: 10201
        dashboard: localhost:10300
    zookeeper:
      connect-string: localhost:2181

接口demo

  • 通过访问 http://localhost:10200/client4/swagger-ui.html ,输入账号密码 yulin/123yl. 就可以访问到最新的接口文档,验证限流是否开启成功。
@Service
public class TestService {

    @SentinelResource(value = "sayHello")
    public String sayHello(String name) {
        return "Hello, " + name;
    }
}

@RestController
public class TestController {

    @Autowired
    private TestService service;

    @GetMapping(value = "/hello/{name}")
    public String apiHello(@PathVariable String name) {
        return service.sayHello(name);
    }
}
  • 在控制面板设置 http://localhost:10200/client4/hello 的QPS为5。通过如下脚本验证限流是否成功:
import requests
token_list =[]
for j in range(10):
    token_list.append(str(j)+'hello')
    response = requests.get('http://localhost:10200/client4/hello/'+str(j)+'hello','hello')
    print(response.text)

输出文档如下:

Hello, 0hello
Hello, 1hello
Hello, 2hello
Hello, 3hello
Hello, 4hello
Blocked by Sentinel (flow limiting)
Blocked by Sentinel (flow limiting)
Blocked by Sentinel (flow limiting)
Blocked by Sentinel (flow limiting)
Blocked by Sentinel (flow limiting)

Sentinel集成之OpenFeign

pom.xml和配置修改

Feign 适配整合在 Spring Cloud Alibaba 中,可以参考 Spring Cloud Alibaba Sentinel 文档 进行接入。

Sentinel 适配了 Feign 组件。如果想使用,除了引入 spring-cloud-starter-alibaba-sentinel 的依赖外还需要 2 个步骤:

  • 配置文件打开 Sentinel 对 Feign 的支持:feign.sentinel.enabled=true
  • 加入 spring-cloud-starter-openfeign 依赖使 Sentinel starter 中的自动化配置类生效:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

demo验证代码

@FeignClient(name = "service-provider", fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class)
public interface EchoService {
    @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
    String echo(@PathVariable("str") String str);
}

class FeignConfiguration {
    @Bean
    public EchoServiceFallback echoServiceFallback() {
        return new EchoServiceFallback();
    }
}

class EchoServiceFallback implements EchoService {
    @Override
    public String echo(@PathVariable("str") String str) {
        return "echo fallback";
    }
}
  • EchoService 接口中方法 echo 对应的资源名为 GET:http://service-provider/echo/{str}。 通过对该资源限流配置即可。
  • 实际验证失败,可能是没有开发到springcloud2023。

Sentinel集成之Gateway

若想跟 Sentinel Starter 配合使用,需要加上 spring-cloud-alibaba-sentinel-gateway 依赖,同时需要添加 spring-cloud-starter-gateway 依赖来让 spring-cloud-alibaba-sentinel-gateway 模块里的 Spring Cloud Gateway 自动化配置类生效:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

同时请将 spring.cloud.sentinel.filter.enabled 配置项置为 false(若在网关流控控制台上看到了 URL 资源,就是此配置项没有置为 false)。Sentinel 网关流控默认的粒度是 route 维度以及自定义 API 分组维度,默认不支持 URL 粒度。

文档来自Sentinel文档。这里不仔细展开开发和说明,后续在网关业务层进行配置和说明。

完整源码信息查看可以在gitee或者github上搜索r0ad

关于作者

来自一线全栈程序员nine的探索与实践,持续迭代中。

欢迎关注或者点赞~

标签:spring,alibaba,sentinel,限流,SpringCloud2023,Sentinel,控制台,cloud
From: https://www.cnblogs.com/r0ad/p/18259890

相关文章

  • 服务器雪崩的应对策略之----限流
    限流是一种控制流量的技术,旨在防止系统在高并发请求下被压垮。通过限流,可以确保系统在负载高峰期依然能保持稳定运行。常见的限流策略包括令牌桶算法、漏桶算法、计数器算法和滑动窗口算法。常见的限流方法1.令牌桶算法(TokenBucketAlgorithm)2.漏桶算法(LeakyBu......
  • Redis Sentinel哨兵模式部署
    RedisSentinel哨兵模式部署主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel模式应运而生。sentinel中文含义为哨兵,顾名思义,它的作用就是监控redis集群的运行状况,此模式具有如下一些特点:sentinel模式是建立在主从模式的基础上,如果......
  • SpringCloud2023 - 学习笔记
    文章目录1.简介1.1基础知识1.2组件更替与升级2.微服务基础项目构建2.1创建项目2.2Mapper4生成代码2.3支付模块编码2.4项目完善2.5订单模块编码2.6工程重构3.consul服务注册与发现3.1consul简介3.2consul下载安装3.3微服务入驻3.4order订单微服务入驻3.5......
  • 手把手教你改造 Sentinel Dashboard 实现配置持久化
    一.概述Sentinel客户端默认情况下接收到Dashboard推送的规则配置后,可以实时生效。但是有一个致命缺陷,Dashboard和业务服务并没有持久化这些配置,当业务服务重启后,这些规则配置将全部丢失。Sentinel提供两种方式修改规则:通过API直接修改(loadRules)通过DataSource适配......
  • 各种限流组件汇总
    背景        限流在很多场景中用来限制并发和请求量,比如说秒杀抢购,保护自身系统和下游系统不被巨型流量冲垮等。在这种环境下,单个服务可能会接收到大量的请求,如果没有适当的流量控制机制,系统很容易因为资源被过度消耗而变得不稳定甚至崩溃。重要性在微服务的时代,服......
  • 干货:TikTok限流、0播放问题怎么解决?
    针对TikTok运营中常见的流量问题,如疑似限流、零播放等,本文将为大家提供详尽的解答和策略。Q1:为何视频播放量始终难以突破几百?A1:视频播放量低,首要考虑的并非限流。内容质量是关键,建议检查视频内容是否吸引人且符合TikTok的规范。同时,网络环境稳定性也很重要,非常建议使用原生......
  • 简单的限流过滤器
    API接口都是提供给第三方服务/客户端调用,所有请求地址以及请求参数都是暴露给用户的。每次请求一个HTTP请求,用户都可以通过F12,或者抓包工具看到请求的URL链接,然后copy出来。这样是非常不安全的,有人可能会恶意的刷我们的接口,那这时该怎么办呢?增加一个全局过滤器获取客户端的IP......
  • 百度面试:如何用Redis实现限流?
    高并发系统有三大特征:限流、缓存和熔断,所以限流已经成为当下系统开发中必备的功能了。那么,什么是限流?如何实现限流?使用Redis能不能实现限流?接下来我们一起来看。1.什么是限流?限流是指在各种应用场景中,通过技术和策略手段对数据流量、请求频率或资源消耗进行有计划的限制,以避......
  • 学习分享-面向分布式服务架构的流量管理工具Apache Sentinel
    前言最近学习过程中有接触到ApacheSentinel这个工具,所以就分享一下相关的资料和知识。ApacheSentinel是阿里巴巴开源的一款面向分布式服务架构的流量管理工具,主要用于流量控制、熔断降级和系统负载保护。Sentinel提供了一整套完善的流量管理方案,可以帮助开发者保障微服......
  • 配置并集集成Sentinel微服务保护
    Sentinel微服务保护的技术有很多,但在目前国内使用较多的还是Sentinel,所以接下来我们学习Sentinel的使用。介绍和安装Sentinel是阿里巴巴开源的一款服务保护框架,目前已经加入SpringCloudAlibaba中。官方网站:https://sentinelguard.io/zh-cn/ Sentinel的使用可以分为两个部......