Spring Cloud Alibaba基礎教程:Sentinel使用Apollo儲存規則

程式猿DD發表於2019-04-21

上一篇我們介紹瞭如何通過Nacos的配置功能來儲存限流規則。Apollo是國內使用者非常多的配置中心,所以,今天我們繼續說說Spring Cloud Alibaba Sentinel中如何將流控規則儲存在Apollo中。

使用Apollo儲存限流規則

Sentinel自身就支援了多種不同的資料來源來持久化規則配置,目前包括以下幾種方式:

本文我們就來一起動手嘗試一下,如何使用Apollo來儲存限流規則。

準備工作

下面我們將同時使用到ApolloSentinel Dashboard,所以可以先把ApolloSentinel Dashboard啟動起來。

如果還沒入門Sentinel Dashboard可以通過文末的系列目錄先學習之前的內容。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相關配置的對應關係可見下圖所示:

Spring Cloud Alibaba基礎教程:Sentinel使用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控制檯這些資料是隻讀的,也就是說:

  • Sentinel控制檯中修改規則:僅存在於服務的記憶體中,不會修改Apollo中的配置值,重啟後恢復原來的值。
  • Nacos控制檯中修改規則:服務的記憶體中規則會更新,Apollo中持久化規則也會更新,重啟後依然保持。

程式碼示例

本文介紹內容的客戶端程式碼,示例讀者可以通過檢視下面倉庫中的alibaba-sentinel-datasource-apollo專案:

如果您對這些感興趣,歡迎star、follow、收藏、轉發給予支援!

參考資料

下面是Sentinel的倉庫地址與官方文件,讀者也可以自己查閱文件學習:

專題推薦

相關文章