一、Sentinel规则
1 、流控规则
流控规则就是监控应用流量QPS(每秒查询率)或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被
瞬时的流量高峰冲垮,从而保证应用的高可用性
2、使用步骤
点击簇点链路,看到访问过的接口地址,点击对应的流控按钮,进入流控规则配置页面。
2.1 名称解释
1、资源名:唯一名称,默认是请求路径,可以自定义,一般请求下保存默认即可
2、针对来源:指定对那个微服务进行限流,默认default,不区分来源,全部限制。
3、阈值类型/单机阈值
* QPS(每秒请求数量):调用接口的QPS达到阈值时,进行限流。
* 线程数:当调用接口的线程数达到阈值的时候,进行限流。
4、是否集群:暂不需要集群
3 流控模式
* 直接(默认):接口达到限流条件时,开启限流
* 关联:当关联的资源达到限流条件时,开启限流[适合应用让步]
* 链路:当从某个接口过来的资源达到限流条件时,开启限流
3.1 直接流控模式案例–上述默认就是直接流控
3.2 关联流控
3.2.1 准备工作 编写OrderService类,提供show方法
package com.chenchen.service.impl;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;
/**
* Sentinel流控规则业务测试
*/
@Service
public class OrderServiceImpl3 {
// value 指定资源名称
@SentinelResource(value = "show")
public String show() {
return "show";
}
}
3.2.2 修改OrderController逻辑
package com.chenchen.controller;
import com.chenchen.service.impl.OrderServiceImpl3;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Sentinel服务容错测试
*/
@RestController
@Slf4j
@RequestMapping("/sentinel")
public class OrderController3 {
@Autowired
private OrderServiceImpl3 orderServiceImpl3;
@RequestMapping("/show")
public String show() {
orderServiceImpl3.show();
log.info("调用orderService3流控方法:{}","show");
return "show:" + new SimpleDateFormat("yyy-MM-dd HH:mm:ss").format(new Date());
}
@RequestMapping("/showMessage")
public String showMessage() {
orderServiceImpl3.show();
log.info("调用orderService3流控方法:{}","show");
return "showMessage:" + new SimpleDateFormat("yyy-MM-dd HH:mm:ss").format(new Date());
}
}
3.2.3 配置限流规则
3.2.4 Jemter测试访问接口showMessage
主要Jmeter一直在访问showMessage接口,此时我们再去访问show接口,发现已经被限流。(因为showMesage一直占用着orderService中的方法,当show()再去调用时发现已经调不通)
3.2 链路流控
当从某个接口过来的资源达到限流条件时,开启限流。类似于针对来源配置项。
区别在于
针对来源针对微服务级别,链路流控针对上级接口(被调用方),颗粒度更细
模拟链路流控Demo
3.2.1、继续在OrderService3中添加方法
package com.chenchen.service.impl;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;
/**
* Sentinel流控规则业务测试
*/
@Service
public class OrderServiceImpl3 {
// value 指定资源名称 关联流控
@SentinelResource(value = "show")
public String show() {
return "show";
}
//限流策略--链路流控
@SentinelResource(value = "message")
public String message() {
return "message";
}
}
3.2.2 修改OrderController,分别调用message()方法
/**
* 链路流控
* @return
*/
@RequestMapping("/message")
public String message() {
orderServiceImpl3.message();
log.info("调用orderService3链路流控方法:{}", "message");
return "show:" + new SimpleDateFormat("yyy-MM-dd HH:mm:ss").format(new Date());
}
/**
* 链路流控
*
* @return
*/
@RequestMapping("/message2")
public String message2() {
orderServiceImpl3.message();
log.info("调用orderService3链路流控方法:{}", "message");
return "showMessage:" + new SimpleDateFormat("yyy-MM-dd HH:mm:ss").format(new Date());
}
3.2.3 禁止收敛 URL的入口Context
修改父工程依赖版本
<!-- <spring-cloud.alibaba.version>2.1.0.RELEASE</spring-cloud.alibaba.version>-->
<spring-cloud.alibaba.version>2.1.1.RELEASE</spring-cloud.alibaba.version>
3.2.4 配置文件中关闭sentinel的CommonFilter实例化
sentinel:
transport:
port: 9999
dashboard: localhost:8080 #指定控制台服务的地址
filter:
enabled: false
3.2.5 添加配置,构建CommonFilter实例化
package com.chenchen.config;
import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterContextConfig {
@Bean
public FilterRegistrationBean sentinelRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new CommonFilter());
filterRegistrationBean.addUrlPatterns("/*");
//入口资源关闭 聚合
filterRegistrationBean.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY,"false");
filterRegistrationBean.setOrder(1);
return filterRegistrationBean;
}
}
3.2.6 控制台配置流控规则
3.2.7 浏览器访问http://localhost:8092/sentinel/message2正常,
访问http://localhost:8092/sentinel/message发现被限流。
4 、流控效果
4.1 快速失败
直接失败,抛出异常,不做任何额外处理,默认就是这种方式
4.2 Warm Up
从开始阈值到最大QPS会有一个缓存阶段,初始时阈值时最大QPS的1/3,然后慢慢增长,
直到最大阈值,适用于将突然增大的流量转换为缓步增长的场景
4.3 排队等待
让请求以均匀的速度通过,单机阈值为每秒通过数量,其余的排队等待,还会设置一个
超时时间,当请求超过超时时间还未处理,则会被丢弃。