上一篇我們介紹了如何通過(guò)Nacos的配置功能來(lái)存儲(chǔ)限流規(guī)則。Apollo是國(guó)內(nèi)用戶非常多的配置中心驯击,所以硝清,今天我們繼續(xù)說(shuō)說(shuō)Spring Cloud Alibaba Sentinel中如何將流控規(guī)則存儲(chǔ)在Apollo中。
使用Apollo存儲(chǔ)限流規(guī)則
Sentinel自身就支持了多種不同的數(shù)據(jù)源來(lái)持久化規(guī)則配置脚囊,目前包括以下幾種方式:
本文我們就來(lái)一起動(dòng)手嘗試一下龟糕,如何使用Apollo來(lái)存儲(chǔ)限流規(guī)則。
準(zhǔn)備工作
下面我們將同時(shí)使用到Apollo
和Sentinel Dashboard
悔耘,所以可以先把Apollo
和Sentinel Dashboard
啟動(dòng)起來(lái)讲岁。
如果還沒(méi)入門Sentinel Dashboard
可以通過(guò)文末的系列目錄先學(xué)習(xí)之前的內(nèi)容。Apollo的話相對(duì)復(fù)雜一些,這里不做詳細(xì)介紹了缓艳,如果還沒(méi)有接觸過(guò)Apollo的讀者可以查看其官方文檔進(jìn)一步學(xué)習(xí)校摩。
應(yīng)用配置
第一步:在Spring Cloud應(yīng)用的pom.xml
中引入Spring Cloud Alibaba的Sentinel模塊和Apollo存儲(chǔ)擴(kuò)展:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-apollo</artifactId>
<version>1.4.0</version>
</dependency>
</dependencies>
第二步:在Spring Cloud應(yīng)用中配置的服務(wù)信息,在resource
目錄下阶淘,創(chuàng)建apollo-env.properties
文件衙吩,內(nèi)容樣例:
local.meta=http://192.168.0.201:8080
dev.meta=http://192.168.0.202:8080
這里需要了解Apollo對(duì)多環(huán)境的配置,這里設(shè)置的是每個(gè)環(huán)境不同的配置服務(wù)地址溪窒,讀者需要根據(jù)自己的實(shí)際情況修改坤塞。
第三步:在Spring Cloud應(yīng)用中添加配置信息:
spring.application.name=sentinel-datasource-apollo
server.port=8002
# apollo config
app.id=${spring.application.name}
# sentinel dashboard
spring.cloud.sentinel.transport.dashboard=localhost:8080
# sentinel datasource apollo
spring.cloud.sentinel.datasource.ds.apollo.namespaceName=application
spring.cloud.sentinel.datasource.ds.apollo.flowRulesKey=sentinel.flowRules
-
app.id
:Apollo中的創(chuàng)建的項(xiàng)目名稱,這里采用spring.application.name
參數(shù)的引用澈蚌,從而達(dá)到服務(wù)名與配置項(xiàng)目名一致的效果 -
spring.cloud.sentinel.transport.dashboard
:sentinel dashboard的訪問(wèn)地址摹芙,根據(jù)上面準(zhǔn)備工作中啟動(dòng)的實(shí)例配置 -
spring.cloud.sentinel.datasource.ds.apollo.namespaceName
:Apollo的空間名 -
spring.cloud.sentinel.datasource.ds.apollo.flowRulesKey
:配置規(guī)則的key名稱
關(guān)于Apollo相關(guān)配置的對(duì)應(yīng)關(guān)系可見下圖所示:
第四步:創(chuàng)建應(yīng)用主類,并提供一個(gè)rest接口宛瞄,比如:
@EnableApolloConfig
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@Slf4j
@RestController
static class TestController {
@GetMapping("/hello")
public String hello() {
return "didispace.com";
}
}
}
其中@EnableApolloConfig
注解是開啟Apollo的配置加載功能浮禾。
第五步:Apollo中配置限流規(guī)則,具體可見第三步的截圖中的樣子份汗。其中盈电,key值的內(nèi)容是下面的json
[
{
"resource": "/hello",
"limitApp": "default",
"grade": 1,
"count": 5,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
可以看到上面配置規(guī)則是一個(gè)數(shù)組類型,數(shù)組中的每個(gè)對(duì)象是針對(duì)每一個(gè)保護(hù)資源的配置對(duì)象杯活,每個(gè)對(duì)象中的屬性解釋如下:
- resource:資源名银还,即限流規(guī)則的作用對(duì)象
- limitApp:流控針對(duì)的調(diào)用來(lái)源柠掂,若為 default 則不區(qū)分調(diào)用來(lái)源
- grade:限流閾值類型(QPS 或并發(fā)線程數(shù))凌简;
0
代表根據(jù)并發(fā)數(shù)量來(lái)限流荡碾,1
代表根據(jù)QPS來(lái)進(jìn)行流量控制 - count:限流閾值
- strategy:調(diào)用關(guān)系限流策略
- controlBehavior:流量控制效果(直接拒絕、Warm Up均践、勻速排隊(duì))
- clusterMode:是否為集群模式
這里我們只做簡(jiǎn)單的配置解釋晤锹,以便于理解這里的配置作用。實(shí)際上這里還有非常多可配置選項(xiàng)和規(guī)則彤委,更復(fù)雜的配置后面我們單獨(dú)開一篇來(lái)深入學(xué)習(xí)鞭铆。
第六步:?jiǎn)?dòng)應(yīng)用。如果一些順利焦影,可以看到類似下面的日志车遂,代表已經(jīng)成功從Nacos加載了一條限流規(guī)則:
2019-04-18 23:56:11.278 INFO 29149 --- [ main] o.s.c.a.s.c.SentinelDataSourceHandler : [Sentinel Starter] DataSource ds-sentinel-apollo-datasource start to loadConfig
2019-04-18 23:56:11.279 INFO 29149 --- [ main] o.s.c.a.s.c.SentinelDataSourceHandler : [Sentinel Starter] DataSource ds-sentinel-apollo-datasource load 1 FlowRule
通過(guò)postman或者curl訪問(wèn)幾下localhost:8002/hello
接口:
$ curl localhost:8002/hello
didispace.com
此時(shí),在Sentinel Dashboard中就可以看到當(dāng)前我們啟動(dòng)的sentinel-datasource-apollo
服務(wù)斯辰。點(diǎn)擊左側(cè)菜單中的流控規(guī)則舶担,可以看到已經(jīng)存在一條記錄了,這條記錄就是上面我們?cè)贏pollo中配置的限流規(guī)則彬呻。
深入思考
在使用Apollo存儲(chǔ)規(guī)則配置的時(shí)候與Nacos存儲(chǔ)一樣衣陶,對(duì)于Sentinel控制臺(tái)這些數(shù)據(jù)是只讀的柄瑰,也就是說(shuō):
- Sentinel控制臺(tái)中修改規(guī)則:僅存在于服務(wù)的內(nèi)存中,不會(huì)修改Apollo中的配置值剪况,重啟后恢復(fù)原來(lái)的值教沾。
- Nacos控制臺(tái)中修改規(guī)則:服務(wù)的內(nèi)存中規(guī)則會(huì)更新,Apollo中持久化規(guī)則也會(huì)更新译断,重啟后依然保持授翻。
代碼示例
本文介紹內(nèi)容的客戶端代碼,示例讀者可以通過(guò)查看下面?zhèn)}庫(kù)中的alibaba-sentinel-datasource-apollo
項(xiàng)目:
- Github:https://github.com/dyc87112/SpringCloud-Learning/
- Gitee:https://gitee.com/didispace/SpringCloud-Learning/
如果您對(duì)這些感興趣孙咪,歡迎star堪唐、follow、收藏该贾、轉(zhuǎn)發(fā)給予支持!
參考資料
下面是Sentinel的倉(cāng)庫(kù)地址與官方文檔捌臊,讀者也可以自己查閱文檔學(xué)習(xí):
系列回顧
- 《Spring Cloud Alibaba基礎(chǔ)教程:使用Nacos實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn)》
- 《Spring Cloud Alibaba基礎(chǔ)教程:支持的幾種服務(wù)消費(fèi)方式》
- 《Spring Cloud Alibaba基礎(chǔ)教程:使用Nacos作為配置中心》
- 《Spring Cloud Alibaba基礎(chǔ)教程:Nacos配置的加載規(guī)則詳解》
- 《Spring Cloud Alibaba基礎(chǔ)教程:Nacos配置的多環(huán)境管理》
- 《Spring Cloud Alibaba基礎(chǔ)教程:Nacos配置的多文件加載與共享配置》
- 《Spring Cloud Alibaba基礎(chǔ)教程:Nacos的數(shù)據(jù)持久化》
- 《Spring Cloud Alibaba基礎(chǔ)教程:Nacos的集群部署》
- 《Spring Cloud Alibaba基礎(chǔ)教程:使用Sentinel實(shí)現(xiàn)接口限流》
- 《Spring Cloud Alibaba基礎(chǔ)教程:Sentinel使用Nacos存儲(chǔ)規(guī)則》
- 《Spring Cloud Alibaba基礎(chǔ)教程:Sentinel使用Apollo存儲(chǔ)規(guī)則》