首页 > 编程知识 正文

redis实现限流(redis实现分布式限流)

时间:2023-05-04 23:01:48 阅读:85584 作者:3504

我想的文章对你有用,公众号:关注极客挖掘机,可以得到更多干货推送:)

上一篇文章详细介绍了Sentinel的使用姿势。 如果您还没有见过合作伙伴,请访问以下链接。

Sentinel :分布式系统的流量防御兵基础实战《Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战》但仍然不能满足我们日常的生产需求,其中,非常重要的是限流规则的配置存在于当前应用的内存中,每当我们重新开始应用,我们就会Sentinel 下面,我们介绍Sentinel规则的持续化方式。

Sentinel提供了两种修改规则的方法。

修改loadRules (通过API直接修改(loadRules )数据源适应不同数据源的修改loadRules ) )方法只接受内存状态的规则对象,但规则通常是文件、数据库DataSource接口提供了连接到任何配置源的功能。 实现DataSource接口比使用API直接修改规则更可靠。

DataSource扩展的典型实现方法是:

拉式模式:客户端定期向规则管理中心(如RDBMS、文件和VCS )轮询拉式规则。 这样做很简单,缺点是不能马上取得改变; 推送模式:由规则中心统一推送,客户机通过注册监听程序,随时拦截变化,如使用Nacos、Zookeeper等配置中心。 这种方式有更好的实时性和一致性保证。 英特尔目前支持以下数据源扩展:

基于推挽的:文件,控制台(since1.7.0)基于推送的: Zookeeper,Redis,Nacos,Apollo在这里,Sentinel基于Nacos

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

1.1子工程sentinel_nacos的创建

工程依赖于pom.xml。

代码列表: Alibaba/sentinel-spring cloud -高/sentinel _ nacos/POM.XML

从属关系

groupid org.spring框架. boot/groupid

artifactidspring -启动-启动- web /影响id

/从属关系

从属关系

groupIdcom.alibaba.csp/groupId

artifactidsentinel -数据源-国家/地区/地区id

/从属关系

1.2轮廓application.yml如下所示。

代码列表: Alibaba/Sentinel-spring cloud -高/Sentinel _ Nacos/SRC /主/资源/应用程序. yml

服务器:

端口: 10000

spring:

APP 3:

name : spring-cloud-sentinel-nacos

云:

美国航空:

发现:

服务器- addr :192.168.44.12933608848

英特尔:

传输:

dashboard :本地主机:8080

端口: 8720

数据源:

ds:

美国航空:

服务器- addr :192.168.44.12933608848

dataid : spring-cloud-sentinel-nacos

组:默认组

规则类型:流量

美国航空33608282 c 713-DA90-486 a-8438-2a5a 212 EF 44f

spring.cloud.sentinel.transport.dashboard:sentinel控制台的访问地址。 spring.cloud.sentinel.data source.ds.nacos .服务器- addr:nacos的访问地址。 spring.cloud.sentinel.data source.ds.nacos.dataid :将规则存储在nacos中的组id。 spring.cloud.sentinel.data source.ds.nacos.groupid :将规则存储在nacos中的dataId。 spring.cloud.sentinel.data source.ds.nacos.rule-type :定义存储的规则类型。 不能为空。 spring.cloud.sentinel .数据源

.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. 示例代码

Github-示例代码:https://github.com/meteor1993/SpringCloudLearning/tree/master/Alibaba/sentinel-springcloud-high

Gitee-示例代码:https://gitee.com/inwsy/SpringCloudLearning/tree/master/Alibaba/sentinel-springcloud-high

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。