sentinel 介紹
Sentinel是阿里巴巴開源的一款服務保護框架,目前已經加入SpringCloudAlibaba中。官方網站:
home | Sentinel
Sentinel 的使用可以分為兩個部分:
-
核心庫(Jar包):不依賴任何框架/庫,能夠運行于 Java 8 及以上的版本的運行時環境,同時對 Dubbo / Spring Cloud 等框架也有較好的支持。在項目中引入依賴即可實現服務限流、隔離、熔斷等功能。
-
控制臺(Dashboard):Dashboard 主要負責管理推送規則、監控、管理機器信息等。
Sentinel的控制臺搭建
1)下載jar包
下載地址:
https://github.com/alibaba/Sentinel/releases
2)運行
將jar包放在任意非中文、不包含特殊字符的目錄下,重命名為sentinel-dashboard.jar
:
然后運行如下命令啟動控制臺:
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
3)訪問
訪問http://localhost:8090頁面,就可以看到sentinel的控制臺了:
需要輸入賬號和密碼,默認都是:sentinel
微服務整合
1)引入sentinel依賴
<!--sentinel-->
<dependency><groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2)配置控制臺
修改application.yaml文件,添加下面內容:
spring:cloud: sentinel:transport:dashboard: localhost:8090
3)訪問service服務
的任意端點
默認情況下Sentinel會把路徑作為簇點資源的名稱,無法區分路徑相同但請求方式不同的接口,查詢、刪除、修改等都被識別為一個簇點資源,這顯然是不合適的。
所以我們可以選擇打開Sentinel的請求方式前綴,把請求方式 + 請求路徑
作為簇點資源名:
首先,在cart-service
的application.yml
中添加下面的配置:
spring:cloud:sentinel:transport:dashboard: localhost:8090http-method-specify: true # 開啟請求方式前綴
然后,重啟服務,通過頁面訪問購物車的相關接口,可以看到sentinel控制臺的簇點鏈路發生了變化:
OpenFeign整合Sentinel
修改cart-service模塊的application.yml文件,開啟Feign的sentinel功能:
feign:sentinel:enabled: true # 開啟feign對sentinel的支持
需要注意的是,默認情況下SpringBoot項目的tomcat最大線程數是200,允許的最大連接是8492,單機測試很難打滿。
所以我們需要配置一下cart-service模塊的application.yml文件,修改tomcat連接:
server:port: 8082tomcat:threads:max: 50 # 允許的最大線程數accept-count: 50 # 最大排隊等待數量max-connections: 100 # 允許的最大連接
然后重啟cart-service服務,可以看到查詢商品的FeignClient自動變成了一個簇點資源:
編寫降級邏輯
觸發限流或熔斷后的請求不一定要直接報錯,也可以返回一些默認數據或者友好提示,用戶體驗會更好。
給FeignClient編寫失敗后的降級邏輯有兩種方式:
-
方式一:FallbackClass,無法對遠程調用的異常做處理
-
方式二:FallbackFactory,可以對遠程調用的異常做處理,我們一般選擇這種方式。
步驟一:
在hm-api模塊中給ItemClient
定義降級處理類,實現FallbackFactory
:
代碼如下:
package com.hmall.api.fillback;import com.hmall.api.client.ItemClients;
import com.hmall.api.dto.ItemDTO;
import com.hmall.api.dto.OrderDetailDTO;
import com.hmall.common.utils.CollUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;import java.util.Collection;
import java.util.List;@Slf4j
public class ItemClientFallbackFactory implements FallbackFactory<ItemClients> {@Overridepublic ItemClients create(Throwable cause) {return new ItemClients() {@Overridepublic List<ItemDTO> queryItemsByIds(Collection<Long> ids) {log.error("調用商品服務失敗,原因:{}", cause.getMessage());return CollUtils.emptyList();}@Overridepublic void deductStock(List<OrderDetailDTO> orderDetailDTOS) {log.error("調用商品服務扣減庫存失敗,原因:{}", cause.getMessage());// 這里可以添加一些降級邏輯,比如記錄日志、發送消息等throw new RuntimeException(cause);}};}
}
步驟二:
在hm-api
模塊中的com.hmall.api.config.DefaultFeignConfig
類中將ItemClientFallback
注冊為一個Bean
:
步驟三:
在hm-api
模塊中的ItemClient
接口中使用ItemClientFallbackFactory
:
補充如果配置的熔斷降級com.hmall.api.config.DefaultFeignConfig
類與要使它生效的調用不在一個包下,那么要通過在要調用的微服務的啟動類上表明注解:
@EnableFeignClients(value = "com.hmall.api.client" , defaultConfiguration = DefaultFeignConfig.class)