SpringCloud实战十二:Gateway之 Spring Cloud Gateway 熔断、降级、限流

1.熔断降级:在分布式系统中,网关作为流量的入口,大量请求进入网关,向后端远程系统或服务发起调用,后端服务不可避免的会产生调用失败(超时或者异常),失败时不能让请求堆积在网关上,需要快速失败并返回回去,这就需要在网关上做熔断、降级操作。
2.限流:网关上有大量请求,对指定服务进行限流,可以很大程度上提高服务的可用性与稳定性,限流的目的是通过对并发访问/请求进行限速,或对一个时间窗口内的请求进行限速来保护系统。一旦达到限制速率则可以拒绝服务、排队或等待、降级。
3.Spring Cloud Gateway 集成熔断、限流
  • 1.在前篇博客代码的基础上集成 Hystrix 熔断降级,引用hystrix依赖,在filters下加入熔断降级配置,设置降级后返回的路由,同时配置默认使用信号量隔离、3秒主动超时
<!-- 熔断、降级 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

application.yml

filters:
# 熔断降级配置
- name: Hystrix
  args:
    name : default
    fallbackUri: 'forward:/defaultfallback'

# hystrix 信号量隔离,3秒后自动超时
hystrix:
  command:
    default:
      execution:
        isolation:
          strategy: SEMAPHORE
          thread:
            timeoutInMilliseconds: 3000
  shareSecurityContext: true

新建一个DefaultHystrixController 的RestController,内容如下:

/**
 * 默认降级处理
 */
@RestController
public class DefaultHystrixController {

    @RequestMapping("/defaultfallback")
    public Map<String,String> defaultfallback(){
        System.out.println("降级操作...");
        Map<String,String> map = new HashMap<>();
        map.put("resultCode","fail");
        map.put("resultMessage","服务异常");
        map.put("resultObj","null");
        return map;
    }
}

同时在consumer-service的IndexController中添加一个timeout方法,让线程睡5秒,大于网关中设置超时的3秒,因此会触发熔断降级,代码如下:

@RestController
public class IndexController {

    @RequestMapping("/hello")
    public String hello(String name){
        return "hi " + name;
    }

    @RequestMapping("/timeout")
    public String timeout(){
        try{
            //睡5秒,网关Hystrix3秒超时,会触发熔断降级操作
            Thread.sleep(2000);
        }catch (Exception e){
            e.printStackTrace();
        }
        return "timeout";
    }
}

启动项目,访问 http://localhost:9999/consumer/timeout ,结果如下,触发了降级
在这里插入图片描述
把网关的超时配置改为6000,也就是6秒,重启网关,再次访问 http://localhost:9999/consumer/timeout ,结果正常返回,网关上集成了 Hystrix 熔断降级,可以覆盖大部分后端服务不可用场景
在这里插入图片描述

  • 2.集成限流,Spring Cloud Gateway默认集成了Redis限流,可以对不同服务做不同维度的限流,如:IP限流、用户限流 、接口限流
    本文演示的是 IP限流 ,先添加redis依赖,添加KeyResolver,再添加配置,需启动redis
<!-- 限流 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

通过KeyResolver来指定限流的Key,新建一个 RateLimiterConfig 类,IP限流代码如下:

/**
 * 路由限流配置
 * @author zhuyu
 * @date 2019/1/15
 */
@Configuration
public class RateLimiterConfig {

    @Bean(value = "remoteAddrKeyResolver")
    public KeyResolver remoteAddrKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }
}

application.yml下添加限流配置:

spring:
  redis:
    host: localhost
filters:
# redis限流 , filter名称必须是RequestRateLimiter
- name: RequestRateLimiter
  args:
    # 使用SpEL名称引用Bean,与上面新建的RateLimiterConfig类中的bean的name相同
    key-resolver: '#{@remoteAddrKeyResolver}'
    # 每秒最大访问次数
    redis-rate-limiter.replenishRate: 20
    # 令牌桶最大容量
    redis-rate-limiter.burstCapacity: 20

filter名称必须是RequestRateLimiter
redis-rate-limiter.replenishRate:允许用户每秒处理多少个请求
redis-rate-limiter.burstCapacity:令牌桶的容量,允许在一秒钟内完成的最大请求数
key-resolver:使用SpEL按名称引用bean

第一次设置限流数 2、10
redis-rate-limiter.replenishRate: 2
redis-rate-limiter.burstCapacity: 10
测试结果如下,只有14个请求响应回去,其他全被拒绝了
在这里插入图片描述

第二次设置限流数 20、20
redis-rate-limiter.replenishRate: 20
redis-rate-limiter.burstCapacity: 20
测试结果如下,有大量请求进行了响应,部分拒绝
在这里插入图片描述

给出redis的限流时 key与value 变化
在这里插入图片描述

还可以使用用户限流、接口限流
用户限流,使用这种方式限流,请求路径中必须携带userId参数

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

接口限流,获取请求地址的uri作为限流key

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

在真实场景中,限流数的调整需要依赖配置中心,当网站做活动时,动态调整限流数,新服务上线时,通过配置中心做动态路由等

代码已上传至码云,源码,项目使用的版本信息如下:

- SpringBoot 2.0.6.RELEASE
- SpringCloud Finchley.SR2
已标记关键词 清除标记
<p> <span style="color:#337fe5;"><strong> </strong></span> </p> <p class="MsoNormal"> <span style="color:#000000;font-size:16px;">本课程总计13大章节,115课时,是一门全面的SpringCloud微服务体系化课程。课程共包括</span><span style="color:#000000;font-size:16px;">十三个大章节,涵盖注册中心、网关、熔断降级、监控、安全、限流等全部体系。</span><span style="color:#000000;font-size:16px;">包含阿里巴巴Nacos,Consul,Spring Cloud Gateway,OAuth2.0 JWT 等主流技术。</span> </p> <p class="MsoNormal"> <span style="color:#000000;font-size:16px;"> </span> </p> <p>   </p> <p> <span style="color:#337fe5;"><strong>[为什么要学习Spring Cloud微服务]</strong></span> </p> <p> <span style="color:#4d555d;"> </span> </p> <p class="ql-long-24357476" style="font-family:"color:#222226;font-size:14px;background-color:#ffffff;"> <span style="font-family:"background-color:#FFFFFF;"><span style="font-size:12px;">SpringCloud作为主流微服务框架,</span><span style="color:#4d555d;font-family:"background-color:#FFFFFF;font-size:12px;">已成为各互联网公司的首选框架,国内外企业占有率持续攀升,</span><span style="font-size:12px;">是Java工程师的必备技能。</span></span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">就连大名鼎鼎的阿里巴巴</span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">dubbo</span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">也正式更名为</span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">Spring Cloud Alibaba</span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">,成为了</span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">Spring Cloud </span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">微服务中的一个子模块。</span><span style="font-family:"background-color:#FFFFFF;font-size:12px;">Spring Cloud是企业架构转型、个人能力提升、架构师进阶的不二选择。</span><span style="font-family:"background-color:#FFFFFF;"> </span> </p> <p class="ql-long-8780922" style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-8780922" style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-24357476" style="font-family:"color:#222226;font-size:14px;background-color:#ffffff;"> <span style="color:#337fe5;"><strong>【推荐你学习这门课的理由:<span style="color:#e53333;">知识体系完整+丰富学习资料】</span></strong></span> </p> <p class="ql-long-24357476" style="font-family:"color:#222226;font-size:14px;background-color:#ffffff;">   </p> <p class="MsoNormal"> 1、本课程总计13大章节,115课时,是一门全面的SpringCloud微服务体系化课程。 </p> <p class="MsoNormal"> 2、课程0基础入门,逐层递进深入,理论和代码相结合。 </p> <p class="MsoNormal"> 3、十三个大章节,涵盖注册中心、网关、熔断降级、监控、安全、限流等全部体系。 </p> <p class="MsoNormal"> 4、包含阿里巴巴Nacos,Consul,Spring Cloud Gateway,OAuth2.0 JWT 主流技术。 </p> <p style="background:white;"> 5、课程附带230页高清PDF正版课件、Hoxton版本配套项目源码37个、Edgware版本配套项目26个,所有代码均有详细注释。 </p> <p>   </p> <p class="MsoNormal">   </p> <p> <span style="color:#337fe5;">【主讲讲师】</span> </p> <p> <span style="color:#337fe5;"><span style="color:#000000;">尹洪亮Kevin:</span><br /> <span style="color:#000000;">现任职某互联网公司首席架构师,负责系统架构、项目群管理、产品研发工作。</span><br /> <span style="color:#000000;">10余年软件行业经验,具有数百个线上项目实战经验。</span><br /> <span style="color:#000000;">擅长JAVA技术栈、高并发高可用伸缩式微服务架构、DevOps。</span><br /> <span style="color:#000000;">主导研发的蜂巢微服务架构已经成功支撑数百个微服务稳定运行</span></span> </p> <p> <span style="color:#337fe5;"><span style="color:#000000;"> </span></span> </p> <p>   </p> <p class="ql-long-24357476" style="font-family:"color:#222226;font-size:14px;background-color:#ffffff;"> <span style="color:#337fe5;"><strong>【学完后我将达到什么水平?】</strong></span> </p> <p class="MsoNoSpacing" style="margin-left:18.0pt;text-indent:-18.0pt;"> 1、 对Spring Cloud的各个组件能够熟练配置、开发、部署。 </p> <p class="MsoNoSpacing" style="margin-left:18.0pt;text-indent:-18.0pt;"> 2、 吊打一切关于Spring Cloud微服务的笔试面试题 </p> <p class="MsoNoSpacing" style="margin-left:18.0pt;text-indent:-18.0pt;"> 3、 能够上手搭建十分完整的微服务分布式系统,涵盖服务注册与发现、负载、网关、配置中心、监控、安全、熔断等。 </p> <p class="MsoNoSpacing" style="margin-left:18.0pt;text-indent:-18.0pt;"> 4、 对整个微服务体系架构有十分清晰准确的掌握。 </p> <p>   </p> <p class="ql-long-24357476"> <span style="font-family:""> </span> </p> <p class="MsoListParagraph" style="margin-left:36pt;text-indent:-36pt;" align="left"> <strong><span style="color:#337fe5;">【</span><span style="color:#337fe5;">面向人群</span><span style="color:#337fe5;">】</span></strong> </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;"> 1、 <span style="color:#4d555d;">不了解微服务是什么,</span>感觉微服务很难、不敢学,<span style="color:#4d555d;">网上资料松散,</span>没有好的学习资料 </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;"> 2、 这么多年还一直在写SSH、SSM项目,没有更新过自己的知识体系。 </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;"> 3、 Spring Cloud组件太多,不知道应该重点关注和学习哪些。 </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;"> 4、 不会搭建微服务项目、依赖项目太多、完全搞不清楚。 </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;">   </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;"> <span style="color:#337fe5;"><strong>【课程知识体系图】</strong></span> </p> <p class="MsoListParagraph" style="margin-left:18.0pt;text-indent:-18.0pt;"> <span style="color:#337fe5;"><strong><img src="https://img-bss.csdnimg.cn/202007100719132383.png" alt="" /><br /> </strong></span> </p>
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页