[Spring-Cloud-Alibaba] Sentinel 整合RestTemplate & Feign

来源:https://www.cnblogs.com/zhangpan1244/archive/2019/07/19/11216292.html
-Advertisement-
Play Games

Sentinel API Github : "WIKI " Sphu (指明要保護的資源名稱) Tracer (指明調用來源,異常統計介面) ContextUtil(標示進入調用鏈入口) 流控規則(針對來源屬性) 降級規則 Sentinel Annotation 源碼: & 使用該註解重構上述方法 ...


Sentinel API

Github : WIKI

  • Sphu (指明要保護的資源名稱)
  • Tracer (指明調用來源,異常統計介面)
  • ContextUtil(標示進入調用鏈入口)
  • 流控規則(針對來源屬性)
  @GetMapping("/test-sentinel-api")
      public String testSentinelAPI(@RequestParam(required = false) String a) {
          String resourceName = "test-sentinel-api";
          
          ContextUtil.enter(resourceName, "user-center-service");
          // 定義一個sentinel 保護的資源,名稱是test-sentinel-api
          Entry entry = null;
          try {
  
              entry = SphU.entry(resourceName);
              // ...被保護的業務邏輯處理
              if (StringUtils.isEmpty(a)) {
                  // Sentinel 預設只會統計BlockException & BlockException的子類,如果想統計其他異常信息,添加Tracer
                  throw new IllegalArgumentException("A is not empty.");
              }
              return a;
              // block Exception: 如果被保護的資源被限流或者降級了,就會拋異常出去
          } catch (BlockException e) {
              log.error("我被限流啦!!{}", e);
              return "我被限流啦!!";
          } catch (IllegalArgumentException argEx) {
              // 統計當前異常發生次數 / 占比
              Tracer.trace(argEx);
              return "非法參數信息";
          } finally {
              if (entry != null) {
                  entry.exit();
              }
              ContextUtil.exit();
          }
      }
  • 降級規則
  @GetMapping("/test-sentinel-api")
      public String testSentinelAPI(@RequestParam(required = false) String a) {
  
          // 定義一個sentinel 保護的資源,名稱是test-sentinel-api
          Entry entry = null;
          try {
              entry = SphU.entry("test-sentinel-api");
              // ...被保護的業務邏輯處理
              if (StringUtils.isEmpty(a)) {
                  // Sentinel 預設只會統計BlockException & BlockException的子類,如果想統計其他異常信息,添加Tracer
                  throw new IllegalArgumentException("A is not empty.");
              }
              return a;
              // block Exception: 如果被保護的資源被限流或者降級了,就會拋異常出去
          } catch (BlockException e) {
              log.error("我被限流啦!!{}", e);
              return "我被限流啦!!";
          } catch (IllegalArgumentException argEx) {
              // 統計當前異常發生次數 / 占比
              Tracer.trace(argEx);
              return "非法參數信息";
          } finally {
              if (entry != null) {
                  entry.exit();
              }
          }
  
      }

Sentinel Annotation

源碼:com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect & com.alibaba.csp.sentinel.annotation.aspectj.AbstractSentinelAspectSupport

  • SentinelResource 使用該註解重構上述方法
      @GetMapping("/test-sentinel-resource")
      @SentinelResource(value = "test-sentinel-api", blockHandler = "blockException", fallback = "fallback")
      public String testSentinelResource(@RequestParam(required = false) String a) {
          // ...被保護的業務邏輯處理
          if (StringUtils.isEmpty(a)) {
              // Sentinel 預設只會統計BlockException & BlockException的子類,如果想統計其他異常信息,添加Tracer
              throw new IllegalArgumentException("A is not empty.");
          }
          return a;
      }
  
      /**
       * testSentinelResource BlockException method
       */
      public String blockException(String a, BlockException e) {
          log.error("限流了,{}", e);
          return "blockHandler 對應《限流規則》";
      }
  
      /**
       * testSentinelResource fallback method
       * {@link SentinelResource} #fallback 在< 1.6的版本中,不能補貨BlockException
       */
      public String fallback(String a) {
          return "fallback 對應《降級規則》";
      }

RestTemplate 整合Sentinel

使用 @SentinelRestTemplate.

resttemplate.sentinel.enabled可以開關是否啟用該註解。(開發階段很有意義。)

源碼:com.springframework.cloud.alibaba.sentinel.custom.SentinelBeanPostProcessor

@Bean
@LoadBalanced
@SentinelRestTemplate
public RestTemplate restTemplate() {
    return new RestTemplate();
}

@Autowired
private RestTemplate restTemplate;
...

Feign整合 Sentinel

配置文件中添加 feign.sentinel.enabled: true來開啟

  1. 編寫fallback 類,實現feign client
   @Component
   public class UserCenterFeignClientFallback implements IUserCenterFeignClient {
       @Override
       public UserDTO findById(Long userId) {
           UserDTO userDTO = new UserDTO();
           userDTO.setWxNickname("預設用戶");
           return userDTO;
       }
   }
   
   @Slf4j
   @Component
   public class UserCenterFeignClientFallbackFactory implements FallbackFactory<IUserCenterFeignClient> {
   
       @Override
       public IUserCenterFeignClient create(Throwable cause) {
           return new IUserCenterFeignClient() {
               @Override
               public UserDTO findById(Long userId) {
                   log.warn("遠程調用被限流/降級,{}", cause);
                   UserDTO userDTO = new UserDTO();
                   userDTO.setWxNickname("預設用戶");
                   return userDTO;
               }
           };
       }
   }
  1. 應用fallback class
   /**
    * IUserCenterFeignClient for 定義 user-center feign client
    * fallbackFactory 可以拿到異常信息
    * fallback 無法拿到異常信息
    *
    * @author <a href="mailto:[email protected]">Isaac.Zhang | 若初</a>
    * @since 2019/7/15
    */
   @FeignClient(name = "user-center",
           // fallback = UserCenterFeignClientFallback.class,
           fallbackFactory = UserCenterFeignClientFallbackFactory.class
   )
   public interface IUserCenterFeignClient {
       @GetMapping(path = "/users/{userId}")
       public UserDTO findById(@PathVariable Long userId);
   }
   
   
  1. 啟動應用,設置流控規則,結果展示如下
   {
       id: 1,
       ...
       wxNickName: "預設用戶"
   }

源碼:org.springframework.cloud.alibaba.sentinel.feign.SentinelFeign


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 註:本文摘自李智慧的《大型網站技術架構》 1.初始階段的網站架構 小型互聯網公司一般在最初階段都是將:應用程式、資料庫、文件等所有的資源都在一臺伺服器上。通常伺服器操作系統使用Linux,應用程式使用PHP開發,然後部署在Apache上,資料庫使用MySQL,彙集各種免費開源軟體及一臺廉價伺服器就可 ...
  • 1.代碼生成器: [正反雙向](單表、主表、明細表、樹形表,快速開發利器)freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本、處理類、service等完整模塊2.多數據源:(支持同時連接無數個資料庫,可以不同的模塊連接不同數的據庫)支持N個數據源3.阿裡資料庫連 ...
  • 前言 最近工作中備受打擊,之前設計的很多程式都被老大否決,需要重構,讓我好好看看設計模式。之前對這一塊內容的確不怎麼重視,感覺枯燥無聊又派不上用場。後來沉下心來研究了一番... 我靠,原來如此,之前寫代碼的時候怎麼這麼傻逼,很多問題其實在一開始設計的時候就能避免。之前寫的都是些什麼鬼。 我們踩過的坑 ...
  • 架構雜談《五》 保證最終一致性的模式 在大規模、高併發服務化系統中,一個功能被拆分成多個具有功能單一的子功能,一個流程會有多個系統的多個單一功能的服務組合實現,如果使用兩階段提交協議和三階段提交協議,確實能解決系統間的一致性問題。其實現也比較複雜、成本比較高,最重要的是性能不夠好,相比來看,TCC協 ...
  • 前言 模式介紹 外觀模式相比較之下比較簡單,模式設計中定義是為子系統中的一組介面提供一個一致的界面,此模式定義了一個高層介面,這個介面是的這一子系統更加容易使用。 如果不理解呢,簡單些說就是外觀模式提供了為內部提供了同意的介面層,解耦了子系統和客戶端,這樣客戶端只需要知道外觀類存在即可,不需要知道具 ...
  • 第四章 分詞 下雨天留客天留我不留 本打算先介紹“簡單搜索”,對ES的搜索有一個直觀的感受。但在寫的過程中發現分詞無論如何都繞不過去。 查詢, 查詢都與分詞息息相關,索性先介紹分詞。 ES作為一個開源的搜索引擎,其核心自然在於搜索,而搜索不同於我們在MySQL中的 查詢語句,無論我們在百度搜索一個關 ...
  • [TOC] 一、分散式事務前奏 事務:事務是由一組操作構成的可靠的獨立的工作單元,事務具備ACID的特性,即原子性、一致性、隔離性和持久性。 本地事務:當事務由資源管理器本地管理時被稱作本地事務。本地事務的優點就是支持嚴格的ACID特性,高效,可靠,狀態可以只在資源管理器中維護,而且應用編程模型簡單 ...
  • 開篇:自己自學java拖拖拉拉的也有半年了,一學期里有很多事讓我停止學習java,轉眼間開學就要大四找工作了,想用一個暑假好好學習一些java,想掌握一門技術讓自己餓不死。本想每天寫一些筆記總結,發現那樣的話太費時間了,即便寫了,我自己都不看。最後,我決定還是以題的形式寫成文章,方便自己複習,同時也 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...