Spring中的Sentinel規(guī)則持久化解析
前言
本文小新為大家?guī)?Sentinel規(guī)則持久化 相關(guān)知識,具體內(nèi)容包括, Sentinel規(guī)則推送三種模式 介紹,包括: 原始模式 , 拉模式 , 推模式 ,并對 基于Nacos配置中心控制臺實(shí)現(xiàn)推送 進(jìn)行詳盡介紹~
Sentinel規(guī)則的推送有下面三種模式:
| 推送模式 | 說明 | 優(yōu)點(diǎn) | 缺點(diǎn) |
| 原始模式 | API 將規(guī)則推送至客戶端并直接更新到內(nèi)存中,擴(kuò)展寫數(shù)據(jù)源(WritableDataSource) | 簡單,無任何依賴 | 不保證一致性;規(guī)則保存在內(nèi)存中,重啟即消失。嚴(yán)重不建議用于生產(chǎn)環(huán)境 |
| Pull 模式 | 擴(kuò)展寫數(shù)據(jù)源(WritableDataSource), 客戶端主動向某個(gè)規(guī)則管理中心定期輪詢拉取規(guī)則,這個(gè)規(guī)則中心可以是 RDBMS、文件 等 | 簡單,無任何依賴;規(guī)則持久化 | 不保證一致性;實(shí)時(shí)性不保證,拉取過于頻繁也可能會有性能問題。 |
| Push 模式 | 擴(kuò)展讀數(shù)據(jù)源(ReadableDataSource),規(guī)則中心統(tǒng)一推送,客戶端通過注冊監(jiān)聽器的方式時(shí)刻監(jiān)聽變化,比如使用 Nacos,Zookeeper 等配置中心。這種方式有更好的實(shí)時(shí)性和一致性保證。生產(chǎn)環(huán)境下一般采用 push 模式的數(shù)據(jù)源。 | 規(guī)則持久化;一致性;快速 | 引入第三方依賴 |
一、原始模式
如果不做任何修改,Dashboard 的推送規(guī)則方式是通過 API 將規(guī)則推送至客戶端并直接更 新到內(nèi)存中:

這種做法的好處是簡單,無依賴;壞處是應(yīng)用重啟規(guī)則就會消失,僅用于簡單測試,不能 用于生產(chǎn)環(huán)境。
二、拉模式
pull 模式的數(shù)據(jù)源(如本地文件、RDBMS 等)一般是可寫入的。使用時(shí)需要在客戶端注冊數(shù)據(jù)源:將對應(yīng)的讀數(shù)據(jù)源注冊至對應(yīng)的 RuleManager,將寫數(shù)據(jù)源注冊至 transport 的 WritableDataSourceRegistry 中。
三、推模式
生產(chǎn)環(huán)境下一般更常用的是 push 模式的數(shù)據(jù)源。對于 push 模式的數(shù)據(jù)源,如遠(yuǎn)程配置中心 (ZooKeeper, Nacos, Apollo等等),推送的操作不應(yīng)由 Sentinel 客戶端進(jìn)行,而應(yīng)該經(jīng)控 制臺統(tǒng)一進(jìn)行管理,直接進(jìn)行推送,數(shù)據(jù)源僅負(fù)責(zé)獲取配置中心推送的配置并更新到本 地。
因此推送規(guī)則正確做法應(yīng)該是: 配置中心控制臺/Sentinel 控制臺 → 配置中心 →Sentinel 數(shù)據(jù)源 → Sentinel
而不是經(jīng) Sentinel 數(shù)據(jù)源推送至配置中心。這樣的流程就非常清晰了。
基于Nacos配置中心控制臺實(shí)現(xiàn)推送:
官方demo: sentineldemonacosdatasource
(1)引入依賴
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel‐datasource‐nacos</artifactId> </dependency>
(2)nacos配置中心中配置流控規(guī)則
[
{
"resource": "TestResource",
"controlBehavior": 0,
"count": 10.0,
"grade": 1,
"limitApp": "default",
"strategy": 0
}
]
(3)application.yml中進(jìn)行配置
spring:
application:
name: mall‐user‐sentinel‐demo
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
sentinel:
transport:
# 添加sentinel的控制臺地址
dashboard: 127.0.0.1:8080
# 指定應(yīng)用與Sentinel控制臺交互的端口,應(yīng)用本地會起一個(gè)該端口占用的HttpServer
port: 8719
datasource:
ds1:
nacos:
server‐addr: 127.0.0.1:8848
dataId: ${spring.application.name}
groupId: DEFAULT_GROUP
data‐type: json
rule‐type: flow(4)nacos配置中心中添加
[
{
"resource": "userinfo",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
引入依賴:
<!‐‐sentinel持久化 采用 Nacos 作為規(guī)則配置數(shù)據(jù)源‐‐> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel‐datasource‐nacos</artifactId> </dependency>
增加application.yml配置:
server:
port: 8806
spring:
application:
name: mall‐user‐sentinel‐rule‐push‐demo #微服務(wù)名稱
#配置nacos注冊中心地址
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
sentinel:
transport:
# 添加sentinel的控制臺地址
dashboard: 127.0.0.1:8080
# 指定應(yīng)用與Sentinel控制臺交互的端口,應(yīng)用本地會起一個(gè)該端口占用的HttpServer
#port: 8719
datasource:
# ds1: #名稱自定義,唯一
# nacos:
# server‐addr: 127.0.0.1:8848
# dataId: ${spring.application.name}
# groupId: DEFAULT_GROUP
# data‐type: json
# rule‐type: flow
flow‐rules:
nacos:
server‐addr: 127.0.0.1:8848
dataId: ${spring.application.name}‐flow‐rules
groupId: SENTINEL_GROUP # 注意groupId對應(yīng)Sentinel Dashboard中的定義
data‐type: json
rule‐type: flow
degrade‐rules:
nacos:
server‐addr: 127.0.0.1:8848
dataId: ${spring.application.name}‐degrade‐rules
groupId: SENTINEL_GROUP
data‐type: json
rule‐type: degrade
param‐flow‐rules:
nacos:
server‐addr: 127.0.0.1:8848
dataId: ${spring.application.name}‐param‐flow‐rules
groupId: SENTINEL_GROUP
data‐type: json
rule‐type: param‐flow
authority‐rules:
nacos:
server‐addr: 127.0.0.1:8848
dataId: ${spring.application.name}‐authority‐rules
groupId: SENTINEL_GROUP
data‐type: json
rule‐type: authority
system‐rules:
nacos:
server‐addr: 127.0.0.1:8848
dataId: ${spring.application.name}‐system‐rules
groupId: SENTINEL_GROUP
data‐type: json
rule‐type: system以流控規(guī)則測試,當(dāng)在sentinel dashboard配置了流控規(guī)則,會在nacos配置中心生成對應(yīng) 的配置。

到此這篇關(guān)于Spring中的Sentinel規(guī)則持久化解析的文章就介紹到這了,更多相關(guān)Sentinel規(guī)則持久化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用異步線程池實(shí)現(xiàn)生產(chǎn)環(huán)境批量數(shù)據(jù)推送
本文主要介紹了SpringBoot使用異步線程池實(shí)現(xiàn)生產(chǎn)環(huán)境批量數(shù)據(jù)推送,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用
這篇文章主要給大家介紹了關(guān)于spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Java使用split分割無效獲取不到預(yù)期效果的解決辦法
這篇文章主要給大家介紹了關(guān)于Java使用split分割無效獲取不到預(yù)期效果的解決辦法,java的String類中有個(gè)split方法,這個(gè)是我們經(jīng)常使用到的,需要的朋友可以參考下2023-08-08
使用GSON庫轉(zhuǎn)換Java對象為JSON對象的進(jìn)階實(shí)例詳解
這篇文章主要介紹了使用GSON庫轉(zhuǎn)換Java對象為JSON對象的進(jìn)階實(shí)例詳解,包括注冊TypeAdapter及處理Enum類型等實(shí)際運(yùn)用中可能遇到的一些復(fù)雜問題,需要的朋友可以參考下2016-06-06
JSON字符串轉(zhuǎn)成java的Map對象詳細(xì)步驟
這篇文章主要介紹了如何將JSON字符串轉(zhuǎn)換為Java對象的步驟,包括定義Element類、使用Jackson庫解析JSON和添加依賴,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
Java內(nèi)部類應(yīng)用之靜態(tài)內(nèi)部類應(yīng)用示例
這篇文章主要介紹了Java內(nèi)部類應(yīng)用之靜態(tài)內(nèi)部類應(yīng)用,結(jié)合實(shí)例形式分析了Java靜態(tài)內(nèi)部類的原理、功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09

