前一篇文章中我們已經完成了Sentinel限流的一個程序,通過Dashboard進行Sentinel的限流配置。不知道大家有沒有發現我們在使用Sentinel Dashboard的時候它本身是沒有數據庫的。所以它在重啓之後就會丟失我們配置的限流等規則。所以我們需要把限流的規則持久化一下。
在之前我們都會通過配置文件來管理相關的配置信息,但是我們之前已經用Nacos實現了集中化的配置管理。所以,這次我們也同樣使用Nacos來實現Sentinel規則的配置管理。
Nacos管理Sentinel限流規則
我們本次會用到Nacos與SentinelDashboard,所以首先保證兩個服務都處於啓動狀態。
集成依賴
pom修改配置
<dependencies>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
對比上一篇增加了nacos的datasource。用以支持在nacos中配置限流規則。
修改配置文件application.properties
server.port=8999
spring.application.name=sentinel-nacos-conf
# sentinel.dashboard配置
spring.cloud.sentinel.transport.dashboard=localhost:8080
# nacos配置
spring.cloud.sentinel.datasource.flow.nacos.server-addr=localhost:8848
# dataid
spring.cloud.sentinel.datasource.flow.nacos.data-id=${spring.application.name}-sentinel-flow
spring.cloud.sentinel.datasource.flow.nacos.group-id=DEFAULT_GROUP
# 定義存儲規則的枚舉
spring.cloud.sentinel.datasource.flow.nacos.rule-type=flow
創建啓動類與Rest接口
-
SentinelNacosConfApplication.java
public class SentinelNacosConfApplication {
public static void main(String[] args) {
SpringApplication.run(SentinelNacosConfApplication.class,args);
}
}
-
SentinelHelloController.java
@RestController
@RequestMapping(value = "sentinel")
public class SentinelHelloController {
private Logger LOG = LoggerFactory.getLogger(this.getClass());
@RequestMapping(value = "hello",method = RequestMethod.GET)
public String hello(){
return "CainGao";
}
}
Nacos配置
Nacos增加Sentinel配置文件
nacos增加配置,基於 dataId 可以看到需要增加的配置名稱爲 sentinel-nacos-conf-sentinel-flow。配置內容爲:
[
{
"resource": "/sentinel/hello",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
參數 | 解釋 |
---|---|
resource | 表示需要進行限流的資源 |
limitApp | 流控針對的來源,default表示不區分來源 |
grade | 限流閾值類型(QPS:0,併發線程數:1) |
count | 限流的閾值 |
strategy | 判斷根據資源本身還是其他資源,默認爲資源本身 |
controlBehavior | 攔截後的策略(0:直接拒絕/1:排隊等待/2:勻速等待) |
clusterModel | 是否爲集羣模式 |
設置完成後我們啓動應用,當應用啓動完成後進入Sentinel控制檯就會發現規則已經設置到了Sentinel Dashboard中。
可以看到流控規則已經寫入成功。
進行應用測試
總結
我們可以通過Nacos進行動態的管理Sentinel的各種規則,畢竟基於我們的場景來說更加希望配置能夠統一的進行管理。當然各種前期的約定就需要設計很多了。例如各種策略的配置名稱,畢竟是希望能夠讓所有人都能直接的基於約定來實現配置。不要出現 例如 我設置爲 {spring.application.name}-sentinel-flow,另外一個同事直接設置爲 {spring.application.name}-flow。
本文分享自微信公衆號 - 指尖數蟲(zhijianshuchong)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。