目錄标題
-
- 一、安裝Sentinel
- 二、Sentinel入門案例
-
- 1、導入pom
- 2、改yml
- 3、主啟動類
- 4、測試類
- 5、設定斷路規則(核心)
- 三、配置斷路規則
-
- 1、斷路規則配置分類
- 2、規則的種類
-
- 2.1、流量控制規則 (FlowRule)
- 2.2、熔斷降級規則 (DegradeRule)
- 2.3、系統保護規則 (SystemRule)
- 2.4、Sentinel熱點key(`常用`)
- 四、注解@SentinelResource
-
- 1、value
- 2、entryType:
- 3、blockHandler / blockHandlerClass: (違反斷路規則觸發)
- 4、fallback:(請求異常觸發)
- 5、defaultFallback(since 1.6.0):
- 6、exceptionsToIgnore(since 1.6.0):
- 五、持久化Sentinel斷路規則
-
- 3、到nacos配置一個斷路規則
- 4、通過注解綁定請求
- 5、如何編寫配置
- 六、Sentinel整合負載均衡
-
- 1、導入pom
- 2、改yml
- 3、主啟動類
- 4、業務層
- 5、控制層
- 6、測試
如果不具備nacos的知識,推薦先看:spring cloud Alibaba——01 Nacos
一、安裝Sentinel
- 下載下傳位址:https://github.com/alibaba/Sentinel/releases
- 終端運作Sentinel
# 在jar包所在目錄,cmd進入終端
java -jar sentinel-dashboard-1.8.2.jar
-
通路:http://localhost:8080/
預設登入賬号、密碼:sentinel、sentinel
- 成功頁面
注意:Sentinel使用的是懶加載。當被監控的請求,第一次通路後才會被Sentinel記錄下來。
二、Sentinel入門案例
官方文檔:https://sentinelguard.io/zh-cn/docs/flow-control.html
Sentinel的使用可以分為三步:
- 定義資源
- 定義規則
- 檢驗規則是否生效
我們說的資源,可以是任何東西,服務,服務裡的方法,甚至是一段代碼。使用 Sentinel 來進行資源保護,主要分為幾個步驟:
先把可能需要保護的資源定義好,之後再配置規則。也可以了解為,隻要有了資源,我們就可以在任何時候靈活地定義各種流量控制規則。在編碼的時候,隻需要考慮這個代碼是否需要保護,如果需要保護,就将之定義為一個資源。
1、導入pom
注意:本文的所有pom依賴的版本控制,都是基于父項目的。通過父項目,統一管理版本,避免依賴沖突。
父項目pom依賴:
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
子項目依賴:
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web元件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel-datasource-nacos 因為Sentinel的斷路規則配置是一次性的,
Sentinel server重新開機後配置就會丢失,所有需要持久化用到nacos 的配置中心-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel,這個配置可能會導入失敗,可以更改版本号試試。注意使用2.1.x -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
</dependencies>
2、改yml
server.port=8001
spring.application.name=-sentinel-service-provider
# 指定注冊中心
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 指定sentinel監控中心
spring.cloud.sentinel.transport.dashboard=localhost:8080
3、主啟動類
/**
* @author 15594
*/
@SpringBootApplication
@EnableDiscoveryClient
public class SentinelMain8001 {
public static void main(String[] args) {
SpringApplication.run(SentinelMain8001.class,args);
}
}
4、測試類
/**
* Sentinel實作斷路(限流、熔斷、降級等)
* @author 15594
*/
@RestController
public class SentinelController {
@GetMapping("/testA")
public String testA()
{
return "------testA";
}
@GetMapping("/testB")
public String testB()
{
return "------testB";
}
}
5、設定斷路規則(核心)
這個一步隻需要到Sentinel server 使用者界面設定即可
比如:設定一個限流規則:
限流規則添加成功
再次通路:http://localhost:8001//testA
連續重新整理
當每秒請求超過1次時就會觸發服務降級。
三、配置斷路規則
上面的入門案例我們也就配置過流量控制了。我們如何配置其他的斷路規則呢?
sentinel為我們提供了以下的斷路配置規則:
1、斷路規則配置分類
其實sentinel斷路規則按照
配置方式
可以配置兩種。
- 一種是
,在sentinel提供的使用者界面就行配置。(入門案例中的配置方式
推薦使用
)
這種方式會随着服務(這個服務是受監控的服務)的關閉而丢失配置資訊。是以需要将這些
後面會講如何實作持久化。規則配置持久化
- 一種是通過代碼配置。(
不推薦
)
這種方式是可以實作持久化的,但是會增加代碼的耦合度,并且實作比較麻煩。
比如:
/**
* 定義資源
* */
@GetMapping("/testB")
public String testB() {
// 配置規則.
initFlowRules();
while (true) {
// 1.5.0 版本開始可以直接利用 try-with-resources 特性
Entry entry =null;
try {
entry = SphU.entry("HelloWorld");
// 被保護的邏輯
System.out.println("hello world");
return "------testB";
} catch (BlockException ex) {
// 處理被流控的邏輯
System.out.println("流量控制生效");
return "流量控制生效";
} finally {
if (entry != null) {
entry.exit();
}
}
}
}
/**
* 定義規則
* */
private static void initFlowRules(){
List<FlowRule> rules = new ArrayList<FlowRule>();
FlowRule rule = new FlowRule();
rule.setResource("HelloWorld");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// Set limit QPS to 20.
rule.setCount(1);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
2、規則的種類
Sentinel 的所有規則都可以在記憶體态中動态地查詢及修改,修改之後立即生效。同時 Sentinel 也提供相關 API,供您來定制自己的規則政策。
Sentinel 支援以下幾種規則:流量控制規則、熔斷降級規則、系統保護規則、來源通路控制規則 和 熱點參數規則。
上面已經說過,規則的配置方式有兩種,我們使用Sentinel 圖形化界面進行配置 。
注意:官網上已經有這些規則的概念的詳細介紹,我們結合Sentinel 使用者界面上面的配置針對這些概念進行講解。
2.1、流量控制規則 (FlowRule)
下面我們為testA添加一個流控規則:
-
資源名:唯一名稱,有兩種形式的值。方式一:請求路徑的格式(資源名字前面有斜杠/),比如:/testA 這樣就能将這個規則綁定給 /testA 這個請求。方式二:自己起一個名字資源,但是要唯一,然後通過注解@SentinelResource(value = “testB”)綁定給一個請求路徑。
方式一:
如果資源名/testB,那麼這個流控規則就會尋找一個請求路徑為 /testB ,将規則綁定給/testB
@GetMapping("/testB") //根據請求路徑,綁定流控規則 public String testB() { return "------testB"; }
方式二:
如果資源名123,那麼這個流控規則就會尋找一個通過注解标注為@SentinelResource(value = “123”)的請求,将規則綁定給這個請求。
@SentinelResource(value = "123") @GetMapping("/testC") public String testC() { // initFlowRulesTestC(); return "------testC"; }
- 針對來源:Sentinel可以針對調用者進行限流,填寫微服務名,預設default(不區分來源),
。可以當作将規則分類
- 門檻值類型/單機門檻值:zhiyuan
- QPS(每秒鐘的請求數量)︰當調用該API的QPS達到門檻值的時候,進行限流。(
)選擇QPS後,單機門檻值的值就表示,每秒請求的最大次數
- 線程數:當調用該API的線程數達到門檻值的時候,進行限流。(
)選擇線程數後,單機門檻值的值就表示,同一時間同時通路的線程數為多少個,也就是支援多少個使用者同時通路這個請求
- QPS(每秒鐘的請求數量)︰當調用該API的QPS達到門檻值的時候,進行限流。(
- 是否叢集:不需要叢集。
- 單機均攤 : 以單機為機關,單機請求數達到門檻值後,叢集限流
- 總體門檻值 :以叢集為機關,叢集請求數達到門檻值後,叢集限流
- 流控模式:
- 直接:請求達到限流條件時,直接限流。
- 關聯:當關聯的資源B達到門檻值時,就限流自己A。
舉例 :使用者 請求 A 調用(消費)B 。當B限流時(服務不可用),那麼A也會限流自己。
- 鍊路:隻記錄指定鍊路上的流量(指定資源從入口資源進來的流量,如果達到門檻值,就進行限流)【API級别的針對來源】。
當 入口資源A限流時限流自己舉例 :A->B->C
- 流控效果:
- 快速失敗:直接失敗,抛異常。
- Warm up:根據Code Factor(冷加載因子,預設3)的值,從門檻值/codeFactor,經過預熱時長,才達到設定的QPS門檻值。
- 排隊等待:勻速排隊,讓請求以勻速的速度通過,門檻值類型必須設定為QPS,否則無效。
2.2、熔斷降級規則 (DegradeRule)
2.3、系統保護規則 (SystemRule)
2.4、Sentinel熱點key( 常用
)
常用
注意:熱點規則(比較常用),
可以了解為給請求的進一步定制斷路規則
。
舉例:
@SentinelResource(value = "testA",blockHandler = "deal_testA")
@GetMapping("/testA/{vip}/{name}")
public String testA(@PathVariable("vip") String vip,@PathVariable("name") String name) {
return "------testA";
}
public String deal_testA(String vip, String name,BlockException exception) {
return "觸發限流";
}
- 通路攜帶參數vip的請求(出去vip=1的例外項),每秒隻能請求成功一次。如:http://localhost:8001//testA/0/lihua
- 通路攜帶參數vip=1的請求,每秒能請求成功10次。如:http://localhost:8001//testA/1/lihua
四、注解@SentinelResource
注意:這個注解标注的方法最好是pubic類型
@SentinelResource這個注解有以下屬性:
1、value
value屬性用來指定資源名
2、entryType:
entry 類型,可選項(預設為 EntryType.OUT)
3、blockHandler / blockHandlerClass: (違反斷路規則觸發)
blockHandler 對應處理 BlockException 的函數名稱,可選項。blockHandler 函數通路範圍需要是 public,
傳回類型需要與原方法相比對,參數類型需要和原方法相比對并且最後加一個額外的參數,類型為 BlockException
。
blockHandler 函數預設需要和原方法在同一個類中
。
若希望使用其他類的函數,則可以指定 blockHandlerClass 為對應的類的 Class 對象
,
注意對應的函數必需為 static 函數
,否則無法解析。
/**
* Sentinel實作斷路(限流、熔斷、降級等)
* @author 15594
*/
@RestController
public class SentinelController {
@SentinelResource(value = "testA",blockHandler = "deal_testA",
blockHandlerClass = {BlockHandlerService.class})
@GetMapping("/testA/{vip}/{name}")
public String testA(@PathVariable("vip") String vip,@PathVariable("name") String name) {
return "------testA";
}
}
/**
* 違背斷路規則後,觸發的降級方法。為了降低代碼耦合将這些方法統一放到一起
* @author 15594
*/
public class BlockHandlerService {
/**
* 注意對應的函數必需為 static 函數,否則無法解析。
* */
public static String deal_testA(String vip, String name, BlockException exception) {
return "觸發限流";
}
}
注意:對應的BlockHandler函數必需為 static 函數,否則無法解析。
4、fallback:(請求異常觸發)
fallback 函數名稱,可選項,用于在抛出異常的時候提供 fallback 處理邏輯。fallback 函數可以針對所有類型的異常(除了 exceptionsToIgnore 裡面排除掉的異常類型)進行處理。fallback 函數簽名和位置要求:
傳回值類型必須與原函數傳回值類型一緻;方法參數清單需要和原函數一緻,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常。fallback 函數預設需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
/**
* 注意:如果隻配置fallback,可以不設定斷路規則
* */
@SentinelResource(value = "testC",fallbackClass = { FallbackClassService.class },fallback = "deal_testC"
//預設降級方法,當有fallback指定的方法時不起效。
,defaultFallback = "defaultFallback" )
@GetMapping("/testC")
public String testC() {
//制造一個異常
int i = 1/0;
return "------testC";
}
/**
* 代碼出現異常後,的降級處理方法,為了減少代碼耦合度将這些方法放到一個類中管理
* @author 15594
*/
public class FallbackClassService {
/**
* 注意對應的函數必需為 static 函數,否則無法解析。
* */
public static String deal_testC(Throwable e) {
System.out.println(e.getMessage());
return "程式異常,降級處理";
}
/**
* 傳回值類型必須與原函數傳回值類型一緻;
* 方法參數清單需要為空,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常。
* 為了解決代碼膨脹,我們給一個預設的降級方法
* */
public static String defaultFallback(Throwable e){
System.out.println(e.getMessage());
return "預設降級方法";
}
}
**注意:**降級方法,額外攜帶的參數隻能是 Throwable 類型(
隻能寫Throwable e,不能寫它的子類 ,不然會報錯
)的參數用于接收對應的異常。降級函數必需為 static 函數,否則無法解析。
5、defaultFallback(since 1.6.0):
預設的 fallback 函數名稱,可選項,通常用于通用的 fallback 邏輯(即可以用于很多服務或方法)。預設 fallback 函數可以針對是以類型的異常(
除了 exceptionsToIgnore 裡面排除掉的異常類型
)進行處理。若
同時配置了 fallback 和 defaultFallback,則隻有 fallback 會生效
。defaultFallback 函數簽名要求:
傳回值類型必須與原函數傳回值類型一緻;方法參數清單需要為空,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常。defaultFallback 函數預設需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
注意:通過指定預設降級方法可以有效防止代碼膨脹
6、exceptionsToIgnore(since 1.6.0):
用于
指定哪些異常被排除掉,不會計入異常統計中
,也不會進入 fallback 邏輯中,而是會原樣抛出。
五、持久化Sentinel斷路規則
在前面我們已經知道,通過Sentinel使用者界面配置的斷路規則會,随着服務的重新開機而丢失。如何将這些配置持久化呢?
Sentinel 目前支援以下資料源擴充(持久化):
Pull-based: 動态檔案資料源、Consul, Eureka
Push-based: ZooKeeper, Redis, Nacos, Apollo, etcd
`注意:下面這種方式是通過Nacos Push方式實作,并且這種方式可以遠端動态重新整理規則配置。` ### 1、導入pom 在之前的基礎上增加一個sentinel-datasource-nacos依賴 ```xml com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator com.alibaba.csp sentinel-datasource-nacos com.alibaba.cloud spring-cloud-starter-alibaba-sentinel 2.1.1.RELEASE ``` ### 2、改yml
server.port=8001
spring.application.name=-sentinel-service-provider
# 指定注冊中心
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 指定sentinel監控中心
spring.cloud.sentinel.transport.dashboard=localhost:8080
# 持久化sentinel規則配置到nacos ------ 新增
# 配置中心位址
spring.cloud.sentinel.datasource.ds1.nacos.server-addr=localhost:8848
# 命名空間
spring.cloud.sentinel.datasource.ds1.nacos.namespace=4a46ce6a-c692-4d85-8291-8961bd1ee52b
# data id
spring.cloud.sentinel.datasource.ds1.nacos.data-id=sentinel-datasource-service
# 組id
spring.cloud.sentinel.datasource.ds1.nacos.group-id=DEFAULT_GROUP
# 配置資料類型
spring.cloud.sentinel.datasource.ds1.nacos.data-type=json
spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow
3、到nacos配置一個斷路規則
[
{
"resource": "testA",
"IimitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
//可以繼續添加
]
4、通過注解綁定請求
@SentinelResource(value = "testA")
@GetMapping("/testA/{vip}/{name}")
public String testA(@PathVariable("vip") String vip,@PathVariable("name") String name) {
return "------testA";
}
5、如何編寫配置
比如:我們編寫一個熱點規則。
通過官網我們可以擷取到對應的屬性名:官網
注意:使用時把注釋去掉。
-
流控規則
根據實際的需要改變減少對應的參數即可
[ { // 資源名 "resource": "/test", // 針對來源,若為 default 則不區分調用來源 "limitApp": "default", // 限流門檻值類型(1:QPS;0:并發線程數) "grade": 1, // 門檻值 "count": 1, // 是否是叢集模式 "clusterMode": false, // 流控效果(0:快速失敗;1:Warm Up(預熱模式);2:排隊等待) "controlBehavior": 0, // 流控模式(0:直接;1:關聯;2:鍊路) "strategy": 0, // 預熱時間(秒,預熱模式需要此參數) "warmUpPeriodSec": 10, // 逾時時間(排隊等待模式需要此參數) "maxQueueingTimeMs": 500, // 關聯資源、入口資源(關聯、鍊路模式) "refResource": "rrr" } ]
-
降級(熔斷)規則
根據實際的需要改變減少對應的參數即可
[ { // 資源名 "resource": "/test1", "limitApp": "default", // 熔斷政策(0:慢調用比例,1:異常比率,2:異常計數) "grade": 0, // 最大RT、比例門檻值、異常數 "count": 200, // 慢調用比例門檻值,僅慢調用比例模式有效(1.8.0 引入) "slowRatioThreshold": 0.2, // 最小請求數 "minRequestAmount": 5, // 當機關統計時長(類中預設1000) "statIntervalMs": 1000, // 熔斷時長 "timeWindow": 10 } ]
-
熱點規則
根據實際的需要改變減少對應的參數即可
[ { // 資源名 "resource": "/test1", // 限流模式(QPS 模式,不可更改) "grade": 1, // 參數索引 "paramIdx": 0, // 單機門檻值 "count": 13, // 統計視窗時長 "durationInSec": 6, // 是否叢集 預設false "clusterMode": 預設false, // "burstCount": 0, // 叢集模式配置 "clusterConfig": { // "fallbackToLocalWhenFail": true, // "flowId": 2, // "sampleCount": 10, // "thresholdType": 0, // "windowIntervalMs": 1000 }, // 流控效果(支援快速失敗和勻速排隊模式) "controlBehavior": 0, // "limitApp": "default", // "maxQueueingTimeMs": 0, // 進階選項 "paramFlowItemList": [ { // 參數類型 "classType": "int", // 限流門檻值 "count": 222, // 參數值 "object": "2" } ] } ]
-
系統規則
負值表示沒有門檻值檢查。
不需要删除參數
[ { // RT "avgRt": 1, // CPU 使用率 "highestCpuUsage": -1, // LOAD "highestSystemLoad": -1, // 線程數 "maxThread": -1, // 入口 QPS "qps": -1 } ]
-
受權規則
根據實際的需要改變對應的參數即可
[ { // 資源名 "resource": "sentinel_spring_web_context", // 流控應用 "limitApp": "/test", // 授權類型(0代表白名單;1代表黑名單。) "strategy": 0 } ]
參考: Spring Cloud Alibaba Sentinel(八)持久化資料及配置json
六、Sentinel整合負載均衡
項目結構
1、導入pom
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web元件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel-datasource-nacos 因為Sentinel的斷路規則配置是一次性的,
Sentinel server重新開機後配置就會丢失,所有需要持久化用到nacos 的配置中心-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<!--SpringCloud openfeign整合了ribbon,使用的負載均衡本質上還是ribbon的。
同時openfeign還提供了服務降級功能,和幫我們動态生成通信實作類,使得我們控制層可以通過調用接口,實作服務間的通信,減少代碼耦合 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
2、改yml
server.port=81
spring.application.name=-sentinel-openfeign-service-consumer
# 指定注冊中心
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 指定sentinel監控中心
spring.cloud.sentinel.transport.dashboard=localhost:8080
# 持久化sentinel規則配置到nacos ------ 這個需要在nacos配置中心建立遠端配置檔案,用于持久化斷路規則和遠端動态修改斷路規則
spring.cloud.sentinel.datasource.ds1.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds1.nacos.namespace=4a46ce6a-c692-4d85-8291-8961bd1ee52b
spring.cloud.sentinel.datasource.ds1.nacos.data-id=sentinel-openfeign-service-consumer
spring.cloud.sentinel.datasource.ds1.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds1.nacos.data-type=json
spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow
# 如果為 true,則 OpenFeign 用戶端将被 Sentinel 斷路器包裹(用于服務降級,如果不使用,@FeignClient(fallback = "")帶的降級屬性可以不開啟)
#feign.sentinel.enabled=true
# 指定負載均衡政策:注意:如果這句代碼沒有提示,不要覺得寫錯了(我們也可以根據全限定類名,指定我們自己編寫的負載均衡政策)
# 注意:前面的service-provider為:服務位址,也就是@FeignClient(value = "service-provider") 中的value的值
service-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
#請求連接配接逾時時間
service-provider.ribbon.ConnectTimeout=500
#請求處理的逾時時間
service-provider.ribbon.ReadTimeout=1000
#對所有請求都進行重試
service-provider.ribbon.OkToRetryOnAllOperations=true
#切換執行個體的重試次數
service-provider.ribbon.MaxAutoRetriesNextServer=2
#對目前執行個體的重試次數
service-provider.ribbon.MaxAutoRetries=1
#此外ribbon還提供了以下負載均衡政策
#com.netflix.loadbalancer.RandomRule #配置規則 随機
#com.netflix.loadbalancer.RoundRobinRule #配置規則 輪詢
#com.netflix.loadbalancer.RetryRule #配置規則 重試
#com.netflix.loadbalancer.WeightedResponseTimeRule #配置規則 響應時間權重
#com.netflix.loadbalancer.BestAvailableRule #配置規則 最空閑連接配接政策
到nacos配置中心建立遠端配置檔案:
[{
"resource": "consumer",
"IimitApp": "default",
"grade": 1,
"count": 2,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}]
3、主啟動類
/**
* 主啟動類
* // @EnableDiscoveryClient nacos 開啟注冊中心
* // @EnableFeignClients 開啟openfeign
* @author 15594
*/
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class MainSentinelFeign81 {
public static void main(String[] args) {
SpringApplication.run(MainSentinelFeign81.class,args);
}
}
4、業務層
openFeign 接口:
/**
*
* 需要調用的生産者API
* openFeign會幫我們建立具體實作類。
* @author 15594
*/
@FeignClient(value = "service-provider")
public interface ProviderService {
@RequestMapping("/provider")
public String provider();
}
sentinel 降級處理:
/**
* 違背斷路規則後,觸發的降級方法。為了降低代碼耦合将這些方法統一放到一起
* @author 15594
*/
public class BlockHandlerService {
public static String provider(BlockException exception) {
System.out.println(exception.getRuleLimitApp());
return "違反斷路規則,降級處理";
}
}
/**
* 代碼出現異常後,的降級處理方法,為了減少代碼耦合度将這些方法放到一個類中管理
* @author 15594
*/
public class FallbackClassService {
public static String provider(Throwable throwable) {
System.out.println(throwable.getMessage());
return "程式異常,降級處理";
}
}
5、控制層
/**
* @author 15594
*/
@RestController
public class ConsumerController {
@Autowired
ProviderService providerService;
@RequestMapping("/consumer/provider")
@SentinelResource(value = "consumer",
blockHandlerClass = {BlockHandlerService.class},blockHandler = "provider",
fallbackClass ={FallbackClassService.class},fallback = "provider")
public String consumer(){
String provider = providerService.provider();
//int i = 1/0;
return provider;
}
}
6、測試
1. 啟動兩個服務提供者(生産者):
怎麼建立生産者可以參考
:spring cloud Alibaba——01 Nacos
2. 啟動消費者