sentinel网关限流

该博客介绍了如何在Spring Cloud Gateway中集成Sentinel实现流控,并通过Nacos进行规则持久化。详细步骤包括引入依赖、配置Sentinel Dashboard、配置应用YML文件、编写自定义的NacosWritableDataSource以及注册到更新处理类中,确保服务重启后规则不丢失。
摘要由CSDN通过智能技术生成

sentinel 网关限流

官方教程

基本使用配置
  • 需要引入的包

    本人用的版本:spring cloud Hoxton.SR11 spring cloud alibaba 2.2.6.RELEASE

    不同版本可能会导致sentinel无法加载nacos配置的流控规则的奇怪bug

           <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
           <!--支持从nacos中获取流控规则和api规则-->
            <dependency>
                <groupId>com.alibaba.csp</groupId>
                <artifactId>sentinel-datasource-nacos</artifactId>
            </dependency>
           	 
    
  • 启动sentinel控制台

    这里使用的sentinel-dashboard-1.8.0.jar

    java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar
    
  • 网关中的配置如下 aplication.yml

    这里配置了两个datasource,一个加载网关流控规则,一个加载网关自定义api

    代码中会根据rule-type来区分,gw-flow表示网关流控规则 ,gw-api-group表示自定义api

    server:
      port: 8082
    spring:
      cloud:
        gateway:
          enabled: true
          discovery:
            locator:
              lower-case-service-id: true
          routes:
            - id: httpbin_route
              uri: http://aiforcare.com/
              predicates:
                - Path=/**
        sentinel:
          datasource:
            ds1:  #从nacos读取流控规则
              nacos:
                server-addr: 192.168.1.28:8848
                data-id: sentinel.json
                group-id: DEFAULT_GROUP
                data-type: json
                rule-type: gw-flow
                namespace: 3d55ade7-7100-400d-a707-eafdaa58f41d
            ds2:   #从nacos读取api-definition
              nacos:
                server-addr: 192.168.1.28:8848
                data-id: api-group.json
                group-id: DEFAULT_GROUP
                data-type: json
                rule-type: gw-api-group
                namespace: 3d55ade7-7100-400d-a707-eafdaa58f41d
    
  • nacos中配置 注意要用数组

    ​ sentinel.json

     [
    	{
      		"burst": 0,
      		"controlBehavior": 0,  //0-表示快速失败
      		"count": 10.0,  
      		"grade": 1,  //按qps限流
      		"intervalSec": 1,
      		"maxQueueingTimeoutMs": 500,
      		"paramItem": {
      			"index": 0,
      			"matchStrategy": 0,
      			"parseStrategy": 0
      		},
      		"resource": "cos",  //api名称
      		"resourceMode": 1
      	}
      ]
    

    api-group.json

      [
      	{
      		"apiName": "cos1",  //api名称
      		"predicateItems": [
      			{
      				"matchStrategy": 0,    //精确匹配
      				"pattern": "/acl/user/user2"
      			}
      		]
      	},
      	{
      		"apiName": "cos",
      		"predicateItems": [
      			{
      				"matchStrategy": 0,
      				"pattern": "/order/userOrder/view"
      			}
      		]
      	}
      ]
    
  • 网关服务启动配置参数

    -Dcsp.sentinel.dashboard.server=127.0.0.1:8080  #sentinel控制台地址
    -Dproject.name=springcloud-gateway  #应用名称
    -Dcsp.sentinel.api.port=8888    #sentinel控制台与客户端连接的端口
    -Dcsp.sentinel.app.type=1   #1表示是网关流控  这个必须设置  很重要
    
怎么实现sentinel控制台配置持久化到nacos中

如果没有做持久化,每次服务重启会导致之前在sentinel控制台配置的全部消失,因为它只是保存在内存中

实现代码如下

  1. 自定义一个WritableDataSource

    package com.gaorong.orm;
    
    import com.alibaba.csp.sentinel.datasource.WritableDataSource;
    import com.alibaba.fastjson.JSON;
    import com.alibaba.nacos.api.NacosFactory;
    import com.alibaba.nacos.api.PropertyKeyConst;
    import com.alibaba.nacos.api.config.ConfigService;
    import com.alibaba.nacos.api.exception.NacosException;
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.Properties;
    
    /**
     * @author leic <lei.chen@hcit.ai>.
     * @date 2021/8/6 15:27
     */
    @Slf4j
    public class NacosWritableDataSource<T> implements WritableDataSource<T> {
    
    
        private ConfigService configService = null;
    
        private String groupId;
    
        private String dataId;
    
    
        public NacosWritableDataSource(String serverAddr, String groupId, String dataId,
                                       String nameSpace) {
            this.groupId = groupId;
            this.dataId = dataId;
            Properties properties = buildProperties(serverAddr, nameSpace);
            try {
                this.configService = NacosFactory.createConfigService(properties);
            } catch (NacosException e) {
                log.info("初始化nacos客户端失败:", e);
                throw new RuntimeException(e.getMessage());
            }
    
        }
    
        @Override
        public void write(T value) throws Exception {
            try {
                String convert = JSON.toJSONString(value);
                  //持久化配置到nacos,每一次sentinel规则更新都会给到全量(api或网关流控)的配置信息
                configService.publishConfig(dataId, groupId, convert);
            } catch (NacosException e) {
                log.error("error:", e);
            }
        }
    
        @Override
        public void close() throws Exception {
    
        }
    
        private static Properties buildProperties(String serverAddr, String namespace) {
            Properties properties = new Properties();
            properties.setProperty(PropertyKeyConst.SERVER_ADDR, serverAddr);
            properties.setProperty(PropertyKeyConst.NAMESPACE, namespace);
            return properties;
        }
    }
    
    
  2. 将自定义的WritableDataSource绑定到api及流控规则更新的处理类中

    package com.gaorong.orm;
    
    import com.alibaba.cloud.sentinel.SentinelProperties;
    import com.alibaba.cloud.sentinel.datasource.config.DataSourcePropertiesConfiguration;
    import com.alibaba.cloud.sentinel.datasource.config.NacosDataSourceProperties;
    import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
    import com.alibaba.csp.sentinel.adapter.gateway.common.command.UpdateGatewayApiDefinitionGroupCommandHandler;
    import com.alibaba.csp.sentinel.adapter.gateway.common.command.UpdateGatewayRuleCommandHandler;
    import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.event.ContextRefreshedEvent;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * @author leic <lei.chen@hcit.ai>.
     * @date 2021/8/6 16:26
     */
    @Service
    public class SentinelPersistHandler implements ApplicationListener<ContextRefreshedEvent> {
        @Resource
        private SentinelProperties sentinelProperties;
    
        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            initGateWayApiDefinition();
            initGatewayFlowRule();
        }
    
        private void initGatewayFlowRule() {
            //ds1 与配置文件中对应
            NacosDataSourceProperties nacosProperty = getNacosDataSourceProperties("ds1");
            NacosWritableDataSource<Set<GatewayFlowRule>> nacosWritableDataSource
                    = new NacosWritableDataSource(nacosProperty.getServerAddr()
                    , nacosProperty.getGroupId(), nacosProperty.getDataId(), nacosProperty.getNamespace());
            //网关流控规则处理类
            UpdateGatewayRuleCommandHandler.setWritableDataSource(nacosWritableDataSource);
        }
    
        private NacosDataSourceProperties getNacosDataSourceProperties(String key) {
            Map<String, DataSourcePropertiesConfiguration> datasource = sentinelProperties.getDatasource();
            DataSourcePropertiesConfiguration configuration
                    = datasource.get(key);
            NacosDataSourceProperties nacosProperty = configuration.getNacos();
            return nacosProperty;
        }
    
        private void initGateWayApiDefinition() {
            //ds2 与配置文件中对应
            NacosDataSourceProperties nacosProperty = getNacosDataSourceProperties("ds2");
            NacosWritableDataSource<Set<ApiDefinition>> nacosWritableDataSource
                    = new NacosWritableDataSource(nacosProperty.getServerAddr()
                    , nacosProperty.getGroupId(), nacosProperty.getDataId(), nacosProperty.getNamespace());
    /**api更新处理类**/       UpdateGatewayApiDefinitionGroupCommandHandler.setWritableDataSource(nacosWritableDataSource);
        }
    }
    
    
### 回答1: Gateway Sentinel是一种网关限流技术,它可以在网关层面对请求进行限流,防止过多的请求对后端服务造成压力。它可以根据不同的规则对请求进行限制,例如根据IP地址、请求路径、请求参数等进行限制。同时,Gateway Sentinel还可以对请求进行统计和监控,帮助开发人员了解系统的负载情况,及时调整系统配置,保证系统的稳定性和可靠性。 ### 回答2: Gateway sentinel是如今常用的一种网关限流技术。其作用和传统的限流技术类似,主要是用来保护服务的可用性和稳定性,避免因过多请求而导致的服务宕机或系统崩溃等问题。但是与传统技术不同的是,Gateway sentinel限流策略更加精细和灵活,可以根据实际情况进行动态调整,使得限流更加准确和高效。 Gateway sentinel主要有以下几个特点: 一、有多种限流策略可供选择:针对不同的场景和需求,Gateway sentinel提供了多种不同的限流策略,如令牌桶限流、漏桶限流、并发数限流等等。管理员可以根据实际情况选择适合自己的限流策略。 二、支持动态调整:Gateway sentinel可以根据流量的变化动态调整限流策略和参数,使得限流更加准确和高效。同时,还可以根据实时数据进行分析和预测,预判可能出现的问题,提前进行限流和调整,避免系统崩溃。 三、集成了监控和报警系统:Gateway sentinel不仅可以实现限流功能,还具备监控和报警功能。管理员可以根据需要设置监控指标和报警规则,及时获取系统状态和异常信息,保证系统的可用性和可靠性。 四、易于使用和扩展:Gateway sentinel是一个基于插件架构的限流框架,可以集成在各种不同的Web应用程序和微服务框架中。同时,其还提供了友好的API和文档,方便开发者进行二次开发和定制化。 总之,Gateway sentinel是一种功能强大、灵活性高、易于使用和扩展的网关限流技术,对于保障服务的稳定性和可用性有着重要的作用,是现代企业必不可少的一项技术。 ### 回答3: Gateway sentinel网关限流是一种防止DDoS攻击的网络安全机制,它通过限制网络请求的访问频率来保护服务端资源免受过多的请求而崩溃的风险。这种机制可用于所有类型的Web应用程序,包括本地安装的Web应用程序、云服务和SaaS软件。 这项限流工具可以通过对每个请求进行流量监测来识别是否存在异常请求,并采取适当的措施来处理它们。在正常的网络流量条件下,所有来自客户端的请求都会在网关层进行处理和审核。但如果网关层检测到来自一个IP地址的数据包进行了多次重复的无效请求,它就会限制该IP地址的访问频率,以防止它进一步地消耗服务器资源。 此外,网关限流机制还可以实时监测网络流量,检测和分析异常攻击流量,并将攻击行为数据传递给安全高级性工具,从而加强安全防御体系。 在安装和配置软件之后,管理员可以选择合适的阈值来控制网关限流,根据您的需求进行配置,以便确保服务器和网络能够在意外高流量流入的情况下顺利运行。 总之,网关限流是一种可靠而安全的防御工具,它可以让您的Web应用程序不受攻击,从而保障用户的数据和网络安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值