規則持久化
現在我們配置的規則實際上是在內存中的,如果客戶端應用配置中有控制台(dashboard),當流量經過客戶端的時候,會把規則同步給控制台;同樣當在控制台配置規則后,也會把規則推送給相應的客戶端。規則都是存放在兩邊的內存中,一旦控制台或客戶端重啟,內存中的規則就消失了。如下圖:
我們需要一個遠程的配置中心,將規則都存放在里面,如下圖,當控制台有規則變化時,將規則推送到遠程配置中心進行持久化,如果遠程配置中心有規則變化,可以推送給客戶端,這樣的話,不管是客戶端還是控制台重啟,都不會丟掉現有的規則配置。
遠程配置中心支持的組件有很多,如:ZooKeeper 、Nacos 、Apollo 等,這里我們使用ZooKeeper 作為配置中心。
1.1、准備zookeeper,下載連接http://mirror.bit.edu.cn/apache/zookeeper/stable/
1.2、改造控制台
1.2.1、下載或克隆Sentinel項目到本地 https://github.com/alibaba/Sentinel/tree/release-1.7 ,通過IDE打開sentinel-dashboard項目
1.2.2、將pom中的zookeeper客戶端curator依賴的scope去掉
1.2.3、將test\java\com\alibaba\csp\sentinel\dashboard\rule\zookeeper移動到\main\java\com\alibaba\csp\sentinel\dashboard\rule下
1.2.4、將com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2中的DynamicRuleProvider、DynamicRulePublisher 引用的名字修改為zookeeper的
1.2.5、將sidebar.html中的dashboard.flowV1改為dashboard.flow
1.2.6、如果需改端口,或登陸的用戶名和密碼可以在application.properties中進行修改
1.3、改造客戶端
1.3.1、客戶端pom添加配置數據源依賴sentinel-datasource-zookeeper,因為spring-cloud-starter-alibaba-sentinel中的sentinel為1.5.2,這是使用一樣的
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-zookeeper</artifactId> <version>1.5.2</version> </dependency>
/** * 從遠程配置中心獲取規則,進行配置 * * @author caofanqi * @date 2020/2/11 15:50 */ @Component public class SentinelConfig{ @Value("${sentinel.zookeeper.address}") private String remoteAddress; @Value("${sentinel.zookeeper.path}") private String path; @Value("${spring.application.name}") private String appName; @PostConstruct public void loadRules(){ //流控規則數據源 ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new ZookeeperDataSource<>(remoteAddress, path + "/" + appName, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {})); FlowRuleManager.register2Property(flowRuleDataSource.getProperty()); //.... } }
1.4、測試
1.4.1、啟動認證服務器、zk,sentinel控制台、客戶端order服務,給order服務訪問流量,登陸sentinel客戶端,為createOrder設置流控規則
1.4.2、通過zk客戶端可以看到,規則已經持久化進去了
1.4.3、重啟sentinel控制台、客戶端order服務,快速訪問創建訂單,流控生效
1.4.5、打開sentinel控制台,也可看到規則還在。
注意:以上,只實現了流控規則的持久化。例如降級規則、系統規則、熱點規則等,都需要使用類似的方式,修改 com.alibaba.csp.sentinel.dashboard.controller
包中對應的Controller,才能實現持久化。
項目源碼:https://github.com/caofanqi/study-security/tree/dev-sentinel4