點擊藍色「程序猿DD」關注我喲
加個「星標」,不忘籤到哦
上一篇我們介紹了如何通過Nacos的配置功能來存儲限流規則。Apollo是國內用戶非常多的配置中心,所以,今天我們繼續說說Spring Cloud Alibaba Sentinel中如何將流控規則存儲在Apollo中。
使用Apollo存儲限流規則Sentinel自身就支持了多種不同的數據源來持久化規則配置,目前包括以下幾種方式:
本文我們就來一起動手嘗試一下,如何使用Apollo來存儲限流規則。
準備工作下面我們將同時使用到 Apollo和 SentinelDashboard,所以可以先把 Apollo和 SentinelDashboard啟動起來。
如果還沒入門 SentinelDashboard可以通過文末的系列目錄先學習之前的內容。Apollo的話相對複雜一些,這裡不做詳細介紹了,如果還沒有接觸過Apollo的讀者可以查看其官方文檔進一步學習。
應用配置第一步:在Spring Cloud應用的 pom.xml中引入Spring Cloud Alibaba的Sentinel模塊和Apollo存儲擴展:
<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應用中配置的服務信息,在 resource目錄下,創建 apollo-env.properties文件,內容樣例:
local.meta=http://192.168.0.201:8080
dev.meta=http://192.168.0.202:8080
這裡需要了解Apollo對多環境的配置,這裡設置的是每個環境不同的配置服務地址,讀者需要根據自己的實際情況修改。
第三步:在Spring Cloud應用中添加配置信息:
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中的創建的項目名稱,這裡採用 spring.application.name參數的引用,從而達到服務名與配置項目名一致的效果
spring.cloud.sentinel.transport.dashboard:sentinel dashboard的訪問地址,根據上面準備工作中啟動的實例配置
spring.cloud.sentinel.datasource.ds.apollo.namespaceName:Apollo的空間名
spring.cloud.sentinel.datasource.ds.apollo.flowRulesKey:配置規則的key名稱
關於Apollo相關配置的對應關係可見下圖所示:
第四步:創建應用主類,並提供一個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中配置限流規則,具體可見第三步的截圖中的樣子。其中,key值的內容是下面的json
[
{
"resource": "/hello",
"limitApp": "default",
"grade": 1,
"count": 5,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
可以看到上面配置規則是一個數組類型,數組中的每個對象是針對每一個保護資源的配置對象,每個對象中的屬性解釋如下:
resource:資源名,即限流規則的作用對象
limitApp:流控針對的調用來源,若為 default 則不區分調用來源
grade:限流閾值類型(QPS 或並發線程數);0代表根據並發數量來限流, 1代表根據QPS來進行流量控制
count:限流閾值
strategy:調用關係限流策略
controlBehavior:流量控制效果(直接拒絕、Warm Up、勻速排隊)
clusterMode:是否為集群模式
這裡我們只做簡單的配置解釋,以便於理解這裡的配置作用。實際上這裡還有非常多可配置選項和規則,更複雜的配置後面我們單獨開一篇來深入學習。
第六步:啟動應用。如果一些順利,可以看到類似下面的日誌,代表已經成功從Nacos加載了一條限流規則:
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
通過postman或者curl訪問幾下 localhost:8002/hello接口:
$ curl localhost:8002/hello
didispace.com
此時,在Sentinel Dashboard中就可以看到當前我們啟動的 sentinel-datasource-apollo服務。點擊左側菜單中的流控規則,可以看到已經存在一條記錄了,這條記錄就是上面我們在Apollo中配置的限流規則。
深入思考在使用Apollo存儲規則配置的時候與Nacos存儲一樣,對於Sentinel控制臺這些數據是只讀的,也就是說:
代碼示例本文介紹內容的客戶端代碼,示例讀者可以通過查看下面倉庫中的 alibaba-sentinel-datasource-apollo項目:
如果您對這些感興趣,歡迎star、follow、收藏、轉發給予支持!
參考資料下面是Sentinel的倉庫地址與官方文檔,讀者也可以自己查閱文檔學習:
系列回顧推薦閱讀:
號外:最近整理了之前編寫的一系列內容做成了PDF,關注我並回復相應口令獲取:
- 001 :領取《Spring Boot基礎教程》
- 002 :領取《Spring Cloud基礎教程》
「自律到極致 - 人生才精緻:第4期」正在籌備中
關注我,加個星標,不忘籤到哦~
2019
與大家聊聊技術人的斜槓生活