Sentinel Dashboard(控制檯)預設情況下,只能將設定規則儲存到記憶體中,這樣就會導致 Sentinel Dashboard 重啟後設定規則丟失的情況,因此我們需要將規則儲存到某種資料來源中,Sentinel 支援的資料來源有以下這些:
然而,預設情況下,Sentinel 和資料來源之間的關係是單向資料通訊的,也就是隻能先在資料來源中設定規則,然後資料來源會被規則推播至 Sentinel Dashboard 和 Sentinel 使用者端,但是在 Sentinel Dashboard 中修改規則或新增規則是不能反向同步到資料來源中的,這就是單向通訊。
所以,今天我們就該修改一下 Sentinel 的原始碼,讓其可以同步規則至資料來源,改造之後的互動流程如下圖所示:
Sentinel 同步規則至資料來源,例如將 Sentinel 的規則,同步規則至 Nacos 資料來源的改造步驟很多,但整體實現難度不大,下面我們一起來看吧。
下載地址:https://github.com/alibaba/Sentinel
PS:本文 Sentinel 使用的版本是 1.8.6。
下載原始碼之後,使用 idea 開啟裡面的 sentinel-dashboard 專案,如下圖所示:
將 sentinel-datasource-nacos 底下的 scope 註釋掉,如下圖所示:
PS:因為官方提供的 Nacos 持久化範例,是在 test 目錄下進行單元測試的,而我們是用於生產環境,所以需要將 scope 中的 test 去掉。
將 test/com.alibaba.csp.sentinel.dashboard.rule.nacos 下所有檔案複製到 src/main/java/com.alibaba.csp.sentinel.dashboard.rule 目錄下,如下圖所示:
在 com.alibaba.csp.sentinel.dashboard.rule 下建立 Nacos 組態檔的讀取類,實現程式碼如下:
package com.alibaba.csp.sentinel.dashboard.rule;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@ConfigurationProperties(prefix = "sentinel.nacos")
@Configuration
public class NacosPropertiesConfiguration {
private String serverAddr;
private String dataId;
private String groupId;
private String namespace;
private String username;
private String password;
// 省略 Getter/Setter 程式碼
}
只修改 NacosConfig 中的 nacosConfigService 方法,修改後的程式碼如下:
@Bean
public ConfigService nacosConfigService(NacosPropertiesConfiguration nacosPropertiesConfiguration) throws Exception {
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, nacosPropertiesConfiguration.getServerAddr());
properties.put(PropertyKeyConst.NAMESPACE, nacosPropertiesConfiguration.getNamespace());
properties.put(PropertyKeyConst.USERNAME,nacosPropertiesConfiguration.getUsername());
properties.put(PropertyKeyConst.PASSWORD,nacosPropertiesConfiguration.getPassword());
return ConfigFactory.createConfigService(properties);
// return ConfigFactory.createConfigService("localhost"); // 原始碼
}
修改 com.alibaba.csp.sentinel.dashboard.controller.v2 目錄下的 FlowControllerV2 檔案:
修改後程式碼:
@Autowired
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
PS:此操作的目的是開啟 Controller 層操作 Nacos 的開關。
如下圖所示:
在 application.properties 中設定 Nacos 連線資訊,設定如下:
sentinel.nacos.serverAddr=localhost:8848
sentinel.nacos.username=nacos
sentinel.nacos.password=nacos
sentinel.nacos.namespace=
sentinel.nacos.groupId=DEFAULT_GROUP
sentinel.nacos.dataId=sentinel-dashboard-demo-sentinel
修改 webapp/resources/app/scripts/directives/sidebar/sidebar.html 檔案:
搜尋「dashboard.flowV1」改為「dashboard.flow」,如下圖所示:
identity.js 檔案有兩處修改,它位於 webapp/resources/app/scripts/controllers/identity.js 目錄。
將「FlowServiceV1」修改為「FlowServiceV2」,如下圖所示:
搜尋「/dashboard/flow/」修改為「/dashboard/v2/flow/」,如下圖所示:
PS:修改 identity.js 檔案主要是用於在 Sentinel 點選資源的「流控」按鈕新增規則後將資訊同步給 Nacos。
Sentinel Dashboard 預設情況下,只能將設定規則儲存到記憶體中,這樣就會程式重啟後設定規則丟失的情況,因此我們需要給 Sentinel 設定一個資料來源,並且要和資料來源之間實現雙向通訊,所以我們需要修改 Sentinel 的原始碼。原始碼的改造步驟雖然很多,但只要逐一核對和修改就可以實現 Sentinel 生成環境的設定了。看完記得收藏哦,防止以後用的時候找不到。
本文已收錄到我的面試小站 www.javacn.site,其中包含的內容有:Redis、JVM、並行、並行、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、設計模式、訊息佇列等模組。