您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)在SpringBoot2.0中使用Sentinel如何實(shí)現(xiàn)動(dòng)態(tài)限流,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
Sentinel 是什么?
隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來(lái)越重要。Sentinel 以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。
Sentinel 具有以下特征:
Sentinel 的主要特性:
Sentinel 的開源生態(tài):
Sentinel 分為兩個(gè)部分:
控制臺(tái)配置
Sentinel 控制臺(tái)最少應(yīng)該包含如下功能:
可以直接從[ release 頁(yè)面](https://github.com/alibaba/Sentinel/releases " release 頁(yè)面") 下載最新版本的控制臺(tái) jar 包,啟動(dòng) Sentinel 控制臺(tái)需要 JDK 版本為 1.8 及以上版本。。
啟動(dòng)腳本 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 &
用戶可以通過(guò)如下參數(shù)進(jìn)行配置:
客戶端配置
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>
配置文件:
# 應(yīng)用名稱 https://blog.52itstyle.vip spring.application.name=blog spring.cloud.sentinel.transport.port=8720 # 測(cè)試請(qǐng)?zhí)鎿Q為自己的地址 spring.cloud.sentinel.transport.dashboard=116.190.247.112:8084
這里的 spring.cloud.sentinel.transport.port端口配置會(huì)在應(yīng)用對(duì)應(yīng)的機(jī)器上啟動(dòng)一個(gè) Http Server,該 Server 會(huì)與 Sentinel 控制臺(tái)做交互。比如 Sentinel 控制臺(tái)添加了1個(gè)限流規(guī)則,會(huì)把規(guī)則數(shù)據(jù) push 給這個(gè) Http Server 接收,Http Server 再將規(guī)則注冊(cè)到 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 注解用來(lái)標(biāo)識(shí)資源是否被限流、降級(jí)。上述例子上該注解的屬性 'blogView' 表示資源名。
默認(rèn)情況,Sentinel 會(huì)攔截所有的 Controller 請(qǐng)求,這里標(biāo)識(shí)資源名,是因?yàn)樗械奈恼露紩?huì)走這個(gè)請(qǐng)求,為了方便統(tǒng)計(jì)和流控,這里自定義資源標(biāo)識(shí)。
更多注解支持,請(qǐng)參考:Sentinel/wiki/注解支持。
訪問(wèn)客戶端項(xiàng)目,隨便點(diǎn)擊幾個(gè)頁(yè)面,然后登錄 Sentinel 控制臺(tái),如果看到以下界面,說(shuō)明配置成功。
配置限流,搜索我們剛才配置的資源名稱,選擇流控功能。
輸入閾值參數(shù),為了測(cè)試方便,這里直接輸入2,連續(xù)刷新瀏覽器,如果后臺(tái)出現(xiàn)以下錯(cuò)誤,并伴隨著前臺(tái)頁(yè)面無(wú)法正常顯示說(shuō)明配置生效。
Caused by: com.alibaba.csp.sentinel.slots.block.flow.FlowException: null
當(dāng)然,Sentinel 流程功能不僅僅這么簡(jiǎn)單,還支持集群模式,在終極版十萬(wàn)博文中,我們可以為集群中的節(jié)點(diǎn),設(shè)置單機(jī)均分,也可以設(shè)置一個(gè)總體的閾值。
生產(chǎn)環(huán)境中使用
Sentinel 核心庫(kù)目前已可用于生產(chǎn)環(huán)境,目前除了阿里巴巴以外,也有多家企業(yè)在生產(chǎn)環(huán)境中使用它們。
規(guī)則管理及推送
原生版本的規(guī)則管理通過(guò)API 將規(guī)則推送至客戶端并直接更新到內(nèi)存中,并不能直接用于生產(chǎn)環(huán)境。
不過(guò) Sentinel提供了擴(kuò)展讀數(shù)據(jù)源ReadableDataSource,規(guī)則中心統(tǒng)一推送,客戶端通過(guò)注冊(cè)監(jiān)聽器的方式時(shí)刻監(jiān)聽變化,比如使用 Nacos、Zookeeper 等配置中心。這種方式有更好的實(shí)時(shí)性和一致性保證。
監(jiān)控
Sentinel 會(huì)記錄資源訪問(wèn)的秒級(jí)數(shù)據(jù)(若沒(méi)有訪問(wèn)則不進(jìn)行記錄)并保存在本地日志中。Sentinel 控制臺(tái)可以通過(guò) Sentinel 客戶端預(yù)留的 HTTP API 從秒級(jí)監(jiān)控日志中拉取監(jiān)控?cái)?shù)據(jù),并進(jìn)行聚合。
目前 Sentinel 控制臺(tái)中監(jiān)控?cái)?shù)據(jù)聚合后直接存在內(nèi)存中,未進(jìn)行持久化,且僅保留最近 5 分鐘的監(jiān)控?cái)?shù)據(jù)。若需要監(jiān)控?cái)?shù)據(jù)持久化的功能,可以自行擴(kuò)展實(shí)現(xiàn)。
注意事項(xiàng)
由于一開始沒(méi)有認(rèn)真讀文檔,把控制臺(tái)部署到了外網(wǎng),而客戶端在內(nèi)網(wǎng)啟動(dòng),導(dǎo)致客戶端無(wú)法被訪問(wèn)到,實(shí)時(shí)鏈路和簇點(diǎn)鏈路數(shù)據(jù)無(wú)法正常顯示。
測(cè)試的小伙伴注意了,原始模式下,客戶端和控制臺(tái)必須相互被訪問(wèn)到,客戶端會(huì)向控制臺(tái)定時(shí)發(fā)送心跳請(qǐng)求,控制臺(tái)會(huì)向客戶端推送規(guī)則、拉取流控?cái)?shù)據(jù)并聚合。
關(guān)于在SpringBoot2.0中使用Sentinel如何實(shí)現(xiàn)動(dòng)態(tài)限流就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。