中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在SpringBoot2.0中使用Sentinel如何實現動態限流

發布時間:2020-11-16 14:42:53 來源:億速云 閱讀:815 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關在SpringBoot2.0中使用Sentinel如何實現動態限流,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

Sentinel 是什么?

隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。

Sentinel 具有以下特征:

  • 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的范圍)、消息削峰填谷、集群流量控制、實時熔斷下游不可用應用等。
  • 完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制臺中看到接入應用的單臺機器秒級數據,甚至 500 臺以下規模的集群的匯總運行情況。
  • 廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴并進行簡單的配置即可快速地接入 Sentinel。
  • 完善的 SPI 擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展接口。您可以通過實現擴展接口來快速地定制邏輯。例如定制規則管理、適配動態數據源等。

Sentinel 的主要特性:

在SpringBoot2.0中使用Sentinel如何實現動態限流

Sentinel 的開源生態:

在SpringBoot2.0中使用Sentinel如何實現動態限流

Sentinel 分為兩個部分:

  • 核心庫(Java 客戶端)不依賴任何框架/庫,能夠運行于所有 Java 運行時環境,同時對 Dubbo / Spring Cloud 等框架也有較好的支持。
  • 控制臺(Dashboard)基于 Spring Boot 開發,打包后可以直接運行,不需要額外的 Tomcat 等應用容器。

控制臺配置

Sentinel 控制臺最少應該包含如下功能:

  • 查看機器列表以及健康情況:收集 Sentinel 客戶端發送的心跳包,用于判斷機器是否在線。
  • 監控 (單機和集群聚合):通過 Sentinel 客戶端暴露的監控 API,定期拉取并且聚合應用監控信息,最終可以實現秒級的實時監控。
  • 規則管理和推送:統一管理推送規則。
  • 鑒權:生產環境中鑒權非常重要。這里每個開發者需要根據自己的實際情況進行定制。

可以直接從[ release 頁面](https://github.com/alibaba/Sentinel/releases " release 頁面") 下載最新版本的控制臺 jar 包,啟動 Sentinel 控制臺需要 JDK 版本為 1.8 及以上版本。。

啟動腳本 sentinel.sh:

#!/bin/bash
java -Dsentinel.dashboard.auth.username=admin \
-Dsentinel.dashboard.auth.password=admin \
-Dserver.port=8084 -Dcsp.sentinel.dashboard.server=localhost:8084 \
-Dproject.name=sentinel-dashboard \
-jar sentinel-dashboard-1.6.3.jar &

用戶可以通過如下參數進行配置:

  • -Dsentinel.dashboard.auth.username=admin 用于指定控制臺的登錄用戶名為 admin;
  • -Dsentinel.dashboard.auth.password=admin 用于指定控制臺的登錄密碼為 admin;如果省略這兩個參數,默認用戶和密碼均為 sentinel;
  • -Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服務端 session 的過期時間,如 7200 表示 7200 秒;60m 表示 60 分鐘,默認為 30 分鐘;
     

在SpringBoot2.0中使用Sentinel如何實現動態限流

客戶端配置

pom.xml 引入以下依賴:

 <!-- https://blog.52itstyle.vip -->
<parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.1.5.RELEASE</version>
 <relativePath/>
</parent>
<dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>com.alibaba.cloud</groupId>
 <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
 </dependency>
</dependencies>
<dependencyManagement>
 <!--注意跟 SpringBoot 保持一致 2.1.x for Spring Boot 2.1.x-->
 <dependencies>
 <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>

配置文件:

# 應用名稱 https://blog.52itstyle.vip
spring.application.name=blog
spring.cloud.sentinel.transport.port=8720
# 測試請替換為自己的地址
spring.cloud.sentinel.transport.dashboard=116.190.247.112:8084

這里的 spring.cloud.sentinel.transport.port端口配置會在應用對應的機器上啟動一個 Http Server,該 Server 會與 Sentinel 控制臺做交互。比如 Sentinel 控制臺添加了1個限流規則,會把規則數據 push 給這個 Http Server 接收,Http Server 再將規則注冊到 Sentinel 中。

代碼配置:

/**
 * 博文 https://blog.52itstyle.vip
 */
@RequestMapping("{id}.shtml")
@SentinelResource("blogView")
public String page(@PathVariable("id") Long id, ModelMap model) {
 try{
 Blog blog = blogService.getById(id);
 String key = "blog_"+id;
 Long views = redisUtil.size(key);
 blog.setViews(views+blog.getViews());
 model.addAttribute("blog",blog);
 } catch (Throwable e) {
 return "error/404";
 }
 return "article";
}

@SentinelResource 注解用來標識資源是否被限流、降級。上述例子上該注解的屬性 'blogView' 表示資源名。

默認情況,Sentinel 會攔截所有的 Controller 請求,這里標識資源名,是因為所有的文章都會走這個請求,為了方便統計和流控,這里自定義資源標識。

更多注解支持,請參考:Sentinel/wiki/注解支持。

訪問客戶端項目,隨便點擊幾個頁面,然后登錄 Sentinel 控制臺,如果看到以下界面,說明配置成功。

在SpringBoot2.0中使用Sentinel如何實現動態限流

在SpringBoot2.0中使用Sentinel如何實現動態限流

配置限流,搜索我們剛才配置的資源名稱,選擇流控功能。

在SpringBoot2.0中使用Sentinel如何實現動態限流

在SpringBoot2.0中使用Sentinel如何實現動態限流

輸入閾值參數,為了測試方便,這里直接輸入2,連續刷新瀏覽器,如果后臺出現以下錯誤,并伴隨著前臺頁面無法正常顯示說明配置生效。

Caused by: com.alibaba.csp.sentinel.slots.block.flow.FlowException: null

當然,Sentinel 流程功能不僅僅這么簡單,還支持集群模式,在終極版十萬博文中,我們可以為集群中的節點,設置單機均分,也可以設置一個總體的閾值。

在SpringBoot2.0中使用Sentinel如何實現動態限流

生產環境中使用

Sentinel 核心庫目前已可用于生產環境,目前除了阿里巴巴以外,也有多家企業在生產環境中使用它們。

規則管理及推送

原生版本的規則管理通過API 將規則推送至客戶端并直接更新到內存中,并不能直接用于生產環境。

在SpringBoot2.0中使用Sentinel如何實現動態限流

不過 Sentinel提供了擴展讀數據源ReadableDataSource,規則中心統一推送,客戶端通過注冊監聽器的方式時刻監聽變化,比如使用 Nacos、Zookeeper 等配置中心。這種方式有更好的實時性和一致性保證。

在SpringBoot2.0中使用Sentinel如何實現動態限流

監控

Sentinel 會記錄資源訪問的秒級數據(若沒有訪問則不進行記錄)并保存在本地日志中。Sentinel 控制臺可以通過 Sentinel 客戶端預留的 HTTP API 從秒級監控日志中拉取監控數據,并進行聚合。

目前 Sentinel 控制臺中監控數據聚合后直接存在內存中,未進行持久化,且僅保留最近 5 分鐘的監控數據。若需要監控數據持久化的功能,可以自行擴展實現。

在SpringBoot2.0中使用Sentinel如何實現動態限流

注意事項

由于一開始沒有認真讀文檔,把控制臺部署到了外網,而客戶端在內網啟動,導致客戶端無法被訪問到,實時鏈路和簇點鏈路數據無法正常顯示。

測試的小伙伴注意了,原始模式下,客戶端和控制臺必須相互被訪問到,客戶端會向控制臺定時發送心跳請求,控制臺會向客戶端推送規則、拉取流控數據并聚合。

關于在SpringBoot2.0中使用Sentinel如何實現動態限流就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屏东县| 图木舒克市| 措美县| 安溪县| 夏邑县| 佳木斯市| 建宁县| 蓬莱市| 濮阳县| 长子县| 麟游县| 寿光市| 佳木斯市| 靖西县| 绥滨县| 六枝特区| 平舆县| 西乡县| 逊克县| 宣恩县| 志丹县| 湘西| 新源县| 曲沃县| 金华市| 乐清市| 北宁市| 尚志市| 车险| 格尔木市| 马龙县| 渝北区| 于都县| 大同县| 阿合奇县| 乐山市| 新郑市| 额尔古纳市| 瓦房店市| 留坝县| 安吉县|