SpringCloud微服务网关限流方式

 更新时间:2024年08月13日 10:02:23   作者:王乐乐君  
这篇文章主要介绍了SpringCloud微服务网关限流方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.限流的两种实现方式

nginx限流

在nginx中,通过限流可以规定一个一个地址映射每一秒可以被访问多少次,甚至是限制每一个用户(这里的用户指的是访问改地址映射的用户的IP)在规定的时间内可以访问的次数,防止用户多次操作或者是恶意请求攻击服务。

网关限流

网关可以提供用户统一的访问入口,在Nginx限流过后,依然会有很大一波流量会承载的网关上,那这个时候的限流是针对于网关甚至是针对于网关所挂在的微服务,我们需要限定用户在只能针对某个微服务在特定的时间段内只能访问多少次,如果不加限制的会,可能会因为并发量的过大导致服务宕机,甚至引起雪崩效应。

2.架构图

3.为什么需要两个限流

原因有以下几点:

  • 1.Nginx限流过后流量仍然很大:为nginx限流只是针对于用户访问的一个入口,这个入口直接开放给网关,这个时候你不清楚用户真正的访问意图,如果在这里的限制力度过大,导致用户能请求的次数过少,就会导致页面加载缓慢的问题,毕竟有时候一个页面的请求甚至会超过100个(例如淘宝网等)
  • 2.无法做到针对单个服务的限流:如果你Nginx开放了一秒一个用户200r/s的请求,如果有人恶意的将所有的请求对准你的一个服务的一个借口,很可能导致服务宕机,所以需要网关这层针对每个服务进行限流。
  • 3.无法实现一些自定义的限流模型:单独的Nginx限流过于单一,无法满足特定的业务需求。

4.如何实现限流

具体的实现方式是令牌桶算法,就是某一时刻一个IP最多只能访问有效的次数。

创建令牌桶的实现

这里需要将其配置为bean,而且需要传入一个唯一标识作为令牌,这里的令牌最好是访问你的服务的IP,这样就可以做到限制。

    @Bean(name = "ipKeyResolver")
    public KeyResolver userKeyResolver(){
        return new KeyResolver() {
            @Override
            public Mono<String> resolve(ServerWebExchange exchange) {
                String ip = exchange.getRequest().getRemoteAddress().getHostString();
                System.out.println("你的IP地址是"+ip);
                return Mono.just(ip);
            }
        };
    }

配置

这里是需要配置redis的,因为这个令牌桶是基于redis实现的。

spring:
  application:
    name: gateway-admin
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
              allowedOrigins: "*"
              allowedMethods:
              - GET
              - POST
              - PUT
              - DELETE
      routes:
      - id: file
        #uri: http://localhost:8001
        uri: lb://file
        filters:
        - StripPrefix=1
        #固定配置
        - name: RequestRateLimiter
          args:
          	#上面配置的令牌桶的实现的bean的名称
            key-resolver: "#{@ipKeyResolver}"
            #可以允许的一秒中的访问次数
            redis-rate-limiter.replenishRate: 1
            redis-rate-limiter.burstcapacity: 1
        predicates:
        - Path=/brand/**
  redis:
    host: redis的ip地址
    port: 6379

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java面试题 从源码角度分析HashSet实现原理

    Java面试题 从源码角度分析HashSet实现原理

    这篇文章主要介绍了Java面试题 从源码角度分析HashSet实现原理?,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Spring单例类加载多例属性问题实例解析

    Spring单例类加载多例属性问题实例解析

    本文给大家介绍Spring单例类加载多例属性问题实例解析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2026-03-03
  • java 中用split分割字符串,最后的空格等不被拆分的方法

    java 中用split分割字符串,最后的空格等不被拆分的方法

    下面小编就为大家带来一篇java 中用split分割字符串,最后的空格等不被拆分的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • MyBatis批量插入大量数据(1w以上)

    MyBatis批量插入大量数据(1w以上)

    MyBatis进行批量插入数时,一次性插入超过一千条的时候MyBatis开始报错,本文主要介绍了MyBatis批量插入大量数据的解决方法,感兴趣的可以了解一下
    2022-01-01
  • IDEA集成DeepSeek的详细教程(保姆级教程)

    IDEA集成DeepSeek的详细教程(保姆级教程)

    DeepSeek作为一款强大的代码搜索和分析工具,能够帮助开发者快速定位代码、理解项目结构以及优化代码质量,本文将详细介绍如何在IntelliJ IDEA中集成DeepSeek,并展示如何利用它来提升开发效率,感兴趣的朋友一起看看吧
    2025-02-02
  • Java多线程通讯之wait,notify的区别详解

    Java多线程通讯之wait,notify的区别详解

    这篇文章主要介绍了Java多线程通讯之wait,notify的区别详解,非常不错,具有一定的参考借鉴借鉴价值,需要的朋友可以参考下
    2018-07-07
  • Jackson自定义序列化反序列化注解加解密字段详解

    Jackson自定义序列化反序列化注解加解密字段详解

    这篇文章主要介绍了Jackson自定义序列化反序列化注解加解密字段详解,一些场景中,数据库字段用于存储json格式数据,处于安全的考虑,该json数据中,某些敏感信息字段需要做加密存储,例如身份证号、手机号等,需要的朋友可以参考下
    2023-11-11
  • IDEA社区版下载安装流程详解(小白篇)

    IDEA社区版下载安装流程详解(小白篇)

    这篇文章主要介绍了IDEA社区版下载安装流程详解(小白篇),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • SpringBoot 定制化返回数据的实现示例

    SpringBoot 定制化返回数据的实现示例

    这篇文章主要介绍了SpringBoot 定制化返回数据的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 从Java到JSON一起探索Jackson的魔力

    从Java到JSON一起探索Jackson的魔力

    Jackson是一个用于处理JSON数据的开源Java库,这篇文章主要为大家介绍了Java是如何利用Jackson处理JSON数据的,感兴趣的小伙伴可以了解一下
    2023-05-05

最新评论