1 流控規(guī)則
流量控制,其原理是監(jiān)控應用流量的QPS(每秒查詢率) 或并發(fā)線程數(shù)等指標,當達到指定的閾值時
對流量進行控制,以避免被瞬時的流量高峰沖垮,從而保障應用的高可用性。
- 第1步: 點擊簇點鏈路,我們就可以看到訪問過的接口地址,然后點擊對應的流控按鈕,進入流控規(guī)則配置頁面。新增流控規(guī)則界面如下:
?資源名:唯一名稱,默認是請求路徑,可自定義
針對來源:指定對哪個微服務進行限流,默認指default,意思是不區(qū)分來源,全部限制
閾值類型/單機閾值:
QPS(每秒請求數(shù)量): 當調(diào)用該接口的QPS達到閾值的時候,進行限流
線程數(shù):當調(diào)用該接口的線程數(shù)達到閾值的時候,進行限流
是否集群:暫不需要集群
接下來我們以QPS為例來研究限流規(guī)則的配置。
1.1 簡單配置
我們先做一個簡單配置,設置閾值類型為QPS,單機閾值為3。即每秒請求量大于3的時候開始限流。
接下來,在流控規(guī)則頁面就可以看到這個配置。
?然后快速訪問 /order/message1 接口,觀察效果。此時發(fā)現(xiàn),當QPS > 3的時候,服務就不能正常響應,而是返回Blocked by Sentinel (flow limiting)結(jié)果。
?1.2 配置流控模式
點擊上面設置流控規(guī)則的編輯按鈕,然后在編輯頁面點擊高級選項,會看到有流控模式一欄。
?sentinel共有三種流控模式,分別是:
- 直接(默認):接口達到限流條件時,開啟限流
- 關(guān)聯(lián):當關(guān)聯(lián)的資源達到限流條件時,開啟限流 [適合做應用讓步]
- 鏈路:當從某個接口過來的資源達到限流條件時,開啟限流
下面呢分別演示三種模式:
- 直接流控模式
直接流控模式是最簡單的模式,當指定的接口達到限流條件時開啟限流。上面案例使用的就是直接流控模式。
- 關(guān)聯(lián)流控模式
關(guān)聯(lián)流控模式指的是,當指定接口關(guān)聯(lián)的接口達到限流條件時,開啟對指定接口開啟限流。
第1步:配置限流規(guī)則, 將流控模式設置為關(guān)聯(lián),關(guān)聯(lián)資源設置為的 /order/message2。
?第3步:通過postman軟件向/order/message2連續(xù)發(fā)送請求,注意QPS一定要大于3
?第4步:訪問/order/message1,會發(fā)現(xiàn)已經(jīng)被限流
- ?鏈路流控模式
鏈路流控模式指的是,當從某個接口過來的資源達到限流條件時,開啟限流。它的功能有點類似于針對來源配置項,區(qū)別在于:針對來源是針對上級微服務,而鏈路流控是針對上級接口,也就是說它的粒度更細。
第1步: 編寫一個service,在里面添加一個方法message
@Service
public class OrderServiceImpl3 {
??@SentinelResource("message")
??public void message() {
????System.out.println("message");
?}
}
第2步: 在Controller中聲明兩個方法,分別調(diào)用service中的方法m
@RestController
@Slf4j
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";
?}
}
第3步: 禁止收斂URL的入口 context
?(1) 暫時將SpringCloud Alibaba的版本調(diào)整為2.1.1.RELEASE
<spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version>
(2) 配置文件中關(guān)閉sentinel的CommonFilter實例化
spring:
cloud:
sentinel:
filter:
enabled: false
(3) 添加一個配置類,自己構(gòu)建CommonFilter實例
package com.itheima.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 sentinelFilterRegistration() {
????FilterRegistrationBean registration = new FilterRegistrationBean();
????registration.setFilter(new CommonFilter());
????registration.addUrlPatterns("/*");
????// 入口資源關(guān)閉聚合
????registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, "false");
????registration.setName("sentinelFilter");
????registration.setOrder(1);
????return registration;
?}
}
第4步: 控制臺配置限流規(guī)則
文章來源:http://www.zghlxwxcb.cn/news/detail-687760.html
?第5步: 分別通過 /order/message1 和 /order/message2 訪問, 發(fā)現(xiàn)2沒問題, 1的被限流了文章來源地址http://www.zghlxwxcb.cn/news/detail-687760.html
1.3 配置流控效果
- 快速失?。J): 直接失敗,拋出異常,不做任何額外的處理,是最簡單的效果
- Warm Up:它從開始閾值到最大QPS閾值會有一個緩沖階段,一開始的閾值是最大QPS閾值的1/3,然后慢慢增長,直到最大閾值,適用于將突然增大的流量轉(zhuǎn)換為緩步增長的場景。
- 排隊等待:讓請求以均勻的速度通過,單機閾值為每秒通過數(shù)量,其余的排隊等待; 它還會讓設置一個超時時間,當請求超過超時間時間還未處理,則會被丟棄。
?
到了這里,關(guān)于Spring Cloud Alibaba-Sentinel規(guī)則的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!