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

Posted caofanqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务之间的通讯安全-Sentinel入门之规则持久化相关的知识,希望对你有一定的参考价值。

规则持久化

  现在我们配置的规则实际上是在内存中的,如果客户端应用配置中有控制台(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、将testjavacomalibabacspsentineldashboard ulezookeeper移动到mainjavacomalibabacspsentineldashboard ule下

技术图片

  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>

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

 技术图片

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

以上是关于微服务之间的通讯安全-Sentinel入门之规则持久化的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud微服务安全实战_6-1_微服务之间的通讯安全之概述

Spring Cloud Alibaba之服务容错组件 - Sentinel [规则持久化篇]

spring cloud微服务快速教程之 Spring Cloud Alibaba--sentinel-限流熔断降级

微服务之间的通讯安全-JWT优化之日志错误处理限流及JWT改造后执行流程梳理

配置容错组件 Sentinel

微服务Spring Cloud Alibaba之Sentinel篇,使用熔断器防止雪崩