sentinel实现gateway网关限流规则持久化

欢迎大家进群,一起探讨学习

欢迎大家进群,一起讨论学习

微信公众号,每天给大家提供技术干货

在这里插入图片描述

博主技术笔记 https://notes.xiyankt.com


博主开源微服架构前后端分离技术博客项目源码地址,欢迎各位star


## sentinel实现gateway网关限流规则持久化

上一篇文件介绍了怎么实现网关怎么限流

1.网关限流持久化

1.1maven依赖

<dependencies>
        <<!--sentinel限流熔断 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--sentinel限流规则持久化 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
    </dependencies>

1.2配置类

package com.yoostar.gateway.config;


import com.alibaba.cloud.sentinel.SentinelProperties;
import com.alibaba.cloud.sentinel.datasource.config.NacosDataSourceProperties;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

import java.util.Set;

/**
 * @Description: 限流规则持久化
 * @author: bright
 * @Date: 2020/9/25 13:46
 */
@Configuration
@Order(2)
public class SentinelPersistenceConfig {

    @Autowired
    private SentinelProperties sentinelProperties;

    @Bean
    public SentinelPersistenceConfig init() throws Exception {
        loadGWFlowRule();
        return new SentinelPersistenceConfig();
    }

    private void loadGWFlowRule() {
        sentinelProperties.getDatasource().entrySet().stream().filter(map -> {
            return map.getValue().getNacos() != null;
        }).forEach(map -> {
            NacosDataSourceProperties nacos = map.getValue().getNacos();
            ReadableDataSource<String, Set<GatewayFlowRule>> gwFlowRuleDataSource = new NacosDataSource<>(
                    nacos.getServerAddr(), nacos.getGroupId(), nacos.getDataId(),
                    source -> JSON.parseObject(source, new TypeReference<Set<GatewayFlowRule>>() {
                    }));
            GatewayRuleManager.register2Property(gwFlowRuleDataSource.getProperty());
        });
    }
}

1.3yml配置

spring:
  cloud:        
    sentinel:
      transport:
        dashboard: 127.0.0.1:8888  
      datasource:
        gate-way-flow: 
          nacos:
            namespace: ecc786d0-1555-4517-a5df-a65b9ac02590
            server-addr: 127.0.0.1:8848
            data-id: ${spring.application.name}-rules
            group-id: DEFAULT_GROUP
            rule-type: gw_flow
      # 限流返回的响应
      scg:
        fallback:
          mode: response
          response-status: 455
          response-body: error!  
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: ecc786d0-1555-4517-a5df-a65b9ac02590

1.4编写限流配置

在这里插入图片描述
在这里插入图片描述

[
   {
        "resource": "service-1",
        "grade": 1,
        "count": 5,
        "intervalSec": 1
    }
]

1.5启动服务后查询sentinel控制台
在这里插入图片描述

注意事项

注:如果你的Nacos配置了不同的隔离环境 namespace,则需要指定具体哪一个namespace,否则会加载不到规则配置,报错如下:

[c.a.c.s.datasource.converter.SentinelConverter ] line 80 : converter can not convert rules because source is empty

naocs 如下:
在这里插入图片描述

二、Nacos与Sentinel互相同步限流规则

1、流控推送规则
要通过 Sentinel 控制台配置集群流控规则,需要对控制台进行改造。主要改造规则可以参考:

https://github.com/alibaba/Sentinel/wiki/Sentinel-控制台(集群流控管理)#规则配置

其控制台推送规则:

将规则推送到Nacos或其他远程配置中心
Sentinel客户端链接Nacos,获取规则配置;并监听Nacos配置变化,如发生变化,就更新本地缓存。
控制台监听Nacos配置变化,如发生变化就更新本地缓存。从而让控制台本地缓存总是和Nacos一致。

2、改造sentinel-dashboard

2.1 通关git官网下载Sentinel 源代码,如下:

https://github.com/alibaba/Sentinel/archive/1.7.2.zip
下载后解压,使用IDEA打开如下:

在这里插入图片描述

2.2 修改sentinel-dashboard 控制台模块的pom.xml,将test注释掉

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <!--<scope>test</scope>-->
</dependency>

2.3 修改sidebar.html页面(sentinel控制台左边菜单栏)

sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar.html

并找到如下代码段后,并把注释打开,名称也稍作修改。

修改前:
在这里插入图片描述

修改后:

在这里插入图片描述

2.4 修改nacos相关java代码

找到如下目录(位于test目录)

sentinel-dashboard/src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos

将整个目录拷贝到

sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos

修改com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2.java

修改如下:
在这里插入图片描述

其中,注入的两个bean:

flowRuleNacosProvider,就是实现Nacos的限流规则配置拉取。
flowRuleNacosPublisher,实现Nacos的配置推送。

FlowRuleNacosProvider.java 如下,无需修改

在这里插入图片描述

getRules方法中的appName参数是Sentinel中的服务名称。
configService.getConfig方法是从Nacos中获取配置信息的具体操作。其中,DataId和GroupId分别对应客户端使用时候的对应配置。如下:

spring.cloud.sentinel.datasource.ds1.nacos.server-addr=192.168.100.80:8848
spring.cloud.sentinel.datasource.ds1.nacos.dataId=${spring.application.name}-flow-rules

FlowRuleNacosPublisher.java如下,无需修改:

在这里插入图片描述

打开 NacosConfigUtil.java ,如下两个地方,需要和上面使用nacos存储时的配置一致。注意:两边的DataId和GroupId必须对应上。

在这里插入图片描述

打开 NacosConfig.java,修改如下,主要是nacos配置中心的地址与namespace隔离环境的配置修改,如果没有设置namespace,就可以不设置 PropertyKeyConst.NAMESPACE

在这里插入图片描述

经过以上步骤就已经把流控规则改造成推模式持久化了。

2.5 编译生成jar包

执行命令

mvn clean package -DskipTests

编译成功后,在项目的 target 目录可以找到sentinel-dashboard.jar ,执行以下命令可以启动控制台:

java -jar sentinel-dashboard.jar

打开Sentinel控制台,可以看到上面通过nacos新建的限流规则

在这里插入图片描述

我们可以尝试在Sentinel控制台修改该规则,看是否能同步推送到Nacos,这里我们修改阈值为15,打开Nacos配置中心,可以看到已经更新过来了。
在这里插入图片描述

下面我们通过修改Nacos将阈值再修改为20,刷新Sentinel,也能同步过来,如下:

在这里插入图片描述

通过测试发现,在Sentinel控制台修改规则可以同步到Nacos,或者在Nacos上修改规则也可以同步到Sentinel控制台。

第二部分的原文地址

踩坑 (注意)

这个springcloud版本如果是2.2.2就会启动报数据源找不到,注意
更换其它版本启动没有任何问题

 	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/>
    </parent>
<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
        <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        <swagger.version>3.0.0</swagger.version>
        <logstash.version>6.4</logstash.version>
        <fastjson.version>1.2.73</fastjson.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘明同学呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值