SpringCloud Alibaba使用Sentinel限流、降级
Sentinel介绍
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。
Sentinel核心分为两个部分:
- 核心库(Java 客户端):能够运行于所有 Java 运行时环境,同时对Dubbo /Spring Cloud 等框架也有较好的支持。
- 控制台(Dashboard):基于 Spring Boot 开发,打包后可以直接运行。
Sentinel Dashboard
Sentinel Dashboard下载地址:https://github.com/alibaba/Sentinel/releases
我这里下载的是: sentinel-dashboard-1.8.1.jar
以命令行方式打开,运行:
java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
通过浏览器进行访问:http://localhost:8180,默认的账号密码都是sentinel
集成Sentinel
新建module,名为alibaba-cloud-sentinel,作为服务调用者(Consumer),调用alibaba-cloud-order
1)引入依赖
<!--boot web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- nacos注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- dubbo RPC调用,注意是spring-cloud-starter-dubbo-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.spring</groupId>
<artifactId>spring-context-support</artifactId>
<version>1.0.11</version>
</dependency>
<!-- 公共依赖 -->
<dependency>
<groupId>com.harvey</groupId>
<artifactId>alibaba-dubbo-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2)bootstrap.yml
server:
port: 8844
spring:
application:
name: alibaba-cloud-sentinel
cloud:
nacos:
#服务注册
discovery:
enabled: true
#nacos地址
server-addr: http://localhost:8848
#当前应用是否注册到注册中心,默认是true
register-enabled: true
namespace: 2f7930c8-ccae-4577-bdcd-0cf874cf1297
#配置中心
config:
enabled: true
#nacos地址
server-addr: http://localhost:8848
#配合文件后缀
file-extension: yaml
# dubbo配置
dubbo:
application:
name: ${spring.application.name}
#扫描java包,多个包用逗号分割
scan:
base-packages: com.harvey.demo
#注册中心
registry:
#注册中心地址列表,同一集群内的多个地址用逗号分隔
address: nacos://127.0.0.1:8848?namespace=fab88f57-87a7-4e9b-a3a5-fcdee1605282
#是否向此注册中心订阅服务
subscribe: true
#注册中心会话超时时间(毫秒)
session: 6000
#服务提供者
provider:
#超时时间
timeout: 5000
#服务消费者
consumer:
#负载均衡
loadbalance: roundrobin #轮询
protocol:
#随机端口,默认是20880
port: -1
name: dubbo
3)启动类
@SpringBootApplication
public class SentinelApp {
public static void main(String[] args) {
SpringApplication.run(SentinelApp.class, args);
}
}
4)controller
@RequestMapping("/sentinel")
@RestController
public class SentinelController {
@DubboReference
private OrderDubboService orderDubboService;
@RequestMapping("/findAllOrders")
public Object findAllOrders() {
return orderDubboService.findAllOrder();
}
@RequestMapping("/getOrderInfo")
public Object getOrderInfo(@RequestParam("userId") Long userId) {
return orderDubboService.findOrderByUserId(userId);
}
@RequestMapping("/getInfo")
public Object getInfo() {
return orderDubboService.getInfo();
}
}
启动项目,浏览器访问。
Sentinel限流
我们系统中的数据库连接池,线程池,nginx的瞬时并发,MQ消息等在使用时都会跟定一个限定的值,这本身就是一种限流的设计。限流的目的防止恶意请求流量、恶意攻击,或者防止流量超过系统峰值。
1、在alibaba-cloud-sentinel中添加sentinel依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、在bootstrap.yml中配置sentinel
spring:
cloud:
#限流框架配置
sentinel:
transport:
port: 8719 #跟sentinel控制台交流的端口,随意指定一个未使用的端口即可
dashboard: http://localhost:8180 #指定sentinel控制台地址
3、启动服务提供者,服务消费者,然后在浏览器访问消费者url:http://localhost:8844/sentinel/getInfo
可以刷新多请求几次。
4、刷新sentinel 控制台
Sentinel的控制台其实就是一个SpringBoot编写的程序,我们需要将我们的服务注册到控制台上,即在微服务中指定控制台的地址,并且还要在消费端开启一个与sentinel控制台传递数据端的端口,控制台可以通过此端口调用微服务中的监控程序来获取各种信息。
5、我们设置一下指定接口的流控(流量控制),QPS(每秒请求次数)单机阈值为1,代表每秒请求不能超出1次,要不然就做限流处理,处理方式直接调用失败。
1)选择要限流的链路,如图所示:
2)设置限流策略,如图所示:
新增后,在【流控规则】一栏可以看到我们刚才添加的规则。
3)反复刷新访问消费端端服务,检测是否有限流信息输出,如图所示:
Sentinel流控规则分析
阈值类型分析
-
QPS(Queries Per Second):当调用相关url对应的资源时,QPS达到单机阈值时,就会限流。
-
线程数:当调用相关url对应的资源时,线程数达到单机阈值时,就会限流。
设置限流模式
Sentinel的流控模式代表的流控的方式,默认【直接】,还有关联,链路。
1、直接模式
Sentinel默认的流控处理就是【直接 -> 快速失败】。
2、关联模式
当关联的资源达到阈值,就限流自己。例如设置了关联资源为/url2时,假如关联资源/url2的qps阀值超过1时,就限流/url1接口(是不是感觉很霸道,关联资源达到阀值,是本资源接口被限流了)。这种关联模式有什么应用场景呢?我们举个例子,订单服务中会有2个重要的接口,一个是读取订单信息接口,一个是写入订单信息接口。在高并发业务场景中,两个接口都会占用资源,如果读取接口访问过大,就会影响写入接口的性能。业务中如果我们希望写入订单比较重要,要优先考虑写入订单接口。那就可以利用关联模式;在关联资源上面设置写入接口,资源名设置读取接口就行了;这样就起到了优先写入,一旦写入请求多,就限制读的请求。例如:
3、链路模式
链路模式只记录指定链路入口的流量。也就是当多个服务对指定资源调用时,假如流量超出了指定阈值,则进行限流。被调用的方法用@SentinelResource进行注解,然后分别用不同业务方法对此业务进行调用,假如A业务设置了链路模式的限流,在B业务中是不受影响的。例如现在设计一个业务对象,代码如下:
@Service
public class ConsumerService{
@SentinelResource("doGetResource")
public String doGetResource(){
return "doGetResource";
}
}
我们在/sentinel/getInfo对应的方法中对ConsumerService中的doGetResource方法进行调用:
@Autowired
private ConsumerService consumerService;
@RequestMapping("/getInfo")
public Object getInfo() {
consumerService.doGetResource();
return orderDubboService.getInfo();
}
重启项目,重新请求/sentinel/getInfo接口,在sentinel控制台【簇点链路】就可以看到doGetResource方法了。
路由规则配置如下:
说明,流控模式为链路模式时,假如是sentinel 1.7.2以后版本,Sentinel Web过滤器默认会聚合所有URL的入口为sentinel_spring_web_context,因此单独对指定链路限流会不生效,需要在bootstrap.yml添加如下语句来关闭URL PATH聚合,例如:
spring:
sentinel:
web-context-unify: false
修改配置以后,重新启动项目,再次访问/sentinel/getInfo接口,然后重新设置链路流控规则
我们频繁对链路/sentinel/getInfo进行访问(注意其他流控规则的干扰),检测是否会出现500异常。
设计限流效果
1、快速失败
流量达到指定阀值,直接返回报异常。
2、WarmUp (预热)
WarmUp也叫预热,根据codeFactor(默认3)的值,(阀值/codeFactor)为初始阈值,经过预热时长,才到达设置的QPS的阈值,假如单机阈值为100,系统初始化的阈为 100/3 ,即阈值为33,然后过了10秒,阈值才恢复到100。这个预热的应用场景,如:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是为了保护系统,可慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值。
3、排队等待
从字面上面就能够猜到,匀速排队,让请求以均匀的速度通过,阈值类型必须设成QPS,否则无效。比如有时候系统在某一个时刻会出现大流量,之后流量就恢复稳定,可以采用这种排队模式,大流量来时可以让流量请求先排队,等恢复了在慢慢进行处理。
Sentinel降级
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。
Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。
改造/sentinel/getInfo接口:
//AtomicLong 类支持线程安全的自增自减操作
private AtomicLong atomicLong = new AtomicLong(1);
@RequestMapping("/getInfo")
public Object getInfo() throws InterruptedException {
//获取自增对象的值,然后再加1
long num = atomicLong.getAndIncrement();
if (num % 2 == 0) {//模拟50%的慢调用比例
Thread.sleep(200);
}
return orderDubboService.getInfo();
}
服务启动后,选择要降级的链路,新增降级规则
这里表示熔断策略为慢调用比例,表示链路请求数超过3时,假如平均响应时间假如超过200毫秒的有50%,则对请求进行熔断,熔断时长为10秒钟,10秒以后恢复正常。
对指定链路进行刷新,多次访问测试,假如出现了降级熔断,会出现如下结果:
我们也可以进行断点调试,在DefaultBlockExceptionHandler中的handle方法内部加断点,分析异常类型,假如异常类型为DegradeException则为降级熔断。
Sentinel 异常处理
系统提供了默认的异常处理机制,假如默认处理机制不满足我们需求,我们可以自己进行定义。定义方式上可以直接或间接实现BlockExceptionHandler接口,并将对象交给spring管理。
@Component
public class ServiceBlockExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
//response.setStatus(601);
//设置响应数据的编码
response.setCharacterEncoding("utf-8");
//告诉客户端要响应的数据类型以及客户端以什么编码呈现数据
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
Map<String, Object> map = new HashMap<>();
if (e instanceof DegradeException) {//降级、熔断
map.put("status", 601);
map.put("message", "服务被熔断了!");
} else if (e instanceof FlowException) {
map.put("status", 602);
map.put("message", "服务被限流了!");
} else {
map.put("status", 603);
map.put("message", "Blocked by Sentinel (flow limiting)");
}
//将map对象转换为json格式字符串
String jsonStr = new ObjectMapper().writeValueAsString(map);
pw.println(jsonStr);
pw.flush();
}
}
Sentinel降级策略分析
Sentinel熔断降级支持慢调用比例、异常比例、异常数三种策略。
慢调比例
慢调用指耗时大于阈值RT(Response Time)的请求称为慢调用,阈值RT由用户设置。其属性具体含义说明如下:
慢调用逻辑中的状态分析如下:
- 熔断(OPEN):请求数大于最小请求数并且慢调用的比率大于比例阈值则发生熔断,熔断时长为用户自定义设置。
- 探测(HALFOPEN):当熔断过了定义的熔断时长,状态由熔断(OPEN)变为探测(HALFOPEN)。
- 关闭(CLOSED):如果接下来的一个请求小于最大RT,说明慢调用已经恢复,结束熔断,状态由探测(HALF_OPEN)变更为关闭(CLOSED),如果接下来的一个请求大于最大RT,说明慢调用未恢复,继续熔断,熔断时长保持一致。
注意:Sentinel默认统计的RT上限是4900ms,超出此阈值的都会算作4900ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx来配置
异常比例
当资源的每秒请求数大于等于最小请求数,并且异常总数占通过量的比例超过比例阈值时,资源进入降级状态。其属性说明如下:
异常比例中的状态分析如下:
- 熔断(OPEN):当请求数大于最小请求并且异常比例大于设置的阈值时触发熔断,熔断时长由用户设置。
- 探测(HALFOPEN):当超过熔断时长时,由熔断(OPEN)转为探测(HALFOPEN)
- 关闭(CLOSED):如果接下来的一个请求未发生错误,说明应用恢复,结束熔断,状态由探测(HALF_OPEN)变更为关闭(CLOSED)。如果接下来的一个请求继续发生错误,说明应用未恢复,继续熔断,熔断时长保持一致。
异常数量
当资源近1分钟的异常数目超过阈值(异常数)之后会进行服务降级。注意,由于统计时间窗口是分钟级别的,若熔断时长小于60s,则结束熔断状态后仍可能再次进入熔断状态。其属性说明如下:
基于异常数的状态分析如下:
- 熔断(OPEN):当请求数大于最小请求并且异常数量大于设置的阈值时触发熔断,熔断时长由用户设置。
- 探测(HALFOPEN):当超过熔断时长时,由熔断(OPEN)转为探测(HALFOPEN)
- 关闭(CLOSED):如果接下来的一个请求未发生错误,说明应用恢复,结束熔断,状态由探测(HALF_OPEN)变更为关闭(CLOSED)如果接下来的一个请求继续发生错误,说明应用未恢复,继续熔断,熔断时长保持一致。
Sentinel热点规则分析
何为热点?热点即经常访问的数据。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制。
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制。
热点参数限流会统计传入参数中的热点数据,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。其中,Sentinel会利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。
1、定义热点业务代码,如图所示:
@RequestMapping("/getOrderInfo")
@SentinelResource("res")
public Object getOrderInfo(@RequestParam("userId") Long userId) {
return orderDubboService.findOrderByUserId(userId);
}
2、服务启动后(要在簇点链路中展示,都得请求下),选择要限流的热点链路,如图所示:
3、设置要限流的热点,如图所示:
热点规则的限流模式只有QPS模式(这才叫热点)。参数索引为@SentinelResource注解的方法参数下标,0代表第一个参数,1代表第二个参数。单机阈值以及统计窗口时长表示在此窗口时间超过阈值就限流。
4、多次访问热点参数方法,前端会出现如下界面,如图所示:
然后,在后台出现如下异常表示限流成功。
com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException: 10001
其中,热点参数其实说白了就是特殊的流控,流控设置是针对整个请求的;但是热点参数他可以设置到具体哪个参数,甚至参数针对的值,这样更灵活的进行流控管理。
一般应用在某些特殊资源的特殊处理,如:某些商品流量大,其他商品流量很正常,就可以利用热点参数限流的方案。
特定参数设计
配置参数例外项,如图所示:
这里表示参数值为10002时,阈值为100,其它参数值阈值为1,例如当我们访问http://ip:port/sentinel/getOrderInfo?userId=10002时的限流阈值为100。
Sentinel系统规则
系统在生产环境运行过程中,我们经常需要监控服务器的状态,看服务器CPU、内存、IO等的使用率;主要目的就是保证服务器正常的运行,不能被某些应用搞崩溃了;而且在保证稳定的前提下,保持系统的最大吞吐量。
长期以来,系统自适应保护的思路是根据硬指标,即系统的负载 (load1) 来做系统过载保护。当系统负载高于某个阈值,就禁止或者减少流量的进入;当 load 开始好转,则恢复流量的进入。
Sentinel的系统保护规则是从应用级别的入口流量进行控制,从单台机器的总体 Load、RT、入口 QPS 、线程数和CPU使用率五个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。如图所示:
- Load(仅对 Linux/Unix-like 机器生效):当系统 load1 超过阈值,且系统当前的并发线程数超过系统容量时才会触发系统保护。系统容量由系统的 maxQps * minRt 计算得出。设定参考值一般是 CPU cores * 2.5。
- CPU使用率:当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0)。
- RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
- 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
- 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。
系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如 Web 服务。
Sentinel授权规则
很多时候,我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的黑白名单控制的功能。黑白名单根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。例如微信中的黑名单。
sentinel可以基于黑白名单方式进行授权规则设计,如图所示:
黑白名单规则(AuthorityRule)非常简单,主要有以下配置项:
- 资源名:即限流规则的作用对象
- 流控应用:对应的黑名单/白名单中设置的规则值,多个值用逗号隔开
- 授权类型:白名单,黑名单(不允许访问)
案例实现
定义请求解析器,用于对请求进行解析,并返回解析结果,sentinel底层 在拦截到用户请求以后,会对请求数据基于此对象进行解析,判定是否符合黑白名单规则
1、定义RequestOriginParser接口的实现类,基于业务在接口方法中解析请求数据并返回
@Component
public class DefaultRequestOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest request) {
String origin = request.getParameter("userId");
return origin;
}
}
2、执行资源访问,检测授权规则应用,当我们配置的流控应用值为10002时,假如规则为黑名单,则基于http://ip:port/path?userId=10002的请求不可以通过,会出现如下结果:
Sentinel配置信息持久化到Nacos
如果想将sentinel的配置信息持久化到nacos中,还需要在使用sentinel的应用中引入以下依赖:
<!-- alibaba sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-datasource</artifactId>
</dependency>
1、配置文件
spring:
cloud:
sentinel:
transport:
port: 8719 #跟sentinel控制台交流的端口,随意指定一个未使用的端口即可
dashboard: http://localhost:8180 #指定sentinel控制台地址
web-context-unify: false
#持久化配置
datasource:
ds1: #数据源1
nacos: # 有多种持久化方式,我们这里选择nacos com.alibaba.cloud.sentinel.datasource.config.NacosDataSourceProperties
server-addr: http://localhost:8848
dataId: cloud-sentinel
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow # 流控规则。规则类型及每种规则持久化时需要配置哪些参数 参考 com.alibaba.cloud.sentinel.datasource.RuleType
2、在nacos控制台添加一下文件(按上面的配置就是cloud-sentinel)
[
{
"resource":"/sentinel/getOrderInfo",
"limitApp":"default",
"grade":1,
"count":1,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}
]
流控规则(flow)参数说明
- resource:资源名称
- limitApp:来源应用
- grade:阈值类型,0-线程数、1-QPS
- count: 单机阈值
- strategy: 流控模式,0-直连、1-关联、2-链路
- controlBehavior:流控效果,0-快速失败、1-Warm Up、2-表示排队等待
- clusterMode:是否集群,true集群、false不集群
更多的规则类型和配置参数参考:com.alibaba.cloud.sentinel.datasource.RuleType
Sentinel认知
Sentinel流控规则
- Sentinel是什么?(阿里推出一个流量控制平台,防卫兵)
- 类似Sentinel的产品你知道有什么?(hystrix-一代微服务产品)
- 你了解哪些限流算法?(计数器、令牌桶、漏斗算法,滑动窗口算法,…)
- Sentinel 默认的限流算法是什么?(滑动窗口算法)
- 你了解sentinel中的阈值应用类型吗?(两种-QPS,线程数)
- Sentinel 限流规则中默认有哪些限流模式?(直连,关联,链路)
- Sentinel的限流效果有哪些?(快速失败,预热,排队)
- Sentinel 为什么可以对我们的业务进行限流,原理是什么?
我们在访问web应用时,在web应用内部会有一个拦截器,这个拦截器会对请求的url进行拦截,拦截到请求以后,读取sentinel 控制台的流控规则,基于流控规则对流量进行限流操作。
Sentinel降级
- 何为降级熔断?(让外部应用停止对服务的访问,生活中跳闸,路障设置-此路不通)
- 为什么要进行熔断呢?(平均响应速度越来越慢或经常出现异常,这样可能会导致调用链堆积,最终系统崩溃)
- Sentinel中限流,降级的异常父类是谁?(BlockException)
- Sentinel 出现降级熔断时,系统底层抛出的异常是谁?(DegradeException)
- Sentinel中异常处理接口是谁?(BlockExceptionHandler)
- Sentinel中异常处理接口下默认的实现类为? (DefaultBlockExceptionHandler)
- 假如Sentinel中默认的异常处理规则不满足我们的需求怎么办?(自己定义)
- 我们如何自己定义Sentinel中异常处理呢?(直接或间接实现BlockExceptionHandler )
- Sentinel 降级熔断策略有哪些?(慢调用,异常比例,异常数)
- Sentinel 熔断处理逻辑中的有哪些状态?(Open,HalfOpen,Closed)
- Sentinel 对服务调用进行熔断以后处于什么状态?(熔断打开状态-Open)
- Sentinel 设置的熔断时长到期以后,Sentinel的熔断会处于什么状态?(探测-HalfOpen,假如再次访问时依旧响应时间比较长或依旧有异常,则继续熔断)
- Sentinel 中的熔断逻辑恢复正常调用以后,会出现什么状态?(熔断关闭-closed)
Sentinel热点规则
- 如何理解热点数据?(访问频度比较高的数据,某些商品、谋篇文章、某个视频)
- 热点数据的限流规则是怎样的?(主要是针对参数进行限流设计)
- 热点数据中的特殊参数如何理解?(热点限流中的某个参数值的阈值设计)
- 对于热点数据的访问出现限流以后底层异常是什么?(ParamFlowException)
Sentinel系统规则
- 如何理解sentinel中的系统规则?(是对所有链路的控制规则,是一种系统保护策略)
- Sentinel的常用系统规则有哪些?(RT,QPS,CPU,线程,Load-linux,unix)
- Sentinel系统保护规则被触发以后底层会抛出什么异常?(SystemBlockException)
Sentinel授权规则
- 如何理解Sentinel中的授权规则?(对指定资源的访问给出的一种简易的授权策略)
- Sentinel的授权规则是如何设计的?(白名单和黑名单)
- 如何理解Sentinel中的白名单?(允许访问的资源名单)
- 如何理解Sentinel中的黑名单?(不允许访问的资源名单)、
- Sentinel如何识别白名单和黑名单?(在拦截器中通过调用RequestOriginParser对象的方法检测具体的规则)
- 授权规则中RequestOriginParser类的做用是什么?(对流控应用值进行解析,检查服务访问时传入的值是否与RequestOriginParser的parseOrigin方法返回值是否相同。)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战