Sentinel+Nacos持久化
有關Sentinel之前有寫過兩篇
Spring Cloud Alibaba(9)---Sentinel概述
Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba
這篇部落客要講 Sentinel+Nacos持久化 有關Sentinel其它的知識點我這邊就不在講了 自己去官網詳細看。
一、Sentinel+持久化原理
1、為什麼需要持久化
前面我們搭建過Nacos + Mysql持久化,因為Nacos預設是将配置資料寫在記憶體中的,是以當Nacos一重新開機,所有配置資訊都會丢失。同樣的原因。Sentinel預設也是将規則推送至
用戶端并直接更新到記憶體中,是以用戶端一重新開機,規則即消失。在生産環境肯定是需要持久化配置它。
2、官方配置持久化的方式
官方文檔 在生産環境中使用 Sentinel
官方給出了兩種方式:
Pull模式
和
Push模式
1)、Pull模式
說明
pull 模式的資料源(如本地檔案、RDBMS 等)一般是可寫入的。 用戶端主動向某個規則管理中心(如本地檔案、RDBMS 等)定期輪詢拉取規則。我們既可以在應用本地直接
修改檔案來更新規則,也可以通過 Sentinel 控制台推送規則。以本地檔案資料源為例,推送過程如下圖所示:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISM9AnYldnJwAzN9c3PnBnauQ0MlQ0MlcnW3BXbMJTRU5UeRR1T0kkaNhHM51kMVR1TxMGVNdXRq1EeVRUT4lERNlHM55EeZRUT1EEVNZXVE1EeJRUT5hTeOhXWE1UNBRVT2NmMiNnSywEd5ITW110MaZHetlVdO1GT3lERNl3YXJGc5kHT20ESjBjUIF2Lc12bj5SYphXa5VWen5WY35iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
首先 Sentinel 控制台通過 API 将規則推送至用戶端并更新到記憶體中,接着注冊的寫資料源會将新的規則儲存到本地的檔案中。使用 pull 模式的資料源時一般不需要對 Sentinel
控制台進行改造。
優點:簡單,無任何依賴;規則持久化
缺點:不保證一緻性(無法保證同步);實時性不保證(畢竟是輪詢),拉取過于頻繁也可能會有性能問題。
2)、Push模式
規則中心統一推送,用戶端通過注冊監聽器的方式時刻監聽變化,比如使用 Nacos、Zookeeper 等配置中心。這種方式有更好的實時性和一緻性保證。
生産環境下一般采用 push 模式的資料源。
同時官方也建議,推送的操作不應由 Sentinel 用戶端進行,而應該經控制台統一進行管理,直接進行推送,資料源僅負責擷取配置中心推送的配置并更新到本地。是以推送規則正确
做法應該是 配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 資料源 → Sentinel,而不是經 Sentinel 資料源推送至配置中心。這樣的流程就非常清晰了:
優點:規則持久化;一緻性;快速
缺點:引入第三方依賴
二、Sentinel+Nacos持久化配置
1、pom.xml
之前有關Sentinel和Nacos相關jar包已經添加過 ,是以隻添加需要Sentinel和Nacos整合的包。
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
2、bootstrap.yml
# Spring
spring:
application: # 應用名稱
name: mall-goods
profiles: # 環境配置
active: dev
cloud:
nacos:
discovery:
# 服務注冊位址
server-addr: 127.0.0.1:8848
config:
# 配置中心位址
server-addr: 127.0.0.1:8848
# 配置檔案格式
file-extension: yml
sentinel:
# 取消控制台懶加載
eager: true
transport:
# 控制台位址
dashboard: 127.0.0.1:8282
# nacos配置持久化
datasource:
ds1:
nacos:
server-addr: 127.0.0.1:8848
dataId: ${spring.application.name}-SENTINEL.json
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
3、Naocs控制台添加配置
因為上面配置的 dataId: ${spring.application.name}-SENTINEL.json,是以這裡在Nacos建立該 mall-goods-SENTINEL.json 配置集
然後在配置集中添加配置
[
{
"resource": "/api/v1/sentinel/test-sentinel",
"limitApp": "default",
"grade": "1",
"count": "5",
"strategy": "0",
"controlBehavior": "0",
"clusterMode": false
}
]
相關屬性說明
resource:資源名稱
limitApp:來源應用
grade:閥值類型,0:線程數,1:QPS
count:單機閥值
strategy:流控模式,0:直接,1:關聯,2:鍊路
controlBehavior:流控效果,0:快速失敗,1:warmUp,2:排隊等待
clusterMode:是否叢集
4、檢視Sentinel控制台
以上都配置好後,我們啟動Sentinel就可以看到 ,上面的這個限流規則已經在Sentinel控制台了,是以我們在Nacos配置的限流規則,已經推送到了Sentinel控制台。因為我們
Naocs已經通過Mysql進行持久化是以配置的這個限流規則,會永遠存在,不會因為重新開機而丢失,這樣就保證了規則的持久化。
5、補充
1)、其實如果以上都配置好後,我們發現如果我們在Sentinel控制台配置一條限流規則,這個限流規則不會主動推送到Nacos。是以我們每次需要在Nacos配置規則然後會推送到
Sentinel。但是Nacos中的規則需要我們手動添加,這樣很不友善。我們希望做到當然是我們是在Sentinel控制台添加熔斷規則,自動将熔斷規則推送到Nacos資料源。這樣當然也是
可以的。這樣的話改動的會多點,這裡就不做示範了 具體可以網上找找。
2)、這裡隻示範了一個限流規則,如果你要添加熔斷規則等等其它規則,一樣也是可以的。
github位址
nacos-feign-sentinel
少說多做,句句都會得到别人的重視;多說少做,句句都會受到别人的忽視。(10)