摘要:在之前的練習(xí)中,只要應(yīng)用重啟,就需要重新配置,這樣在我們實(shí)際的項(xiàng)目是非常不實(shí)用的,那么有沒有辦法把我們配置的規(guī)則保存下來呢答案是,那么接下來,給大家來介紹如何將規(guī)則持久化。重新啟動(dòng)測試效果添加流控規(guī)則查看同步的配置
在之前的練習(xí)中,只要應(yīng)用重啟,就需要重新配置,這樣在我們實(shí)際的項(xiàng)目是非常不實(shí)用的,那么有沒有辦法把我們配置的規(guī)則保存下來呢?答案是YES,那么接下來,給大家來介紹如何將Sentinel規(guī)則持久化。
Document: 傳送門
File Datasource(文件存儲(chǔ))
Pull 模式
Push 模式
Nacos configuration
Apollo
原理:
擴(kuò)展寫數(shù)據(jù)源(WritableDataSource), 客戶端主動(dòng)向某個(gè)規(guī)則管理中心定期輪詢拉取規(guī)則,這個(gè)規(guī)則中心可以是 RDBMS、文件 等
pull 模式的數(shù)據(jù)源(如本地文件、RDBMS 等)一般是可寫入的。使用時(shí)需要在客戶端注冊數(shù)據(jù)源:將對應(yīng)的讀數(shù)據(jù)源注冊至對應(yīng)的 RuleManager,將寫數(shù)據(jù)源注冊至 transport 的 WritableDataSourceRegistry 中。
過程如下:
Step 1: 添加配置
com.alibaba.csp sentinel-datasource-extension
Step 2: 編寫持久化代碼,實(shí)現(xiàn)com.alibaba.csp.sentinel.init.InitFunc
代碼參考自:傳送門
import com.alibaba.csp.sentinel.command.handler.ModifyParamFlowRulesCommandHandler; import com.alibaba.csp.sentinel.datasource.*; import com.alibaba.csp.sentinel.init.InitFunc; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager; import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager; import com.alibaba.csp.sentinel.slots.system.SystemRule; import com.alibaba.csp.sentinel.slots.system.SystemRuleManager; import com.alibaba.csp.sentinel.transport.util.WritableDataSourceRegistry; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import java.io.File; import java.io.IOException; import java.util.List; /** * FileDataSourceInit for : 自定義Sentinel存儲(chǔ)文件數(shù)據(jù)源加載類 * * @author Isaac.Zhang | 若初 * @since 2019/7/21 */ public class FileDataSourceInit implements InitFunc { @Override public void init() throws Exception { // TIPS: 如果你對這個(gè)路徑不喜歡,可修改為你喜歡的路徑 String ruleDir = System.getProperty("user.home") + "/sentinel/rules"; String flowRulePath = ruleDir + "/flow-rule.json"; String degradeRulePath = ruleDir + "/degrade-rule.json"; String systemRulePath = ruleDir + "/system-rule.json"; String authorityRulePath = ruleDir + "/authority-rule.json"; String hotParamFlowRulePath = ruleDir + "/param-flow-rule.json"; this.mkdirIfNotExits(ruleDir); this.createFileIfNotExits(flowRulePath); this.createFileIfNotExits(degradeRulePath); this.createFileIfNotExits(systemRulePath); this.createFileIfNotExits(authorityRulePath); this.createFileIfNotExits(hotParamFlowRulePath); // 流控規(guī)則 ReadableDataSource> flowRuleRDS = new FileRefreshableDataSource<>( flowRulePath, flowRuleListParser ); // 將可讀數(shù)據(jù)源注冊至FlowRuleManager // 這樣當(dāng)規(guī)則文件發(fā)生變化時(shí),就會(huì)更新規(guī)則到內(nèi)存 FlowRuleManager.register2Property(flowRuleRDS.getProperty()); WritableDataSource > flowRuleWDS = new FileWritableDataSource<>( flowRulePath, this::encodeJson ); // 將可寫數(shù)據(jù)源注冊至transport模塊的WritableDataSourceRegistry中 // 這樣收到控制臺(tái)推送的規(guī)則時(shí),Sentinel會(huì)先更新到內(nèi)存,然后將規(guī)則寫入到文件中 WritableDataSourceRegistry.registerFlowDataSource(flowRuleWDS); // 降級(jí)規(guī)則 ReadableDataSource
> degradeRuleRDS = new FileRefreshableDataSource<>( degradeRulePath, degradeRuleListParser ); DegradeRuleManager.register2Property(degradeRuleRDS.getProperty()); WritableDataSource > degradeRuleWDS = new FileWritableDataSource<>( degradeRulePath, this::encodeJson ); WritableDataSourceRegistry.registerDegradeDataSource(degradeRuleWDS); // 系統(tǒng)規(guī)則 ReadableDataSource
> systemRuleRDS = new FileRefreshableDataSource<>( systemRulePath, systemRuleListParser ); SystemRuleManager.register2Property(systemRuleRDS.getProperty()); WritableDataSource > systemRuleWDS = new FileWritableDataSource<>( systemRulePath, this::encodeJson ); WritableDataSourceRegistry.registerSystemDataSource(systemRuleWDS); // 授權(quán)規(guī)則 ReadableDataSource
> authorityRuleRDS = new FileRefreshableDataSource<>( flowRulePath, authorityRuleListParser ); AuthorityRuleManager.register2Property(authorityRuleRDS.getProperty()); WritableDataSource > authorityRuleWDS = new FileWritableDataSource<>( authorityRulePath, this::encodeJson ); WritableDataSourceRegistry.registerAuthorityDataSource(authorityRuleWDS); // 熱點(diǎn)參數(shù)規(guī)則 ReadableDataSource
> hotParamFlowRuleRDS = new FileRefreshableDataSource<>( hotParamFlowRulePath, hotParamFlowRuleListParser ); ParamFlowRuleManager.register2Property(hotParamFlowRuleRDS.getProperty()); WritableDataSource > paramFlowRuleWDS = new FileWritableDataSource<>( hotParamFlowRulePath, this::encodeJson ); ModifyParamFlowRulesCommandHandler.setWritableDataSource(paramFlowRuleWDS); } /** * 流控規(guī)則對象轉(zhuǎn)換 */ private Converter
> flowRuleListParser = source -> JSON.parseObject( source, new TypeReference >() { } ); /** * 降級(jí)規(guī)則對象轉(zhuǎn)換 */ private Converter
> degradeRuleListParser = source -> JSON.parseObject( source, new TypeReference >() { } ); /** * 系統(tǒng)規(guī)則對象轉(zhuǎn)換 */ private Converter
> systemRuleListParser = source -> JSON.parseObject( source, new TypeReference >() { } ); /** * 授權(quán)規(guī)則對象轉(zhuǎn)換 */ private Converter
> authorityRuleListParser = source -> JSON.parseObject( source, new TypeReference >() { } ); /** * 熱點(diǎn)規(guī)則對象轉(zhuǎn)換 */ private Converter
> hotParamFlowRuleListParser = source -> JSON.parseObject( source, new TypeReference >() { } ); /** * 創(chuàng)建目錄 * * @param filePath */ private void mkdirIfNotExits(String filePath) { File file = new File(filePath); if (!file.exists()) { file.mkdirs(); } } /** * 創(chuàng)建文件 * * @param filePath * @throws IOException */ private void createFileIfNotExits(String filePath) throws IOException { File file = new File(filePath); if (!file.exists()) { file.createNewFile(); } } private
String encodeJson(T t) { return JSON.toJSONString(t); } }
Step 3: 啟用上述代碼
resource 目錄下創(chuàng)建 resources/META-INF/services 目錄并創(chuàng)建文件com.alibaba.csp.sentinel.init.InitFunc ,內(nèi)容為:
com.sxzhongf.sharedcenter.configuration.sentinel.datasource.FileDataSourceInit
優(yōu)點(diǎn)
簡單,無任何依賴
沒有額外依賴
缺點(diǎn)
不保證一致性(規(guī)則是使用FileRefreshableDataSource定時(shí)更新,會(huì)有延遲)
實(shí)時(shí)性不保證(規(guī)則是使用FileRefreshableDataSource定時(shí)更新)
拉取過于頻繁也可能會(huì)有性能問題
由于文件存儲(chǔ)于本地,容易丟失
參考資料:
ITMUCH
Sentinel WIKI
推薦通過控制臺(tái)設(shè)置規(guī)則后將規(guī)則推送到統(tǒng)一的規(guī)則中心,客戶端實(shí)現(xiàn) ReadableDataSource接口端監(jiān)聽規(guī)則中心實(shí)時(shí)獲取變更,流程如下:
實(shí)現(xiàn)原理
控制臺(tái)推送規(guī)則到Nacos/遠(yuǎn)程配置中心
Sentinel client 艦艇Nacos配置變化,更新本地緩存
shared_center service 加工
添加依賴
com.alibaba.csp sentinel-datasource-nacos
添加配置
spring: cloud: sentinel: datasource: sxzhongf_flow: nacos: server-addr: localhost:8848 dataId: ${spring.application.name}-flow-rules groupId: SENTINEL_GROUP # 規(guī)則類型,取值見:org.springframework.cloud.alibaba.sentinel.datasource.RuleType rule_type: flow sxzhongf_degrade: nacos: server-addr: localhost:8848 dataId: ${spring.application.name}-degrade-rules groupId: SENTINEL_GROUP rule-type: degrade
Sentinel dashboard 加工
Dashboard 規(guī)則改造主要通過2個(gè)接口:
com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider & com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher
Download Sentinel Source Code
修改原sentinel-dashboard項(xiàng)目下的POM文件
com.alibaba.csp sentinel-datasource-nacos
偷懶模式:復(fù)制sentinel-dashboard項(xiàng)目下test下的nacos包(
src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos到 src/main/java/com/alibaba/csp/sentinel/dashboard/rule下
修改controller中的默認(rèn)provider & publisher
com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2中
@Autowired // @Qualifier("flowRuleDefaultProvider") @Qualifier("flowRuleNacosProvider") private DynamicRuleProvider> ruleProvider; @Autowired // @Qualifier("flowRuleDefaultPublisher") @Qualifier("flowRuleNacosPublisher") private DynamicRulePublisher
> rulePublisher;
打開 /Sentinel-1.6.2/sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html文件,修改代碼:
--- 改為
Dashboard中要修改的代碼已經(jīng)好了。
重新啟動(dòng) Sentinel-dashboard mvn clean package -DskipTests
測試效果
Sentinel 添加流控規(guī)則:
Nacos 查看同步的配置:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75534.html
摘要:前面我們都是直接通過集成的依賴,通過編碼的方式配置規(guī)則等。對于集成到中阿里已經(jīng)有了一套開源框架,就是用于將一系列的框架成功的整合到中。但這也是在學(xué)習(xí)過程中遇到的一個(gè)問題,還是得通過調(diào)試源碼的方式去發(fā)現(xiàn)問題的原因。 前面我們都是直接通過集成sentinel的依賴,通過編碼的方式配置規(guī)則等。對于集成到Spring Cloud中阿里已經(jīng)有了一套開源框架spring-cloud-alibaba...
摘要:開發(fā)階段很有意義。源碼整合配置文件中添加來開啟編寫類,實(shí)現(xiàn)默認(rèn)用戶遠(yuǎn)程調(diào)用被限流降級(jí),默認(rèn)用戶應(yīng)用定義可以拿到異常信息無法拿到異常信息若初啟動(dòng)應(yīng)用,設(shè)置流控規(guī)則,結(jié)果展示如下默認(rèn)用戶源碼 Sentinel API Github : WIKI Sphu (指明要保護(hù)的資源名稱) Tracer (指明調(diào)用來源,異常統(tǒng)計(jì)接口) ContextUtil(標(biāo)示進(jìn)入調(diào)用鏈入口) 流控規(guī)則(針...
摘要:介紹隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。以流量為切入點(diǎn),從流量控制熔斷降級(jí)系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。完備的實(shí)時(shí)監(jiān)控同時(shí)提供實(shí)時(shí)的監(jiān)控功能。您只需要引入相應(yīng)的依賴并進(jìn)行簡單的配置即可快速地接入。 Sentinel 介紹 隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。 Sentinel 以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度...
摘要:所以,在整合了做規(guī)則存儲(chǔ)之后,需要知道在下面兩個(gè)地方修改存在不同的效果控制臺(tái)中修改規(guī)則僅存在于服務(wù)的內(nèi)存中,不會(huì)修改中的配置值,重啟后恢復(fù)原來的值。控制臺(tái)中修改規(guī)則服務(wù)的內(nèi)存中規(guī)則會(huì)更新,中持久化規(guī)則也會(huì)更新,重啟后依然保持。 通過上一篇《使用Sentinel實(shí)現(xiàn)接口限流》的介紹,相信大家對Sentinel已經(jīng)有了初步的認(rèn)識(shí)。在Spring Cloud Alibaba的整合封裝之下,接...
摘要:改造背景前面我們講解了如何對接來持久化限流的規(guī)則,對接后可以直接通過的后臺(tái)進(jìn)行規(guī)則的修改,推送到各個(gè)客戶端實(shí)時(shí)生效。因此推送規(guī)則正確做法應(yīng)該是配置中心控制臺(tái)控制臺(tái)配置中心數(shù)據(jù)源,而不是經(jīng)數(shù)據(jù)源推送至配置中心。 改造背景 前面我們講解了如何對接Apollo來持久化限流的規(guī)則,對接后可以直接通過Apollo的后臺(tái)進(jìn)行規(guī)則的修改,推送到各個(gè)客戶端實(shí)時(shí)生效。 但還有一個(gè)問題就是Sentinel...
閱讀 2584·2021-11-25 09:43
閱讀 1858·2021-09-22 15:26
閱讀 3735·2019-08-30 15:56
閱讀 1712·2019-08-30 15:55
閱讀 1897·2019-08-30 15:54
閱讀 814·2019-08-30 15:52
閱讀 3156·2019-08-29 16:23
閱讀 895·2019-08-29 12:43