栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springcloud gateway熔断限流

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springcloud gateway熔断限流

springcloud gateway熔断限流配置 熔断限流的概念(引用)

熔断

​ 在分布式系统中,网关作为流量的入口,大量请求进入网关,向后端远程系统或服务发起调用,后端服务不可避免的会产生调用失败(超时或者异常),失败时不能让请求堆积在网关上,需要快速失败并返回回去,这就需要在网关上做熔断、降级操作。

限流

​ 网关上有大量请求,对指定服务进行限流,可以很大程度上提高服务的可用性与稳定性,限流的目的是通过对并发访问/请求进行限速,或对一个时间窗口内的请求进行限速来保护系统。一旦达到限制速率则可以拒绝服务、排队或等待、降级。

一、网关熔断 1.引入依赖

    org.springframework.cloud
    spring-cloud-starter-gateway
    ${gateway.version}


    org.springframework.cloud
    spring-cloud-starter-netflix-hystrix

2.添加熔断处理器
@Slf4j
@RestController
public class FallbackHandler {

    @RequestMapping("/defaultfallback")
    public Map defaultfallback(HttpServerRequest request) {
        String uri = request.uri();
        log.warn("网关熔断,url:{}",uri);
        Map map = new HashMap<>();
        map.put("code","5001");
        map.put("msg","服务异常,请稍后重试");
        map.put("data","null");
        return map;
    }
}
3.修改配置
- id: api-product
  uri: lb://api-product
  predicates:
    - Path=/api-product
    @Bean("ipKeyResolver")
    KeyResolver ipKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }


    
    @Primary
    @Bean("apiKeyResolver")
    public KeyResolver apiKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getPath().value());
    }


    
    @Bean("userKeyResolver")
    public KeyResolver userKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
    }

}
3.添加配置
        - id: facade-product
          uri: lb://facade-product
          predicates:
            - Path=/api-product/**
          filters:
            - StripPrefix=1
            # 熔断过滤器
            - name: Hystrix
              args:
                name: defaultfallback
                fallbackUri: forward:/defaultfallback
            # 限速路由器
            - name: RequestRateLimiter
              args:
              	# 限流策略
                key-resolver: "#{@ipKeyResolver}"
                # 每秒允许处理的请求数量,令牌桶每秒填充平均速率
                redis-rate-limiter.replenishRate: 10
                # 令牌桶的容量,允许在一秒钟内完成的最大请求数
                redis-rate-limiter.burstCapacity: 10
4.测试

使用jmeter或者postman进行测试

(1)1秒内10个线程并发访问一个接口,访问全部通过

(2)1秒内100个线程并发访问一个接口,大部分的访问被拦截,通过率只有20%(存在一定的误差),被拦截的请求返回的header携带Response message:Too Many Requests

虽然存在一定的误差,但是限流已经成功。不过gateway官方提供的限流只能使用一种限流策略,也就是你只能针对IP或者接口选择一种方式进行限流,无法做到同时即限制IP又限制接口的策略,存在一定的局限性。如果想要同时做到多规则限流的小伙伴可以关注我看下一篇自定义多规则限流篇

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/936582.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号