规则持久化

  现在我们配置的规则实际上是在内存中的,如果客户端应用配置中有控制台(dashboard),当流量经过客户端的时候,会把规则同步给控制台;同样当在控制台配置规则后,也会把规则推送给相应的客户端。规则都是存放在两边的内存中,一旦控制台或客户端重启,内存中的规则就消失了。如下图

微服务之间的通讯安全(八)-Sentinel入门之规则持久化_zookeeper

  我们需要一个远程的配置中心,将规则都存放在里面,如下图,当控制台有规则变化时,将规则推送到远程配置中心进行持久化,如果远程配置中心有规则变化,可以推送给客户端,这样的话,不管是客户端还是控制台重启,都不会丢掉现有的规则配置。

微服务之间的通讯安全(八)-Sentinel入门之规则持久化_zookeeper_02

远程配置中心支持的组件有很多,如: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去掉

微服务之间的通讯安全(八)-Sentinel入门之规则持久化_zookeeper_03

  1.2.3、将test\java\com\alibaba\csp\sentinel\dashboard\rule\zookeeper移动到\main\java\com\alibaba\csp\sentinel\dashboard\rule下

微服务之间的通讯安全(八)-Sentinel入门之规则持久化_客户端_04

  1.2.4、将com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2中的DynamicRuleProvider、DynamicRulePublisher 引用的名字修改为zookeeper的

微服务之间的通讯安全(八)-Sentinel入门之规则持久化_持久化_05

   1.2.5、将sidebar.html中的dashboard.flowV1改为dashboard.flow

微服务之间的通讯安全(八)-Sentinel入门之规则持久化_持久化_06

   1.2.6、如果需改端口,或登陆的用户名和密码可以在application.properties中进行修改

微服务之间的通讯安全(八)-Sentinel入门之规则持久化_zookeeper_07

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>


1.3.2、配置Sentinel从Zookeeper中获取配置。

 微服务之间的通讯安全(八)-Sentinel入门之规则持久化_持久化_08


/**
* 从远程配置中心获取规则,进行配置
*
* @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设置流控规则

微服务之间的通讯安全(八)-Sentinel入门之规则持久化_客户端_09

1.4.2、通过zk客户端可以看到,规则已经持久化进去了

微服务之间的通讯安全(八)-Sentinel入门之规则持久化_持久化_10

1.4.3、重启sentinel控制台、客户端order服务,快速访问创建订单,流控生效

微服务之间的通讯安全(八)-Sentinel入门之规则持久化_zookeeper_11

 1.4.5、打开sentinel控制台,也可看到规则还在。


注意:以上,只实现了流控规则的持久化。例如降级规则、系统规则、热点规则等,都需要使用类似的方式,修改 ​​com.alibaba.csp.sentinel.dashboard.controller​​ 包中对应的Controller,才能实现持久化。


项目源码:​​https://github.com/caofanqi/study-security/tree/dev-sentinel4​