阿里開源的限流神器 Sentinel,輕松搞定接口限流!
Sentinel是阿里巴巴開源的限流器熔斷器,并且?guī)в锌梢暬僮鹘缑妗?/p>
在日常開發(fā)中,限流功能時(shí)常被使用,用于對(duì)某些接口進(jìn)行限流熔斷,譬如限制單位時(shí)間內(nèi)接口訪問(wèn)次數(shù);或者按照某種規(guī)則進(jìn)行限流,如限制ip的單位時(shí)間訪問(wèn)次數(shù)等。
之前我們已經(jīng)講過(guò)接口限流的工具類ratelimter可以實(shí)現(xiàn)令牌桶的限流,很明顯sentinel的功能更為全面和完善。
來(lái)看一下sentinel的簡(jiǎn)介:
https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來(lái)越重要。Sentinel 以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。
Sentinel包括服務(wù)端和客戶端,服務(wù)端有可視化界面,客戶端需引入jar后即可和服務(wù)端通信并完成限流功能。
啟動(dòng)服務(wù)端的jar
https://github.com/alibaba/Sentinel/releases
在這個(gè)地址,下載release的jar,然后啟動(dòng)即可。
這個(gè)jar是個(gè)標(biāo)準(zhǔn)的Springboot應(yīng)用,可以通過(guò)
java -jar sentinel-dashboard-1.6.0.jar
來(lái)啟動(dòng),這樣就是默認(rèn)的設(shè)置,啟動(dòng)在8080端口。
也可以加上一些自定義配置來(lái)啟動(dòng):
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
https://github.com/javastacks/spring-boot-best-practice
這里我們直接使用默認(rèn)?java -jar sentinel-dashboard-1.6.0.jar?來(lái)啟動(dòng),之后訪問(wèn)localhost:8080。
可以看到界面:
輸入賬號(hào)密碼sentinel后進(jìn)入主界面
此時(shí)因?yàn)槲覀儾](méi)有啟動(dòng)客戶端,所以界面是空的。
啟動(dòng)客戶端
新建一個(gè)Springboot項(xiàng)目,pom如下:
"1.0"?encoding="UTF-8"?>
"http://maven.apache.org/POM/4.0.0"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?????????xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/xsd/maven-4.0.0.xsd">
????4.0.0
????
????????org.springframework.boot
????????spring-boot-starter-parent
????????2.0.5.RELEASE
???????? ?
????
????
????com.maimeng.baobanq
????baobanserver
????0.0.1-SNAPSHOT
????jar
????baobanserver
????Demo?project?for?Spring?Boot
?
????
????????UTF-8
????????UTF-8
????????1.8
????????Finchley.SR1
????
?
????
???????
????????
????????????org.springframework.boot
????????????spring-boot-starter-web
????????
???????
????????
????????
????????????org.springframework.cloud
????????????spring-cloud-starter-alibaba-sentinel
????????
????????
???????
????????
????????????org.springframework.boot
????????????spring-boot-starter-test
????????????test
????????
????
?
????
????????
????????????
????????????????org.springframework.cloud
????????????????spring-cloud-dependencies
????????????????${spring-cloud.version}
????????????????<type>pomtype>
????????????????import
????????????
?
????????????
????????????????org.springframework.cloud
????????????????spring-cloud-alibaba-dependencies
????????????????0.2.2.RELEASE
????????????????<type>pomtype>
????????????????import
????????????
????????
????
?
????
????????
????????????
????????????????org.springframework.boot
????????????????spring-boot-maven-plugin
????????????
????????
????
?
需要注意引用的SpringCloud-alibaba的版本是0.2.2,當(dāng)前的最新版,如果是Springboot2.x的項(xiàng)目,需要引0.2.x的。Springboot1.x的引0.1.x的。
不懂 Spring Boot 的看下這個(gè),很全了:
https://github.com/javastacks/spring-boot-best-practice
Sentinel的客戶端依賴也很簡(jiǎn)單,spring-cloud-starter-alibaba-sentinel加這一個(gè)引用即可。
之后在application.yml里添加server的地址配置:
spring:
?application:
???name:?baobanserver
?cloud:
??sentinel:
????transport:
??????dashboard:?localhost:8080
????#eager:?true
另外由于8080端口已被占用,自行設(shè)置一個(gè)端口,如8888.
做完這些,新建一個(gè)controller,
@RestControllerpublic?class?TestController?{@GetMapping(value?=?"/hello")public?String?hello()?{return?"Hello?Sentinel";}}
就是一個(gè)普通的controller接口。
之后啟動(dòng)該項(xiàng)目。啟動(dòng)后回到server的控制臺(tái)界面:
發(fā)現(xiàn)并沒(méi)有什么變化。然后我們調(diào)用一下hello接口。之后再次刷新server控制臺(tái)。
界面已經(jīng)出現(xiàn)了我們的項(xiàng)目,并且有一堆規(guī)則。
然后在簇點(diǎn)鏈路里hello接口的流控那里設(shè)置限流規(guī)則,將單機(jī)閾值設(shè)為1.就代表一秒內(nèi)最多只能通過(guò)1次請(qǐng)求到達(dá)該hello接口。
之后再次連續(xù)訪問(wèn)hello接口。
發(fā)現(xiàn)已經(jīng)被攔截了,限流已經(jīng)生效。
這樣就完成了一次簡(jiǎn)單的限流操作,并且能看到各接口的QPS的統(tǒng)計(jì)。
本文鏈接:https://blog.csdn.net/tianyaleixiaowu/article/details/89916891
PS:如果覺得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、在看。
大家一起在評(píng)論區(qū)聊聊唄~
