- 1.Sentinel简介
- 1.1 概述
- 2.Sentinel限流
- 2.1 概述
- 2.2 过程
- 2.2.1 Sentinel应用于服务的提供方(sca-provider),在pom中添加依赖
- 2.2.2 在配置文件中,添加Sentinel配置
- 2.2.3 创建一个Controller对象,用于演示限流 *** 作
- 2.2.4 启动服务,进行测试
- 2.3 Sentinel限流
- 2.3.1 选择需要限流的链路
- 2.3.2 设置限流策略
- 2.3.3 反复刷新访问消费端服务,检测是否有限流信息输出
- 2.3.4 刷新sentinel控制台,实时监控信息
- *2.4 面试题
- 3.Sentinel流控规则分析
- 3.1 阈值类型
- 3.2 设置限流模式
- 3.2.1 直接模式
- 3.2.2 关联模式
- 3.2.3 链路模式
- *3.3 面试题
- 4.Sentinel降级应用
- 4.1 降级入门
1.1 概述
- 我们如何在业务流量变化无常的情况下,保证各种业务安全运营,系统在任何情况下都不会崩溃呢?
- 我们可以在系统负载过高时,采用限流,降级和熔断,三种措施来保护系统,由此一些流量控制中间件诞生,例如sentinel
sentinel(分布式系统的流量防卫兵)是阿里开源的一套用于服务容错的综合性解决方案,他以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度来保护服务的稳定性
承接:
- 秒杀(突发流量控制在系统容量可以承受的范围)
- 消息削峰填谷
- 集群流量控制
- 实时熔断下游不可用应用
2.Sentinel限流 2.1 概述核心:
- 核心库(java客户端):能够运行于所有java运行时环境,同时对Dubbo/Spring Cloud 等框架有较好的支持
- 控制台(Dashboard):基于Spring Boot开发,打包后可以直接运行
我们系统中的数据库连接池,线程池,nginx的瞬时并发等在使用时都会给定一个限定的值,这本身就是一种限流的设计
限流的目的是为了防止恶意请求流量,恶意攻击,或者防止流量超过系统的峰值
2.2.2 在配置文件中,添加Sentinel配置com.alibaba.cloud spring-cloud-starter-alibaba-sentinel
spring: cloud: sentinel: transport: dashboard: localhost:8180 # 指定sentinel控制台地址。2.2.3 创建一个Controller对象,用于演示限流 *** 作
package com.jt.provider.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/provider") public class ProviderSentinelController { @GetMapping("/sentinel01") public String doSentinel01(){ return "sentinel 01 test ..."; } }2.2.4 启动服务,进行测试
或者
我们设置一下指定接口的流控(流量控制),QPS(每秒请求次数)单击阈值为1,代表每秒请求不能超出一次,否则做限流处理,处理方式是直接调用失败
2.3.1 选择需要限流的链路 2.3.2 设置限流策略这里设置1秒内只能请求1次
此时,我在1秒内请求了多次,出现限流信息
- Sentinel是什么?(阿里推出的一个流量控制平台,防卫兵)
- 类似Sentinel的产品还有哪些(hystrix – 一代微服务产品)
- Sentinel是如何对请求进行限流的(基于sentinel依赖提供的拦截器)
- 有哪些限流算法(计数器,令牌桶,漏斗算法,滑动窗口算法)
- Sentinel默认的限流算法是什么(滑动窗口算法)
- QPS: 当调用相关的url对应的资源时,QPS达到单机阈值时,就会限流
- 线程数:当调用相关url对应的资源时,线程数达到单击阈值时,就会限流
默认 [直接] ,还有关联,链路
3.2.1 直接模式默认情况下就是【直接->快速失败】
比如现在有两个业务,有一个业务相对重要,当这个重要的业务资源达到阈值,另外一个业务被限流
- 在ProviderSentinelController中添加一个方法
@GetMapping("/sentinel02") public String doSentinel02(){ return "sentinel 02 test ..."; }
- 在sentinel中做限流设计
- 在指定包创建一个ResourceService类
package com.jt.provider.service; import com.alibaba.csp.sentinel.annotation.SentinelResource; import org.springframework.stereotype.Service; @Service public class ResourceService{ @SentinelResource("doGetResource") public String doGetResource(){ return "doGetResource"; } }
- 在ProviderSentinelController中添加一个方法
@Autowired private ResourceService resourceService; @GetMapping("/sentinel03") public String doSentinel03() throws InterruptedException { //请求链路中的资源访问 resourceService.doGetResource(); return "sentinel 03 test"; }
- 在sentinel中配置限流规则
- 设置链路流控控制后,在频繁对限流链路进行访问,检测是否出现500异常,若出现,就是限流了
- 为了不让所有的节点都聚集在sentinel_spring_web_context下面,可以进行以下配置
链路不执行sentinel_spring_web_context默认聚集
sentinel: web-context-unify: false*3.3 面试题
- sentinel中的阈值应用类型吗?(两种-QPS,线程数)
- sentinel的限流规则中默认有哪些限流模式(直连,关联,链路)
- sentinel的限流效果有哪些(快速失败,预热,排队)
4.1 降级入门
- 除了流量控制以外,对调用链路中不稳定的资源熔断降级也是保障高可用的重要措施
- Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(比如说调用超时,异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其他资源导致级联错误.当资源被降级以后,在接下来的降级时间窗口内,对该资源的调用都自动熔断(默认行为是抛出
DegradeException)
- 在ProviderController 类中添加doSentinel04方法,基于此方法演示慢调用过程下的限流
//AtomicLong 类支持线程安全的自增自减 *** 作 private AtomicLong atomicLong=new AtomicLong(1); @GetMapping("/sentinel04") public String doSentinel04() throws InterruptedException { //获取自增对象的值,然后再加1 long num=atomicLong.getAndIncrement(); //设置休眠,目的是为了演示慢调用(响应时间比较长) if(num%2==0){//模拟50%的慢调用比例 Thread.sleep(200); } return "sentinel 04 test"; }
- 服务启动以后,选择要降级的链路
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)