目錄
背景
源碼位址
博文參考:
持久化支援方式
整合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配置
這裡對于dataId使用了
:sentinel dashboard的通路位址,根據上面準備工作中啟動的執行個體配置
spring.cloud.sentinel.transport.dashboard
:nacos的通路位址,,根據上面準備工作中啟動的執行個體配置
spring.cloud.sentinel.datasource.ds.nacos.server-addr
:nacos中存儲規則的groupId
spring.cloud.sentinel.datasource.ds.nacos.groupId
:nacos中存儲規則的dataId
spring.cloud.sentinel.datasource.ds.nacos.dataId
:該參數是spring cloud alibaba更新到0.2.2之後增加的配置,用來定義存儲的規則類型。所有的規則類型可檢視枚舉類:
spring.cloud.sentinel.datasource.ds.nacos.rule-type
,每種規則的定義格式可以通過各枚舉值中定義的規則對象來檢視,比如限流規則可檢視:
org.springframework.cloud.alibaba.sentinel.datasource.RuleType
com.alibaba.csp.sentinel.slots.block.flow.FlowRule
${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裡配置清單頁面建立配置,配置限流規則
就是上面application.properties中配置對應的nacos.dataId
1)Data ID
- 2)
就是上面application.properties中配置對應的nacos.groupId
Group
- 3)配置格式選擇JSON
- 4)并在配置内容中填入下面的内容:
[
{
"resource": "/hello",
"limitApp": "default",
"grade": 1,
"count": 5,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
可以看到上面配置規則是一個數組類型,數組中的每個對象是針對每一個保護資源的配置對象,每個對象中的屬性解釋如下:這裡我們隻做簡單的配置解釋,以便于了解這裡的配置作用。實際上這裡還有非常多可配置選項和規則,更複雜的配置後面我們一起來學習。
- resource:資源名,即限流規則的作用對象
- limitApp:流控針對的調用來源,若為 default 則不區分調用來源
- grade:限流門檻值類型(QPS 或并發線程數); 代表根據并發數量來限流,
代表根據QPS來進行流量控制
1
- count:限流門檻值
- strategy:調用關系限流政策
- controlBehavior:流量控制效果(直接拒絕、Warm Up、勻速排隊)
- clusterMode:是否為叢集模式
6.點選釋出按鈕,可以看到nacos配置清單多了一條記錄
7.啟動項目,如果一切順利,可以看到控制台列印如下日志,證明sentinel的限流規則從nacos中擷取,且對/hello接口作了qps為5的限流
8.通路http://localhost:8003/hello ,傳回:aceleeyy.com
9.打開sentinel控制台,重新整理頁面,可以看到對/hello接口的實時監控,沒有的話,重新整理幾次/hello接口
10。打開sentinel流控規則頁面,可以看到新增了一條限流記錄,配置值分别對應nacos裡的json資料配置
11.驗證限流規則,多次調用/hello接口,在快速重新整理後傳回:
Blocked by Sentinel (flow limiting)
證明sentinel使用nacos對限流規則持久化成功
sentinel規則修改
在完成了上面的整合之後,對于接口流控規則的修改就存在兩個地方了:Sentinel控制台、Nacos控制台。
這個時候,需要注意目前版本的Sentinel控制台不具備同步修改Nacos配置的能力,而Nacos由于可以通過在用戶端中使用Listener來實作自動更新。是以,在整合了Nacos做規則存儲之後,需要知道在下面兩個地方修改存在不同的效果:
- Sentinel控制台中修改規則:僅存在于服務的記憶體中,不會修改Nacos中的配置值,重新開機後恢複原來的值。
- Nacos控制台中修改規則:服務的記憶體中規則會更新,Nacos中持久化規則也會更新,重新開機後依然保持。
歡迎關注部落客部落格,後期部落客會持續更新spring cloud alibaba 系列文章,敬請期待!