【第30章】Spring Cloud之Sentinel动态规则扩展


前言

之前我们定义的流控和熔断规则应用每次重启之后就丢失了,是因为在控制定义规则这些规则仅在内存态生效,应用重启之后,该规则会丢失,这就是规则推送的原始模式。

规则推送分为 3 种模式,包括 “原始模式”、“Pull 模式” 和"Push 模式"。

这里我们主要介绍官方推荐的 push 模式,结合Nacos来完成Sentinel规则的存储。


一、规则管理及推送

一般来说,规则的推送有下面三种模式:

推送模式说明优点缺点
原始模式API 将规则推送至客户端并直接更新到内存中,扩展写数据源(WritableDataSource)简单,无任何依赖不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境
Pull 模式扩展写数据源(WritableDataSource), 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等简单,无任何依赖;规则持久化不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。
Push 模式扩展读数据源(ReadableDataSource),规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。规则持久化;一致性;快速引入第三方依赖

通过表格可以看出Push模式是目前比较完善的解决方案,不存在明显的缺点。

二、DataSource 扩展

我们推荐通过控制台设置规则后将规则推送到统一的规则中心,客户端实现 ReadableDataSource 接口端监听规则中心实时获取变更,流程如下:
在这里插入图片描述

1. 引入依赖

<!-- https://mvnrepository.com/artifact/com.alibaba.csp/sentinel-datasource-nacos -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.8</version>
</dependency>

2. 规则文件

我们在Nacos新建配置文件provider-service-flow-rules.json,这里分组定义为SENTINEL_GROUP,和服务配置区分开

[
  {
    "resource": "/sentinel/flow",
    "controlBehavior": 0,
    "count": 5,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0
  }
]

注意我们这里的resource定义不包含应用上下文路径,要和簇点链路中资源名称保持一致
在这里插入图片描述

3. 定义数据源信息

Sentinel starter 整合了目前存在的几类 ReadableDataSource。只需要在配置文件中进行相关配置,即可在 Spring 容器中自动注册 DataSource。

spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        dashboard: 192.168.137.192:8080
      datasource:
        ds1:
          nacos:
            server-addr: ${NACOS_SERVER_ADDR}
            namespace: ${NACOS_NAMESPACE}
            username: ${NACOS_USERNAME}
            password: ${NACOS_PASSWORD}
            dataId: ${spring.application.name}-flow-rules.json
            groupId: SENTINEL_GROUP
            data-type: json
            rule-type: flow

我们可以定义多个数据源,和ds1:保持同级定义ds2:,ds3:即可

ReadableDataSource 加载规则数据成功的时候,控制台会打印出相应的日志信息:

2024-08-31T16:53:36.153+08:00  INFO 13708 --- [provider-service] [           main] c.a.n.client.config.impl.ClientWorker    : [fixed-dev-192.168.137.192_8848] [subscribe] provider-service-flow-rules.json+SENTINEL_GROUP+dev
2024-08-31T16:53:36.161+08:00  INFO 13708 --- [provider-service] [           main] c.a.nacos.client.config.impl.CacheData   : [fixed-dev-192.168.137.192_8848] [add-listener] ok, tenant=dev, dataId=provider-service-flow-rules.json, group=SENTINEL_GROUP, cnt=1

三、服务定义和测试

1. 服务定义

package org.example.nacos.provider.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * Create by zjg on 2024/8/31
 */
@RestController
public class SentinelController {
    @GetMapping(value = "/sentinel/flow")
    public String flow(@RequestParam("name") String name) {
        return "hello"+name;
    }
}

2. 并发测试

在这里插入图片描述
在这里插入图片描述
我们定义的流控规则已经生效了,限流阈值5,导致了第6个请求失败,符合预期。

3. 控制台查看规则

在这里插入图片描述
我们通过Nacos定义的provider-service-flow-rules.json流控配置文件已经生效,并且我们可以通过Nacos动态调整流控和熔断等各种各样的规则,推送到Sentinel 控制台。


总结

回到顶部
上图的①到③环节已经打通,但是到这里,还有些问题,我们通过Sentinel 控制台修改规则,却无法保存到我们的Nacos配置中心,重启还是会丢失,下一章我们让Sentinel 控制台修改规则推送到配置文件中去,完成持久化存储的功能。

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Cloud Gateway SentinelSpring Cloud Gateway的一个扩展,用于提供应用程序的流量限制和熔断功能。 首先,Spring Cloud Gateway是一个基于Spring Boot的API网关,用于构建微服务架构中的API服务网关。它提供了路由和过滤功能,能够处理HTTP请求并进行相应的转发、过滤和路由。 而Sentinel是阿里巴巴开源的一种流量控制组件,它具备实时监控、熔断降级、系统自适应、热点参数限流等功能。通过Sentinel,可以实现对流量的实时控制和管理,在高并发请求的情况下,可以有效地保护应用系统,避免雪崩效应的发生。 Spring Cloud Gateway SentinelSentinel的流量控制和熔断能力集成到了Spring Cloud Gateway中。它可以通过配置规则来限制每个API接口的访问流量,并在流量超出限制时,进行限流处理,保护应用程序的稳定性。同时,它还可以根据实际情况对请求进行熔断,从而避免请求过多导致服务不可用。 通过使用Spring Cloud Gateway Sentinel,我们可以灵活地对API接口进行流量控制和熔断处理,提高系统的稳定性和可用性。它的配置简单灵活,集成了Spring Cloud Gateway和Sentinel的优势,可以帮助我们更好地构建和管理微服务架构中的API服务网关。 ### 回答2: Spring Cloud Gateway Sentinel是一种基于Sentinel的流量控制和故障熔断的解决方案。Spring Cloud Gateway是一个轻量级的网关服务组件,而Sentinel是一个开源的流量控制和故障熔断框架。通过将两者结合使用,可以实现在网关层面对流量进行实时控制和保护。 Spring Cloud Gateway Sentinel提供了一系列的规则和策略,可以根据业务的需要进行配置。可以通过设置流量控制规则,限制某个接口的访问频率,防止过多的请求导致系统崩溃。另外,还可以设置熔断规则,当某个接口出现异常或者响应时间过长时,可以自动开启熔断策略,避免影响到其他正常的请求。 使用Spring Cloud Gateway Sentinel可以提高系统的可靠性和稳定性。当系统的流量过大或者出现异常时,会自动触发流量控制和熔断策略,保护系统的正常运行。同时,通过监控和日志记录,可以实时了解系统的运行状态和性能指标,方便进行故障排查和性能优化。 总之,Spring Cloud Gateway Sentinel是一个强大的流量控制和故障熔断的组件,可以保护系统免受异常流量的影响,确保系统的稳定性和可靠性。在微服务架构中,它发挥着重要的作用,对于系统的安全和性能优化有着重要的意义。 ### 回答3: Spring Cloud Gateway是Spring Cloud生态系统中的一个开源网关项目,它提供了一种统一的的API管理方式,用于处理所有请求并将它们路由到适当的服务上。而Sentinel是一个开源的流量控制和熔断降级的框架,它提供了实时的监控和控制,以保护分布式系统免受故障的影响。 Spring Cloud Gateway集成了Sentinel用于增强网关的功能。它可以通过使用Sentinel进行流量控制和熔断降级,以确保服务的可用性和稳定性。可以根据业务需求,配置规则来限制请求的频率,避免由于高并发造成的系统崩溃,同时还能通过熔断降级机制来防止请求被无效的服务占用,提高整个系统的可靠性。 Spring Cloud Gateway使用Sentinel可以提供实时的流量监控和控制功能,可以根据实时的请求情况对服务进行动态调整。Sentinel可以监控各个服务的QPS(每秒请求数),RT(响应时间)和异常比例等指标,并通过自定义的规则进行实时的流量控制和限制。当某个服务出现异常或超过设定的阈值时,Sentinel可以及时触发熔断降级策略,将请求快速失败,避免传递到后端服务,保护整个系统免受故障的影响。 总之,Spring Cloud Gateway集成Sentinel可以通过流量控制和熔断降级来提高系统的可用性和稳定性,保证服务的高效运行。它能够实时监控服务的运行指标,并根据实时的情况对流量进行动态调整,保护系统免受故障的影响。这是一个非常强大和有用的功能,可以帮助开发人员构建可靠和鲁棒的微服务架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值