天天看點

Spring Cloud Alibaba(4)Sentinel使用nacos對存儲規則持久化 帶源碼

目錄

背景

源碼位址

博文參考:

持久化支援方式

 整合nacos存儲規則

sentinel規則修改

背景

spring cloud微服務應用sentinel做限流,每次sentinel dashboard服務重新開機後,限流的規則丢失,這裡就需要對限流規則作持久化處理。

源碼位址

https://gitee.com/acelee723/acelee-alibaba-sentinel-nacos

博文參考:

http://blog.didispace.com/spring-cloud-alibaba-sentinel-2-1/

持久化支援方式

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

 整合nacos存儲規則

1.啟動Nacos、Sentinel Dashboard,對應通路位址如下:

  • Nacos:http://localhost:8848/nacos/
  • Sentinel Dashboard:http://localhost:8080/

2.建立一個spring boot項目acelee-alibaba-sentinel-nacos,在pom.xml檔案裡添加sentinel、nacos依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.aceleeyy</groupId>
    <artifactId>acelee-alibaba-sentinel-nacos</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>acelee-alibaba-sentinel-nacos</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <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>
            <version>0.9.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.6.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
           

3.在application.properties裡添加sentinel、nacos配置 

  • spring.cloud.sentinel.transport.dashboard

    :sentinel dashboard的通路位址,根據上面準備工作中啟動的執行個體配置
  • spring.cloud.sentinel.datasource.ds.nacos.server-addr

    :nacos的通路位址,,根據上面準備工作中啟動的執行個體配置
  • spring.cloud.sentinel.datasource.ds.nacos.groupId

    :nacos中存儲規則的groupId
  • spring.cloud.sentinel.datasource.ds.nacos.dataId

    :nacos中存儲規則的dataId
  • spring.cloud.sentinel.datasource.ds.nacos.rule-type

    :該參數是spring cloud alibaba更新到0.2.2之後增加的配置,用來定義存儲的規則類型。所有的規則類型可檢視枚舉類:

    org.springframework.cloud.alibaba.sentinel.datasource.RuleType

    ,每種規則的定義格式可以通過各枚舉值中定義的規則對象來檢視,比如限流規則可檢視:

    com.alibaba.csp.sentinel.slots.block.flow.FlowRule

這裡對于dataId使用了

${spring.application.name}

變量,這樣可以根據應用名來區分不同的規則配置。

注意:由于版本疊代關系,Github Wiki中的文檔資訊不一定适用所有版本。比如:在這裡适用的0.2.1版本中,并沒有

spring.cloud.sentinel.datasource.ds2.nacos.rule-type

這個參數。是以,讀者在使用的時候,可以通過檢視

org.springframework.cloud.alibaba.sentinel.datasource.config.DataSourcePropertiesConfiguration

org.springframework.cloud.alibaba.sentinel.datasource.config.NacosDataSourceProperties

兩個類來分析具體的配置内容,會更為準确。
spring.application.name=acelee-alibaba-sentinel-nacos
server.port=8003

# sentinel dashboard
spring.cloud.sentinel.transport.dashboard=localhost:8080

# sentinel datasource nacos :http://blog.didispace.com/spring-cloud-alibaba-sentinel-2-1/
spring.cloud.sentinel.datasource.ds.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds.nacos.dataId=${spring.application.name}-sentinel
spring.cloud.sentinel.datasource.ds.nacos.groupId=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds.nacos.rule-type=flow
           

4.建立controller包,在包裡建立HelloController.java類,增加hello接口

package com.aceleeyy.aceleealibabasentinelnacos.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "aceleeyy.com";
    }

}
           

5.Nacos裡配置清單頁面建立配置,配置限流規則

Spring Cloud Alibaba(4)Sentinel使用nacos對存儲規則持久化 帶源碼
  • 1)Data ID

    就是上面application.properties中配置對應的nacos.dataId
  • 2)

    Group

    就是上面application.properties中配置對應的nacos.groupId
  • 3)配置格式選擇JSON
  • 4)并在配置内容中填入下面的内容:
[
    {
        "resource": "/hello",
        "limitApp": "default",
        "grade": 1,
        "count": 5,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]
           
 可以看到上面配置規則是一個數組類型,數組中的每個對象是針對每一個保護資源的配置對象,每個對象中的屬性解釋如下:
  • resource:資源名,即限流規則的作用對象
  • limitApp:流控針對的調用來源,若為 default 則不區分調用來源
  • grade:限流門檻值類型(QPS 或并發線程數); 代表根據并發數量來限流,

    1

    代表根據QPS來進行流量控制
  • count:限流門檻值
  • strategy:調用關系限流政策
  • controlBehavior:流量控制效果(直接拒絕、Warm Up、勻速排隊)
  • clusterMode:是否為叢集模式
這裡我們隻做簡單的配置解釋,以便于了解這裡的配置作用。實際上這裡還有非常多可配置選項和規則,更複雜的配置後面我們一起來學習。

6.點選釋出按鈕,可以看到nacos配置清單多了一條記錄

Spring Cloud Alibaba(4)Sentinel使用nacos對存儲規則持久化 帶源碼

7.啟動項目,如果一切順利,可以看到控制台列印如下日志,證明sentinel的限流規則從nacos中擷取,且對/hello接口作了qps為5的限流

Spring Cloud Alibaba(4)Sentinel使用nacos對存儲規則持久化 帶源碼

  8.通路http://localhost:8003/hello ,傳回:aceleeyy.com

Spring Cloud Alibaba(4)Sentinel使用nacos對存儲規則持久化 帶源碼

9.打開sentinel控制台,重新整理頁面,可以看到對/hello接口的實時監控,沒有的話,重新整理幾次/hello接口

Spring Cloud Alibaba(4)Sentinel使用nacos對存儲規則持久化 帶源碼

10。打開sentinel流控規則頁面,可以看到新增了一條限流記錄,配置值分别對應nacos裡的json資料配置

Spring Cloud Alibaba(4)Sentinel使用nacos對存儲規則持久化 帶源碼

11.驗證限流規則,多次調用/hello接口,在快速重新整理後傳回:

Blocked by Sentinel (flow limiting)
           

證明sentinel使用nacos對限流規則持久化成功

Spring Cloud Alibaba(4)Sentinel使用nacos對存儲規則持久化 帶源碼

sentinel規則修改

在完成了上面的整合之後,對于接口流控規則的修改就存在兩個地方了:Sentinel控制台、Nacos控制台。

這個時候,需要注意目前版本的Sentinel控制台不具備同步修改Nacos配置的能力,而Nacos由于可以通過在用戶端中使用Listener來實作自動更新。是以,在整合了Nacos做規則存儲之後,需要知道在下面兩個地方修改存在不同的效果:

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

歡迎關注部落客部落格,後期部落客會持續更新spring cloud alibaba 系列文章,敬請期待!