日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Sentinel

發布時間:2023/12/8 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sentinel 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

熔斷降級限流

什么是熔斷

A 服務調用 B 服務的某個功能,由于網絡不穩定問題,或者 B 服務卡機,導致功能時間超長。如果這樣子的次數太多。我們就可以直接將 B 斷路了(A 不再請求 B 接口),凡是調用 B 的直接返回降級數據,不必等待 B 的超長執行。 這樣 B 的故障問題,就不會級聯影響到 A。

什么是降級

整個網站處于流量高峰期,服務器壓力劇增,根據當前業務情況及流量,對一些服務和頁面進行有策略的降級[停止服務,所有的調用直接返回降級數據]。以此緩解服務器資源的的壓力,以保證核心業務的正常運行,同時也保持了客戶和大部分客戶的得到正確的相應。

異同

相同點:1. 為了保證集群大部分服務的可用性和可靠性,防止崩潰,犧牲小我2. 用戶最終都是體驗到某個功能不可用 不同點:1. 熔斷是被調用方故障,觸發的系統主動規則2. 降級是基于全局考慮,停止一些正常服務,釋放資源

什么是限流

對打入服務的請求流量進行控制,使服務能夠承擔不超過自己能力的流量壓力

Sentinel 簡介

官方文檔:https://github.com/alibaba/Sentinel/wiki
項目地址:https://github.com/alibaba/Sentinel
隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。

Sentinel 具有以下特征:
  • 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的范圍)、消息削峰填谷、集群流量控制、實時熔斷下游不可用應用等。
  • 完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制臺中看到接入應用的單臺機器秒級數據,甚至 500 臺以下規模的集群的匯總運行情況。
  • 廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴并進行簡單的配置即可快速地接入 Sentinel。
  • 完善的 SPI 擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展接口。您可以通過實現擴展接口來快速地定制邏輯。例如定制規則管理、適配動態數據源等。
Sentinel 分為兩個部分:
  • 核心庫(Java 客戶端)不依賴任何框架/庫,能夠運行于所有 Java 運行時環境,同時對 Dubbo / Spring Cloud 等框架也有較好的支持。
  • 控制臺(Dashboard)基于 Spring Boot 開發,打包后可以直接運行,不需要額外的Tomcat 等應用容器。
Sentinel 基本概念
  • 資源
    資源是 Sentinel 的關鍵概念。它可以是 Java 應用程序中的任何內容,例如,由應用程序提供的服務,或由應用程序調用的其它應用提供的服務,甚至可以是一段代碼。在接下來的文檔中,我們都會用資源來描述代碼塊。
    只要通過 Sentinel API 定義的代碼,就是資源,能夠被 Sentinel 保護起來。大部分情況下,可以使用方法簽名,URL,甚至服務名稱作為資源名來標示資源。
  • 規則
    圍繞資源的實時狀態設定的規則,可以包括流量控制規則、熔斷降級規則以及系統保護規則。所有規則可以動態實時調整。

Hystrix 與 Sentinel

SpringCloud整合 (每個服務都需要)

pom
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
控制臺
  • 獲取控制臺
    您可以從 release 頁面 下載最新版本的控制臺 jar 包。

  • 啟動控制臺

#如若8080端口沖突,可使用 -Dserver.port=新端口 進行設置。 java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

控制臺默認用戶名密碼 sentinel

  • 配置控制臺信息
    application.yml
spring:cloud:sentinel:transport:#傳輸端口 默認8719port: 8719#sentinel 服務地址dashboard: localhost:8080

Endpoint 支持 統計

pom

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>

application.yml

Spring Boot 2.x 中添加配置 management.endpoints.web.exposure.include=*。暴露的 endpoint 路徑為 /actuator/sentinel

自定義阻塞返回方法(URL限流統一返回)

package com.jhj.gulimall.product.config;import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlBlockHandler; import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.alibaba.fastjson.JSON; import com.jhj.common.utils.R; import org.springframework.context.annotation.Configuration;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;@Configuration public class SeckillSentinelConfig {public SeckillSentinelConfig(){WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() {@Overridepublic void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws IOException {R error = R.error(10000, "太多請求");httpServletResponse.setCharacterEncoding("utf-8");httpServletResponse.setContentType("application/json");httpServletResponse.getWriter().write(JSON.toJSONString(error));}});} }

流控限流

https://github.com/alibaba/Sentinel/wiki/流控限流

當 Spring WebFlux 應用接入 Sentinel starter 后,所有的 URL 就自動成為 Sentinel 中的埋點資源,可以針對某個 URL 進行流控。不用再使用@SentinelResource(value = “sayHello”) 注解聲明

Sentinel 保護fegin遠程調用 也就是熔斷降級

pom

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>

給調用方 配置
application.yml

feign.sentinel.enabled=true

調用方抽取FeginService

package com.jhj.gulimall.product.fegin;import com.jhj.common.to.es.SkuEsModel; import com.jhj.common.utils.R; import com.jhj.gulimall.product.fegin.fallback.SearchFeginServiceFallBack; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody;import java.util.List;//標明那個熔斷處理 @FeignClient(value = "gulimall-search",fallback = SearchFeginServiceFallBack.class) public interface SearchFeginService {@PostMapping("/search/save/product")public R productStatusUp(@RequestBody List<SkuEsModel> skuEsModels); }

調用方編寫熔斷處理(降級返回)

package com.jhj.gulimall.product.fegin.fallback;import com.jhj.common.to.es.SkuEsModel; import com.jhj.common.utils.R; import com.jhj.gulimall.product.fegin.SearchFeginService; import org.springframework.stereotype.Component;import java.util.List;@Component public class SearchFeginServiceFallBack implements SearchFeginService {@Overridepublic R productStatusUp(List<SkuEsModel> skuEsModels) {return null;} }

拋出異常的方式定義資源

SphU 包含了 try-catch 風格的 API。用這種方式,當資源發生了限流之后會拋出 BlockException。這個時候可以捕捉異常,進行限流之后的邏輯處理。示例代碼如下:

// 1.5.0 版本開始可以利用 try-with-resources 特性(使用有限制) // 資源名可使用任意有業務語義的字符串,比如方法名、接口名或其它可唯一標識的字符串。 try (Entry entry = SphU.entry("resourceName")) {// 被保護的業務邏輯// do something here... } catch (BlockException ex) {// 資源訪問阻止,被限流或被降級// 在此處進行相應的處理操作 }

注解方式定義資源

Sentinel 支持通過 @SentinelResource 注解定義資源并配置 blockHandler 和 fallback 函數來進行限流之后的處理。示例:

// 原本的業務方法. @SentinelResource(value="blockHandlerForGetUser" blockHandler = "blockHandlerForGetUser") public User getUserById(String id) {throw new RuntimeException("getUserById command failed"); }// blockHandler 函數,原方法調用被限流/降級/系統保護的時候調用 public User blockHandlerForGetUser(String id, BlockException ex) {return new User("admin"); }

注意 blockHandler 函數會在原方法被限流/降級/系統保護的時候調用,而 fallback 函數會針對所有類型的異常。

@SentinelResource 用于定義資源,并提供可選的異常處理和 fallback 配置項。 @SentinelResource 注解包含以下屬性:

  • value:資源名稱,必需項(不能為空)
  • entryType:entry 類型,可選項(默認為 EntryType.OUT)
  • blockHandler / blockHandlerClass: blockHandler 對應處理 BlockException 的函數名稱,可選項。
    blockHandler 函數訪問范圍需要是 public,返回類型需要與原方法相匹配,參數類型需要和原方法相匹配并且最后加一個額外的參數,類型為 BlockException。blockHandler 函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 blockHandlerClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
  • fallback / fallbackClass:fallback 函數名稱,可選項,用于在拋出異常的時候提供 fallback 處理邏輯。
    fallback 函數可以針對所有類型的異常(除了 exceptionsToIgnore 里面排除掉的異常類型)進行處理。fallback 函數簽名和位置要求:
    返回值類型必須與原函數返回值類型一致;
    方法參數列表需要和原函數一致,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常。
    fallback 函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。

網關限流

被網關控制的就不會再進入系統

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId> </dependency>

https://github.com/alibaba/Sentinel/wiki/網關限流

配置網關限流請求,調用此回調
package com.jhj.gulimall.gateway.config;import com.alibaba.csp.sentinel.adapter.spring.webflux.callback.BlockRequestHandler; import com.alibaba.fastjson.JSON; import com.jhj.common.utils.R; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.server.ServerResponse; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono;@Configuration public class SentinelGatewayConfig {public SentinelGatewayConfig(){GatewayCallbackManager.setBlockHandler(new BlockRequestHandler(){//網關限流請求,調用此回調 Mono Flux@Overridepublic Mono<ServerResponse> handleRequest(ServerWebExchange exchange,Throwable t){R error = R.error(10000, "網關限流");String errJson= JSON.toJSONString(error);Mono<ServerResponse> body = ServerResponse.ok().body(Mono.just(errJson), String.class);return body;}});} }

作者聲明

如有問題,歡迎指正!

總結

以上是生活随笔為你收集整理的Sentinel的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。