开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第二阶段:流控规则-流控模式】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/684/detail/11874
流控规则-流控模式
内容介绍:
一、配置流控模式
二、三种模式演示
一、配置流控模式
(1)点击编辑,选择阈值类型,单机阈值改为3
(2)打开高级选项
共有三种流控模式,分别是:
直接(默认):接口达到限流条件时,开启限流。
关联:关联的资源达到限流条件时,开启限流(适合做应用让步)
链路:当从某个接口过来的资源达到限流条件时,开启限流。
二、三种模式演示
1.直接流控模式
直接流控模式是最简单的模式,当指定的接口答到限流条件时开启限流,上面案例使用的就是直接流控模式。
2.关联流控模式
关联流控模式指的是当指定接口关联的接口达到限流条件时,开始对指定接口开启限流。
(1)更改线程属性。线程改为1,时间改为0.2秒,每秒会有五个请求,意味着QPS已经大于三。
(2)对 MESSAGE1 的关联资源,MESSAGE2 发出请求。看一下会有什么效果。
(3)流控模式调整为关联之后,关联资源改为/order/message2。
(4)刷新 message1 之后被限流,因为 QPS 大于3,就会被限流。
3.链路流控模式
设置两个 controller,分别为 message1 和 message2,有共同的资源 message,通过对支路进行条件设置,控制链路的流控。
(1)在controller中准备message1和message2
@RestController
@slf4j
Public class OrderController3(
@RequestMapping(“/order/message1”)
Public string message1(){
Return “message1”
@RequestMapping(“/order/message2”)
Public string message2(){
Resturn”message2”;
)
)
(2) 新建一个 order service message
(3)
package com.itheima.service.imp1
Import com.alibaba.csp.sentinel.annotation.sentinel resource;
Import crg.springframework.stereotype.service;
@service
Public class orderserviceimpl3
//定义资源 value指定资源名称
@sentinelresource(“message”)
Public string message=() {
Return”message”;
)
(3)从 controller 里边调用 message 方法
Public class ordercontroller3{
@autowired
Private orderserviceimpl3 orderserviceimpl3;
@requestmapping(“/order/message1”)
Public string message1(){
Orderserviceimpl3.message();
Return “message1”;
)
@requestmapping(“/order/message2”)
Public string message2() {
Orderserviceimpl3.message();
Return “message2”;
)
(4)启动 older application,分别启动 message1和 message2,都没有问题。
(5)针对 message1进行限流,刷新后发现并没有限流,检查设置无误。
(6)禁止收敛 URL 的入口 context
从1.6.3版本开始,Sentinel Web filter 默认收敛所有 URL 的入门 context,因此链路限流不生效。
1.7.0 版本开始(对应SCA的2.1.1.RELEASE),
官方在 CommonFilter 引入了 WEB_ CONTEXT_UNIFY 参数,用于控制是否收敛 context,将其配置为 false 即可根据不同的URL进行链路限流。
在pom文件中导入,调整。
配置文件中关闭 Sentinel 的 Common filter 实例化
Spring;
Cloud
Sentinel
Filter;
Enable;false
添加配置类,自己构建 Common filter 实例,让配置生效。
public class filterclasscontextconfig(
@bean
Public FilterRegistrationBean sentinelRegistration(){
Registration.setfilter(new commonfilter());
Registration.addurlpatterns(“/*”);
//入口资源关闭聚合Registration.addinitparameter(commonfilter.WEB_CONTEXT_UNIFY;VALUE”false”);
Registration.setname(“sentinelfilter”);
Registration.setorder(1);
Return registration
)
(7)重新启动 Order application,刷新 message1 和 message2,没有任何问题。
(8)点击簇点链路
(9)设置 message1流控规则
(10)刷新,message1链路已经出问题。
message2没有任何问题。将入口资源改成”message2”。
“message2”链路出现问题。Message1没有问题。