使用场景

在微服务架构中,服务之间会进行大量的调用。为了防止某个服务被过多的请求压垮,导致整个系统崩溃,就需要对流量进行控制。同时,当某个服务出现故障时,为了防止故障扩散到整个系统,需要进行熔断操作。Sentinel提供了流量控制和熔断降级的功能,因此非常适合在这种场景下使用。

雪崩效应

在微服务系统架构中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。一个服务的不可用导致整个系统的不可用的现象就被称之为雪崩效应。

解决方法

  1. 超时处理

    在设置两个或多个微服务之间相互访问的时候,我使用的是OpenFeign来实现的访问,OpenFeign中可以自定义配置,日志配置、超时配置、重试配置
  2. 隔离处理https://www.jindouyun.cn/document/industry/details/184685#_293
  3. 熔断处理https://www.jindouyun.cn/document/industry/details/184685#_293
  4. 流量控制

    本篇文章主要学习的是如何使用流量控制来处理请求过多导致微服务服务器崩溃

流量控制使用的是Sentinel组件来实现需求

Sentinel前言配置

1.下载

在官网下载Sentinel控制器https://github.com/alibaba/Sentinel/releases

下载完成后可以在下载目录中找到一个Jar包,那就是我们启动sentinel所需要的资源

2.启动

java -jar +目录下的jar包

如果需要更改默认端口,账号,密码,可以通过以下配置

配置项 默认值 说明
server.port 8080 服务端口
sentinel.dashboard.auth.username sentinel 默认用户名
sentinel.dashboard.auth.password sentinel 默认密码

注意需要在每一个配置项前面添加(-D)

例如:修改端口号java -Dserver.port=8090 -jar sentinel-dashboard-2.0.0-alpha-preview.jar

3.访问Sentinel页面

访问http://localhost:8080页面,就可以看到sentinel的控制台了:

如何在IDEA中整合Sentinel

1.导入依赖

  1. <!--sentinel的依赖-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  5. </dependency>

2.在IDEA的yaml或者yml文件中导入相关的配置

  1. spring:
  2. cloud:
  3. sentinel:
  4. transport:
  5. dashboard: localhost:8080 # 配置sentinel控制台地址

3.访问任意一个控制层的接口,就可以触发sentinel的监控

使用Sentinel流量控制(当系统面临高并发请求时,防止系统过载....)

Sentinel是在上述四种处理方法中唯一一个提前预防来处理问题的

首先我们先了解流量控制中的相关概念

1.簇点链路

当请求进入微服务时,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper,这样的一个调用链就叫做簇点链路

2.资源

簇点链路中每一个被监控的Controller接口就是一个资源-->流控、熔断等都是针对簇点链路中的资源来设置的

  • 流控: 流量控制
  • 降级:降级熔断
  • 热点:热点参数限流,是限流的一种
  • 授权:请求的权限控制

sentinel快速入门

1.创建一个控制层在,其中编写Controller

  1. @GetMapping("/findUserByUserId/{userId}")
  2. public User findUserByUserId(@PathVariable("userId") Long userId) {
  3. return userService.findUserByUserId(userId);
  4. }
  5. 顺便补齐后续的ServerMapper,还有根据用户Id查询用户信息的SQL语句
  6. 记得配置前面的依赖和配置

2.在浏览器访问ConTroller资源路径后,就可以在sentinel控制中心看到对应的请求



我们可以点击后面的流控来进行操作

  • 单机阈值:每秒最大能接收的请求数量

    为了模拟并发请求这里我们需要使用一个工具(jmeter测试工具)



    这里设置好线程数和时间,然后启动,我们就能看到相对应的效果



    上述图片中线程数是我们需要发送的请求数量,时间是我们需要运行的时间,所以每秒发送的请求数量是10,但是我们设置的单机阈值是5,所以会出现前五个请求成功,后五个请求失败的效果

    注意:如果测试结果不是上述情况,那是因为sentinel在统计请求的时候,把一部分的请求统计到了下一秒中导致的。

sentinel中三种详细的模式使用及介绍

  1. 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
  2. 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
  3. 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流

直接模式

就是我们上面的快速入门案例

关联模式

统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流

配置方式:



1.基于上面的Controller我们需要再一次创建一个请求以便实现我们的功能

  1. @GetMapping("/UpdataUserById")
  2. public String UpdataUserById(){
  3. return "修改用户数据成功";
  4. }

2.重启服务,在浏览器发送对应的的请求,让其产生簇点链路



3.配置流控规则,当/api/user/updateUserById资源被访问的QPS超过5时,对/api/user/findUserByUserId/1请求限流。对哪个端点限流,就点击哪个端点后面的按钮。我们是对用户查询/api/user/findUserByUserId/1限流,因此点击它后面的按钮:



4.在Jmeter中进行测试



链路模式

只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值,如果超过阈值对从该链路请求进行限流。

配置方法:

如果只希望统计从/api/user/query进入到users的请求,并进行限流操作,则可以这样配置:



2.案例实现

  • 在UserService中添加一个queryUsers方法,不用实现业务
  1. public void queryUsers(){
  2. System.err.println("查询用户");
  3. }
  • 在上述Controller中,添加两个端点(请求方法),在这两个端点中分别调用UserService中的queryUsers方法
  1. @GetMapping(value = "/save")
  2. public String save() {
  3. userService.queryUsers();
  4. System.out.println("保存用户");
  5. return "订单保存成功" ;
  6. }
  7. @GetMapping(value = "/query")
  8. public String query() {
  9. userService.queryUsers();
  10. System.out.println("查询用户");
  11. return "查询用户成功" ;
  12. }
  • 通过@SentinelResource标记UserService中的queryUsers方法为一个sentinel监控的资源(默认情况下,sentinel只监控controller方法)
  1. @SentinelResource("users")
  2. public void queryUsers(){
  3. System.err.println("查询用户");
  4. }
  • 更改application.yml文件中的sentinel配置

    链路模式中,是对不同来源的两个链路做监控。但是sentinel默认会给进入spring mvc的所有请求设置同一个root资源,会导致链路模式失效。因此需要关闭这种资源整合。
  1. spring:
  2. cloud:
  3. sentinel:
  4. web-context-unify: false # 关闭context整合
  • 重启服务,访问/api/user/save和/api/user/query,可以查看到sentinel的簇点链路规则中,出现了新的资源

  • 添加流控规则,点击users资源后面的流控按钮,在弹出的表单中填写下面信息:



    只统计从/api/user/query进入/users的资源,QPS阈值为2,超出则被限流。
  • jmeter测试

    选择《流控模式-链路》



    可以看到这里200个线程,50秒内发完,QPS为4,超过了我们设定的阈值2。

    一个http请求是访问/api/user/save



    另一个是访问/api/user/query



    运行测试,察看结果树:

    访问/api/user/save,没有进行限流



    访问/api/user/query,进行限流了

流控效果

  1. 快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常,是默认的处理方式
  2. warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常,但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值
  3. 排队等待:让所有的请求按照先后次序进入到一个队列中进行排队,当某一个请求最大的预期等待时间超过了所设定的超时时间时同样是拒绝并抛出异常

warm up

  • 阈值(QPS):是一个微服务一秒能够承受的最大的请求数
  • 冷启动:刚启动一个服务器的时候,一切资源尚未启动
  • 如果直接将QPS跑到最大,可能导致服务器宕机

    Warm Up 也叫做预热模式,个人理解是阈值是一个动态的,会从一个较小值逐渐增加到最大阈值。

WarmUp案例:

测试的是上述Controller的/api/user/findUserByUserId/1

  • 设置最大阈值10,预热时间5秒
  • 在测试工具中设置线程数200,时间20秒->每秒10个请求

    得出的结果是由最刚开始的三个成功请求,随着时间的推移阈值会变大,成功的请求也会变多,直到最大阈值10

排队等待

解释:假设我现在有最大阈值10,第一秒我处理了10个请求,但是我每秒接收的请求是15,那么多出来的5个请求就会存放在队列中等待,第二秒我会优先处理上一次在队列中的请求,那么这一次我的队列中就存在10个请求...依次类推

当某一个请求在队列中等待的时间超过了设置的超时时间,那么这个请求同样是拒绝并抛出异常

那么等待的时间如何计算呢?

假如最大阈值为5,就是一秒处理5个请求,1/5=0.2/s 每200ms处理一个请求,设置超时时间=2000ms,那么就是等待时间超过了2000ms的请求就会被拒绝

比如现在有12个请求

那么第六个请求的预期等待时间=200ms(6-1)=1000ms

第十二个的请求的预期等待时间=200ms
(12-1)=2200ms,那么第十二个请求就会被拒绝

排队等待案例:

1.给/api/user/findUserByUserId/{userId}这个资源设置限流,最大QPS为10,利用排队的流控效果,超时时长设置为5s

2.在测试工具中设置线程数300,时间为20,那么每秒发送的请求为15个,QPS=15超过了我们设置的10,

3.结果等待时间长的将会被拒绝



4.在sentinel的监控中实时监控的QPS曲线

热点参数限流

使用场景

双十一的情境下,某些特价商品访问量非常大,但是一些普通的商品访问量比较正常,那么我们可以根据,发送的请求中的参数来设置热点限流,热点指的是访问量多的商品

热点参数限流:

统计请求中参数相同的情况,判断是否超过了阈值,超过了阈值就限流

热点参数限流实现

1.需要在所属的Controller的请求方法上添加注解

@SentinelResource("hot") 括号内填写上面名字都行,但是要对应编辑热点规则的资源名

2.配置sentinel

  • 在热点规则中添加新的热点规则

这是当id=1的情况,不是热点代码每秒只能执行2个请求 这是当id=2的情况,是热点代码每秒只能执行5个请求 这是当id=3的情况,是热点代码每秒只能执行10个请求

Sentinel简单使用(1)的更多相关文章

  1. Redis Sentinel 模拟故障迁移

    什么是redis sentinel 参考文档:https://redis.io/topics/sentinel 简单的来说,就是Redis Sentinel 为redis 提供高可用性,主要体现在下面 ...

  2. Redis、Redis+sentinel安装(Ubuntu 14.04下Redis安装及简单测试)

    Ubuntu下Redis安装两种安装方式: 1.apt-get方式 步骤: 以root权限登录,切换到/usr目录下. 接下来输入命令,apt-get install redis-server,如图: ...

  3. Redis master/slave,sentinel,Cluster简单总结

    现在互联网项目中大量使用了redis,本文著主要分析下redis 单点,master/slave,sentinel模式.cluster的一些特点. 一.单节点模式 单节点实例还是比较简单的,平时做个测 ...

  4. 【Redis】Redis学习(二) master/slave、sentinel、Cluster简单总结

    项目中用到Redis,所以准备学习一下,感觉Redis的概念还是很多的,什么主从模式.sentinel模式.集群模式的,一下子都晕了,我觉得还是有必要先理清这些基本概念再说. 一.单节点实例 单节点实 ...

  5. 快速体验 Sentinel 集群限流功能,只需简单几步

    ️ Pic by Alibaba Tech on Facebook 集群限流 可以限制某个资源调用在集群内的总 QPS,并且可以解决单机流量不均导致总的流控效果不佳的问题,是保障服务稳定性的利器. S ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(十六)——dapr+sentinel中间件实现服务保护

    dapr目前更新到了1.2版本,在之前4月份的时候来自阿里的开发工程师发起了一个dapr集成Alibaba Sentinel的提案,很快被社区加入到了1.2的里程碑中并且在1.2 release 相关 ...

  7. 流量治理神器-Sentinel 究竟是怎么做到让业务方接入简单?

    大家好,我是架构摆渡人,这是流量治理系列的第10篇原创文章,如果有收获,还请分享给更多的朋友. 做业务开发,需要考虑业务的扩展性.做基础框架开发,需要考虑如何让业务方接入,使用简单,尽量不要耦合在业务 ...

  8. spring cloud alibaba sentinel 运行及简单使用

    1.官网 英文:https://github.com/alibaba/Sentinel 中文:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7 ...

  9. Redis集群~windows下搭建Sentinel环境及它对主从模式的实际意义

    回到目录 关于redis-sentinel出现的原因 Redis集群的主从模式有个最大的弊端,就是当主master挂了之前,它的slave从服务器无法提升为主,而在redis-sentinel出现之后 ...

  10. Redis Sentinel集群配置中的一些细节

    今天在配置Redis集群,用作Tomcat集群的缓存共享.关于Redis集群的配置网上有很多文章,这里只是记录一下我在配置过程中遇到的一些小的细节问题. 1. 关于Protected Mode的问题 ...

随机推荐

  1. 一个专为量化投资开发的强化学习算法框架:ElegantRL

    链接: https://github.com/AI4Finance-Foundation/ElegantRL 这是一个专为量化投资开发的强化学习算法框架. 相关论文: ElegantRL-Podrac ...

  2. openAI的仿真环境Gym Retro的Python API接口

    如题,本文主要介绍仿真环境Gym Retro的Python API接口 . 官网地址: https://retro.readthedocs.io/en/latest/python.html ===== ...

  3. jQuery Eazyui的学习和使用(二)

    既然这么优秀,我们赶紧来学学吧~ 下载地址 解压得到这些文件夹: 下面开始学习使用.(根据提供的demo学习常用基础控件的使用) 基础面板 引入对应样式文件和js文件后就可以直接使用了. 代码: &l ...

  4. 告别手动调度,海豚调度器 3.1.x 集群部署让你轻松管理多机!

    转载自第一片心意 1 前言 由于海豚调度器官网的集群部署文档写的较乱,安装过程中需要跳转到很多地方进行操作,所以自己总结了一篇可以直接跟着从头到尾进行操作的文档,以方便后续的部署.升级.新增节点.减少 ...

  5. 9组-Beta冲刺-3/5

    一.基本情况(15分) 队名:不行就摆了吧 组长博客:9组-Beta冲刺-3/5 GitHub链接:https://github.com/miaohengming/studynote/tree/mai ...

  6. MPTCP(一) :MPTCP概览

    MPTCP概览 参考链接 MPTCP官网 http://multipath-tcp.org/ MPTCP入门 https://access.redhat.com/documentation/zh-cn ...

  7. P2P 下载入门

    基本概念 直链下载: https://file-examples.com/wp-content/storage/2017/04/file_example_MP4_480_1_5MG.mp4 直链就是一 ...

  8. MATLAB 使用

    MATLAB CLI 启动 MATLAB CLI 交互式界面(需要已安装 MATLAB): matlab -nodesktop -nosplash # 无桌面环境,无启动动画 不启动 MATLAB 直 ...

  9. 【YashanDB知识库】filter or改写问题

    问题现象 当filter中出现or的时候,会导致filter无法走索引或者走hash join,就需要进行改写,例如: create table test_tab1(col1 int, col2 in ...

  10. 使用 Dependify 工具探索 .NET 应用程序依赖项

    在大型项目中,由于各种组件的复杂性和互连性,管理依赖项可能变得具有挑战性.如果没有适当的工具或文档,可能很难浏览项目并对依赖项做出假设.以下是在大型项目中难以导航项目依赖项的几个原因: 复杂性:大型项 ...