Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则
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。
由于版本迭代关系,本示例中的配置信息不一定适用于所有版本,可以通过分析DataSourcePropertiesConfiguration
、NacosDataSourceProperties
和AbstractDataSourceProperties
这三个配置来得出具体配置内容,会更为准确。
例如,本示例中的配置来源于NacosDataSourceProperties
和AbstractDataSourceProperties
。
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. 示例代码
Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则的更多相关文章
- Spring Cloud Alibaba | Sentinel: 分布式系统的流量防卫兵初探
目录 Spring Cloud Alibaba | Sentinel: 分布式系统的流量防卫兵初探 1. Sentinel 是什么? 2. Sentinel 的特征: 3. Sentinel 的开源生 ...
- alibaba/Sentinel 分布式 系统流量防卫兵
Sentinel: 分布式系统的流量防卫兵 Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多 ...
- Sentinel分布式系统的流量防卫兵
Sentinel 是什么?官网:https://github.com/alibaba/Sentinel/wiki/介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量 ...
- Sentinel: 分布式系统的流量防卫兵
前言 在 Spring Cloud 体系中,熔断降级我们会使用 Hystrix 框架,限流通常会在 Zuul 中进行处理,Zuul 中没有自带限流的功能,我们可以自己做限流或者集成第三方开源的限流框架 ...
- Spring Cloud Alibaba | Sentinel: 服务限流基础篇
目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定 ...
- Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战
Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战 Springboot: 2.1.8.RELEASE SpringCloud: Greenwich.SR2 ...
- Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战
Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战 在阅读本文前,建议先阅读<Spring Cloud Alibaba | Sentinel:分布式系 ...
- Spring Cloud Alibaba | Sentinel: 服务限流高级篇
目录 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 1. 熔断降级 1.1 降级策略 2. 热点参数限流 2.1 项目依赖 2.2 热点参数规则 3. 系统自适应限 ...
- Spring Cloud Alibaba Sentinel对Feign的支持
Spring Cloud Alibaba Sentinel 除了对 RestTemplate 做了支持,同样对于 Feign 也做了支持,如果我们要从 Hystrix 切换到 Sentinel 是非常 ...
随机推荐
- No!No!No! It's not fashion!
还记得搞怪的hold住姐Miss Lin么,对于人们常规的行为,Miss Lin会挑起夸张的眉毛说:"Oh my God, it's not fashion!".如果程序员圈子里有 ...
- [原创实践]IBM thinkpad T61制作和使用recovery光盘进行出厂系统恢复
制作系统恢复盘 之前制作了系统恢复光盘,包含Product recovery 光盘1和光盘2,rescure and recovery光盘. 联想笔记本XP系统有一个硬盘分区是用来做恢复的,双击硬盘即 ...
- 【KakaJSON手册】06_Model转JSON
前面的文章介绍了如何利用KakaJSON进行JSON转Model,从这篇文章开始介绍如何将Model转成JSON 生成JSON和JSONString struct Car: Convertible { ...
- Selenium webdriver工作原理
webdriver是以server-client 经典模式设计的 server端可以是任何浏览器作为remote server,职责就是处理client的请求并作出相应操作,response的具体内容 ...
- 纯css、js 的H5页面对接echarts
做项目时,会遇到一些零碎的技术点.记录下来以防忘记 需求:做可视化界面,但是需要兼容ie8,需要用纯css.js 的H5页面对接echarts,下面为效果图(带定时器循环显示tooltip). 实现方 ...
- Spring框架之JdbcTemplate
Spring框架之JdbcTemplate 一.JdbcTemplate简介 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到Jd ...
- 导航页的开发--手机web app开发笔记
好了,的所有的基础知识已经准备完毕了,现在开始制作引导页.这个引导页需要一个HTML文件,JS文件,一个CSS文件.在HBuilderX中根目录下添加“Guid.html”,在JS文件夹添加“myth ...
- three.js模拟实现太阳系行星体系
概况如下: 1.SphereGeometry实现自转的太阳: 2.RingGeometry实现太阳系星系的公转轨道: 3.ImageUtils加载球体和各行星贴图: 4.canvas中createRa ...
- Win10下安装python3.x+pycharm+autopep8
一.安装Python3.X 1.Pythong官方网站:http://python.org/getit/ 下载windows的安装包.有以下几个选项: 这里选择windows x86-64 exc ...
- WTM重磅更新,LayuiAdmin and more
从善如登,从恶如崩.对于一个开发人员来说,那就是做一个好的系统不容易,想搞砸一个系统很简单,删库跑路会还不会么. 对于我们开源框架的作者来说,做一个好的框架就像登山(也许是登天),我们一步一步往上走, ...