Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则

前面几篇文章较为详细的介绍了Sentinel的使用姿势,还没看过的小伙伴可以访问以下链接查看:

但是依然无法满足我们日常的生产需要,其中,非常重要的一点就是限流规则的配置是存在当前应用的内存中的,每次我们重启应用以后,我们在Sentinel控制台中配置的规则就丢失了,下面,我们就介绍一下Sentinel规则持久化的方式。

Sentinel为我们提供了两种方式对规则进行修改:

  • 通过 API 直接修改 (loadRules)
  • 通过 DataSource 适配不同数据源修改

loadRules() 方法只接受内存态的规则对象,但更多时候规则存储在文件、数据库或者配置中心当中。DataSource 接口给我们提供了对接任意配置源的能力。相比直接通过 API 修改规则,实现 DataSource 接口是更加可靠的做法。

DataSource 扩展常见的实现方式有:

  • 拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更;
  • 推模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。

Sentinel 目前支持以下数据源扩展:

  • Pull-based: 文件、Consul (since 1.7.0)
  • Push-based: ZooKeeper, Redis, Nacos, Apollo

这里,我们重点介绍一下Sentinel基于Nacos实现动态规则。

1. Sentinel基于Nacos动态规则实战

1.1 创建子工程sentinel_nacos

工程依赖pom.xml如下:

代码清单:Alibaba/sentinel-springcloud-high/sentinel_nacos/pom.xml


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

1.2 配置文件application.yml如下:

代码清单:Alibaba/sentinel-springcloud-high/sentinel_nacos/src/main/resources/application.yml


server:
port: 10000
spring:
application:
name: spring-cloud-sentinel-nacos
cloud:
nacos:
discovery:
server-addr: 192.168.44.129:8848
sentinel:
transport:
dashboard: localhost:8080
port: 8720
datasource:
ds:
nacos:
server-addr: 192.168.44.129:8848
dataId: spring-cloud-sentinel-nacos
groupId: DEFAULT_GROUP
rule-type: flow
namespace: 8282c713-da90-486a-8438-2a5a212ef44f
  • spring.cloud.sentinel.transport.dashboard:Sentinel控制台的访问地址。
  • spring.cloud.sentinel.datasource.ds.nacos.server-addr:nacos的访问地址。
  • spring.cloud.sentinel.datasource.ds.nacos.dataId:nacos中存储规则的groupId。
  • spring.cloud.sentinel.datasource.ds.nacos.groupId:nacos中存储规则的dataId。
  • spring.cloud.sentinel.datasource.ds.nacos.rule-type:用来定义存储的规则类型,不可为空。
  • spring.cloud.sentinel.datasource.ds.nacos.namespace:nacos中存储规则的namespace。

由于版本迭代关系,本示例中的配置信息不一定适用于所有版本,可以通过分析DataSourcePropertiesConfigurationNacosDataSourcePropertiesAbstractDataSourceProperties这三个配置来得出具体配置内容,会更为准确。

例如,本示例中的配置来源于NacosDataSourcePropertiesAbstractDataSourceProperties

NacosDataSourceProperties源码如下:

public class NacosDataSourceProperties extends AbstractDataSourceProperties {

	private String serverAddr;

	@NotEmpty
private String groupId = "DEFAULT_GROUP"; @NotEmpty
private String dataId; private String endpoint;
private String namespace;
private String accessKey;
private String secretKey; // 代码省略...
}

AbstractDataSourceProperties源码如下:

public class AbstractDataSourceProperties {

	@NotEmpty
private String dataType = "json";
@NotNull
private RuleType ruleType;
private String converterClass;
@JsonIgnore
private final String factoryBeanName;
@JsonIgnore
private Environment env;
}

笔者这里仅配置一个不可为空并且没有默认值的ruleType,有关ruleType的取值可以查看com.alibaba.cloud.sentinel.datasource.RuleType,这是一个枚举类型。

1.3 创建一个接口测试类HelloController.java如下:

代码清单:Alibaba/sentinel-springcloud-high/sentinel_nacos/src/main/java/com/springcloud/sentinel_nacos/controller/HelloController.java


@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(HttpServletRequest request) {
return "Hello, port is: " + request.getLocalPort();
}
}

1.4 配置Nacos配置中心

配置内容如图:

注意其中配置的Data ID和Group要和程序中配置的保持一致。格式选择JSON,填入的内容如下:

[
{
"resource": "/hello",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]

可以看到上面配置规则是一个数组类型,数组中的每个对象是针对每一个保护资源的配置对象,每个对象中的属性解释如下:

  • resource:资源名,即限流规则的作用对象。
  • limitApp:流控针对的调用来源,若为 default 则不区分调用来源。
  • grade:限流阈值类型,QPS 或线程数模式,0代表根据并发数量来限流,1代表根据QPS来进行流量控制。
  • count:限流阈值
  • strategy:判断的根据是资源自身,还是根据其它关联资源 (refResource),还是根据链路入口
  • controlBehavior:流控效果(直接拒绝 / 排队等待 / 慢启动模式)
  • clusterMode:是否为集群模式

1.5 测试

正常启动子工程,打开浏览器访问几次http://localhost:10000/hello ,速度快一些可以发现已经限流了,限流后页面显示如下:

Blocked by Sentinel (flow limiting)

正面限流配置成功,这时我们打开Sentinel控制台,看一下流量规则限制,已经有一条数据了,是我们在Nacos中配置的数据,如图:

注意:

在Sentinel动态规则整合了Nacos以后,对于修改接口流量控制就有两个地方了,一个是Sentinel的控制台,还有一个是Nacos的控制台。

但是要谨记,在当前版本中,在Sentinel控制台中修改了规则,将不会同步至Nacos的配置中心,而在Nacos中修改了配置规则,则会通过在客户端的Listener来是同步Sentinel控制台。所以,在整合了Nacos做动态规则存储后需要注意两点:

  • Sentinel控制台中修改规则:仅存在于服务的内存中,不会修改Nacos中的配置值,重启后恢复原来的值。
  • Nacos控制台中修改规则:服务的内存中规则会更新,Nacos中持久化规则也会更新,重启后依然保持。

建议各位堵住最好在Nacos控制台做规则的修改操作,尽量避免直接在Sentinel控制台中直接做规则修改。

2. 示例代码

Github-示例代码

Gitee-示例代码

Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则的更多相关文章

  1. Spring Cloud Alibaba | Sentinel: 分布式系统的流量防卫兵初探

    目录 Spring Cloud Alibaba | Sentinel: 分布式系统的流量防卫兵初探 1. Sentinel 是什么? 2. Sentinel 的特征: 3. Sentinel 的开源生 ...

  2. alibaba/Sentinel 分布式 系统流量防卫兵

    Sentinel: 分布式系统的流量防卫兵 Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多 ...

  3. Sentinel分布式系统的流量防卫兵

    Sentinel 是什么?官网:https://github.com/alibaba/Sentinel/wiki/介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量 ...

  4. Sentinel: 分布式系统的流量防卫兵

    前言 在 Spring Cloud 体系中,熔断降级我们会使用 Hystrix 框架,限流通常会在 Zuul 中进行处理,Zuul 中没有自带限流的功能,我们可以自己做限流或者集成第三方开源的限流框架 ...

  5. Spring Cloud Alibaba | Sentinel: 服务限流基础篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定 ...

  6. Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战

    Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战 Springboot: 2.1.8.RELEASE SpringCloud: Greenwich.SR2 ...

  7. Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战

    Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战 在阅读本文前,建议先阅读<Spring Cloud Alibaba | Sentinel:分布式系 ...

  8. Spring Cloud Alibaba | Sentinel: 服务限流高级篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 1. 熔断降级 1.1 降级策略 2. 热点参数限流 2.1 项目依赖 2.2 热点参数规则 3. 系统自适应限 ...

  9. Spring Cloud Alibaba Sentinel对Feign的支持

    Spring Cloud Alibaba Sentinel 除了对 RestTemplate 做了支持,同样对于 Feign 也做了支持,如果我们要从 Hystrix 切换到 Sentinel 是非常 ...

随机推荐

  1. 【0728 | 预习】第三篇 Python基础

    第三篇 Python基础预习 Part 1 变量 一.什么是变量? 二.为什么要有变量? 三.定义变量 四.变量的组成 五.变量名的命名规范 六.变量名的两种风格 Part 2 常量 Part 3 P ...

  2. sql server数据库查询链接服务器

    服务器对象->链接服务器: 或者 select  * from sys.servers: 找到服务器对象名称 select  * from [服务器对象名称].[数据库名称].dbo.[表名]:

  3. 章节十五、9-自定义Loggers

    一.如何给不同的包设置不同的日志级别? 1.针对不同的包来记录不同级别的日志信息 2.在日志xml配置文件中加入配置信息(红色标注) <?xml version="1.0" ...

  4. 7.26 面向对象_封装_property_接口

    封装 封装 就是隐藏内部实现细节, 将复杂的,丑陋的,隐私的细节隐藏到内部,对外提供简单的访问接口 为什么要封装 1.保证关键数据的安全性 2.对外部隐藏实现细节,隔离复杂度 什么时候应该封装 1.当 ...

  5. java-初读 HashTable

    有用的标识符 transiant 有用的属性 初始容量11 加载因子0.75 这里理解如果要经常插入大量数据可以增大加载因子 有用的方法 @Test public void testNan() { l ...

  6. idea2019.2安装指南

    先去官网下载idea官网地址 下载UItimate版本点击 DOWNLOAD等待下载完成 点击ideaIU-2019.2.exe一路next      可以在这一步选一下 继续next         ...

  7. [SCOI2009]粉刷匠(动态规划,序列dp,背包)

    分别对每块木板做区间dp,设\(g[i][j]\)表示前i个格子,刷恰好j次,并且第i格是合法的最多合法的格子数.从前往后枚举断点来转移就好了. 这样处理再出来\(g[i][j]\)每一块木板i刷j次 ...

  8. k好数(动态规划)

    问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22 ...

  9. 随笔编号-16 JAVA知识框架

    基于 J2EE 列举的知识架构,大体列举开发基础知识.帮助我随时查缺补漏,奉行好记性不如烂笔头.写了这该随笔,以便后续查询. 1  JAVA简介 2  JAVA编程环境 3  JAVA基本编程结构 4 ...

  10. NanoPi NEO2 学习笔记 1:安装系统、首次开机和一些设置

    初识NEO2 前几天搞到了一块NanoPi NEO2,A53的核心,512M内存,一个千兆网口,非常小的体积,质量也不错,非常满意,140元的价格可以买到这样一块ARM开发板也是非常划算了,非常适合低 ...