为什么接口访问太多会崩
QPS=1每秒只能访问一次
线程数=信号量隔离,就是接口最多使用多少个线程
仪表盘?
快速失败
Sentinel默认情况限流规则没有持久化,要持久化要使用zk、nacos、阿波罗
在网关里做限流,要整合网关
黑白名单
对IP实现限流/熔断机制
服务降级
服务隔离机制
服务限流:目的为了保护我们的服务,在高并发的情况下,如果客户端请求服务器端到一定的极限(设置阈值),请求的数量超出设置的阈值,开启自我保护机制,直接执行我们的服务降级方法,不会执行我们的业务逻辑,走本地falback方法
服务降级:在高并发的情况下,为了防止用户一直等待,采用限流或者熔断机制,保护我们服务,不会执行业务逻辑,走本地falback方法
服务雪崩:默认的情况下,tomcat/jetty服务器只有一个线程池处理所有的接口请求。在高并发的情况下,同一个接口访问占用了所有的线程池连接,导致其他接口不可以访问
服务雪崩解决方案:
服务隔离机制:线程池隔离或者信号量隔离机制
线程池隔离:每个接口都有自己独立的线程池维护我们的请求,每个线程池互不影响,就是每个接口有独立使用一个线程池,缺点:占用服务器内存非常大
信号量隔离:设置允许我们的某个接口有一个阈值的线程数量去处理接口,如果超出改线程数量则拒绝访问,有点类似服务限流
1、手动使用代码配置
2、Sentinel控制台形式配置
3、默认情况下Sentinel不对数据持久化,需要自己独立持久化
实现的步骤:
1、创建流控(限流)规则
控制台配置
下载对应Sentinel-Dashboard
https://github.com/alibaba/Sentinel/releases/tag/1.7.1 运行即可。
运行执行命令
java -Dserver.port=8718 -Dcsp.sentinel.dashboard.server=localhost:8718 -Dproject.name=sentinel-dashboard -Dcsp.sentinel.api.port=8719 -jar
账号密码都是sentinel
登录地址127.0.0.1:8718
springboot配置
1、yml 配置 sentinel
2、默认资源名称是接口地址 比如/xxx
3、接口加注解,限流友好提示blockHandler
服务熔断:接口调用时间(服务响应时间)超过指定时间
服务降级:一段时间内不能再次访问这个接口
接口调用时间(服务响应时间)超过指定时间,一段时间内不能再次访问这个接口
1、Nacos分布式配置中心:有界面,也不用重启服务器,推荐
2、携程阿波罗:有界面,也不用重启服务器,推荐
3、ZK,没有界面,不推荐
4、存放在本地文件:数据容易数据不一致,不推荐?
配置的限流在服务器重启后规则会被清空
Sentinel启动的时候读取naocs上的流控规则到内存中
整合nacos只要yml配置一下就好了,规则都写在nacos上,整合之后不能自己在代码里去配置流控规则,否则会覆盖nacos上的规则
因为访问的时候都是通过网关访问的
1、yml配置
2、加两个配置类,一个整合配置,一个规则配置
3、引入整合依赖
4、gateway中排除冲突web依赖包
4、重写默认的提示方法
达到阈值,走服务降级fallback方法,不会真是的执行我们的业务逻辑
服务降级三种策略:
1、rt(平均响应时间):一秒内接口的访问响应时间超过指定阈值,则触发服务熔断,调用服务降级方法,指定时间(时间窗口 秒)内,不能够再次访问接口,一秒内访问五次,五次的平均响应时间超过阈值,最大阈值为4.9秒,要改最大阈值要去改配置
2、异常比例:一秒内请求出现异常的比例超过指定阈值,服务降级,时间窗口(秒)-
3、异常次数:一分钟内请求出现异常的次数超过指定阈值,服务降级,时间窗口(分钟)-
可以同时使用多个策略