spring-cloud-gateway降级的实现

前言

本文主要研究一下 spring cloud gateway 如何集成 hystrix。

当下游接口负载很大,或者接口不通等其他原因导致超时,如果接口不熔断的话将会影响到下游接口得不到喘息,网关也会因为超时连接一直挂起,很可能因为一个子系统的问题导致整个系统的雪崩。所以我们的网关需要设计熔断,当因为熔断器打开时,网关将返回一个降级的应答。

Maven 配置

添加 hystrix 依赖

pom.xml

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>

项目实战

在 provider1 服务中添加一个方法,延时 2 秒返回响应。

  @GetMapping("/timeout")
  public String timeout() {
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("休眠了2秒");
    return "timeout test";
  }

修改网关配置文件

server:
 port: 2000
spring:
 application:
  name: idc-gateway2
 redis:
  host: localhost
  port: 6379
  timeout: 6000ms # 连接超时时长(毫秒)
  jedis:
   pool:
    max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
    max-wait: -1ms   # 连接池最大阻塞等待时间(使用负值表示没有限制)
    max-idle: 10   # 连接池中的最大空闲连接
    min-idle: 5    # 连接池中的最小空闲连接
 cloud:
  consul:
   host: localhost
   port: 8500
  gateway:
   discovery:
    locator:
     enabled: true # gateway可以通过开启以下配置来打开根据服务的serviceId来匹配路由,默认是大写
   routes:
    - id: provider1
     uri: lb://idc-provider1
     predicates:
      - Path=/p1/**
     filters:
      - StripPrefix=1
      - name: Hystrix
       args:
        name: default
        fallbackUri: forward:/defaultfallback # 只有该id下的服务会降级
    - id: provider2
     uri: lb://idc-provider2
     predicates:
      - Path=/p2/**
     filters:
      - StripPrefix=1

# hystrix 信号量隔离,1.5秒后自动超时
hystrix:
 command:
  default:
   execution:
    isolation:
     strategy: SEMAPHORE
     thread:
      timeoutInMilliseconds: 1500

网关添加降级处理类

@RestController
public class FallbackController {

@RequestMapping("/defaultfallback")
public Map<String,Object> defaultfallback(){
System.out.println("降级操作...");
Map<String,Object> map = new HashMap<>();
map.put("code",200);
map.put("msg","服务超时降级");
map.put("data",null);
return map;
}
}

降级测试

超时服务降级

curl http://localhost:2000/p1/timeout

返回

{"msg":"服务超时降级","code":200,"data":null}

其他异常

spring-cloud-gateway 调用下游服务返回的异常,网关不做任何处理,会直接返回。大家想一下为什么在网关不去处理下游异常呢? 因为很多时候下游的异常是包含有效信息的(异常信息千千万),如果在网关处做了统一返回,就失去了返回异常的意义。

spring-cloud-starter-netflix-hystrix 内置的 Hystrix 过滤器是
HystrixGatewayFilterFactory。 感兴趣的小伙伴可以自行阅读相关源码。

到此这篇关于spring-cloud-gateway降级的实现的文章就介绍到这了,更多相关spring-cloud-gateway降级 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springcloud gateway聚合swagger2的方法示例

    问题描述 在搭建分布式应用时,每个应用通过nacos在网关出装配了路由,我们希望网关也可以将所有的应用的swagger界面聚合起来.这样前端开发的时候只需要访问网关的swagger就可以,而不用访问每个应用的swagger. 框架 springcloud+gateway+nacos+swagger 问题分析 swagger页面是一个单页面应用,所有的显示的数据都是通过和springfox.documentation.swagger.web.ApiResponseController进行数据交互,

  • Spring Cloud Gateway入门解读

    Spring Cloud Gateway介绍 前段时间刚刚发布了Spring Boot 2正式版,Spring Cloud Gateway基于Spring Boot 2,是Spring Cloud的全新项目,该项目提供了一个构建在Spring 生态之上的API网关,包括:Spring 5,Spring Boot 2和Project Reactor. Spring Cloud Gateway旨在提供一种简单而有效的途径来发送API,并为他们提供横切关注点,例如:安全性,监控/指标和弹性.当前最新的

  • 详解Spring Cloud Gateway 限流操作

    开发高并发系统时有三把利器用来保护系统:缓存.降级和限流. API网关作为所有请求的入口,请求量大,我们可以通过对并发访问的请求进行限速来保护系统的可用性. 常用的限流算法比如有令牌桶算法,漏桶算法,计数器算法等. 在Zuul中我们可以自己去实现限流的功能 (Zuul中如何限流在我的书 <Spring Cloud微服务-全栈技术与案例解析>  中有详细讲解) ,Spring Cloud Gateway的出现本身就是用来替代Zuul的. 要想替代那肯定得有强大的功能,除了性能上的优势之外,Spr

  • Spring Cloud Gateway使用Token验证详解

    引入依赖 <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <ty

  • Spring Cloud GateWay 路由转发规则介绍详解

    Spring在因Netflix开源流产事件后,在不断的更换Netflix相关的组件,比如:Eureka.Zuul.Feign.Ribbon等,Zuul的替代产品就是SpringCloud Gateway,这是Spring团队研发的网关组件,可以实现限流.安全认证.支持长连接等新特性. Spring Cloud Gateway Spring Cloud Gateway是SpringCloud的全新子项目,该项目基于Spring5.x.SpringBoot2.x技术版本进行编写,意在提供简单方便.可

  • spring cloud gateway 限流的实现与原理

    在高并发的系统中,往往需要在系统中做限流,一方面是为了防止大量的请求使服务器过载,导致服务不可用,另一方面是为了防止网络攻击. 常见的限流方式,比如Hystrix适用线程池隔离,超过线程池的负载,走熔断的逻辑.在一般应用服务器中,比如tomcat容器也是通过限制它的线程数来控制并发的:也有通过时间窗口的平均速度来控制流量.常见的限流纬度有比如通过Ip来限流.通过uri来限流.通过用户访问频次来限流. 一般限流都是在网关这一层做,比如Nginx.Openresty.kong.zuul.Spring

  • 详解SpringCloud Gateway之过滤器GatewayFilter

    在Spring-Cloud-Gateway之请求处理流程文中我们了解最终网关是将请求交给过滤器链表进行处理,接下来我们阅读Spring-Cloud-Gateway的整个过滤器类结构以及主要功能 通过源码可以看到Spring-Cloud-Gateway的filter包中吉接口有如下三个,GatewayFilter,GlobalFilter,GatewayFilterChain,下来我依次阅读接口的主要实现功能. GatewayFilterChain 类图 代码 /** * 网关过滤链表接口 * 用

  • 详解SpringCloud Finchley Gateway 统一异常处理

    SpringCloud Finchley Gateway 统一异常处理 全文搜索[@@]搜索重点内容标记 1 . 问题:使用SpringCloud Gateway时,会出现各种系统级异常,默认返回HTML. 2 . Finchley版本的Gateway,使用WebFlux形式作为底层框架,而不是Servlet容器,所以常规的异常处理无法使用 翻阅源码,默认是使用DefaultErrorWebExceptionHandler这个类实现结构如下: 可以实现参考DefaultErrorWebExcep

  • Spring Cloud Gateway重试机制的实现

    前言 重试,我相信大家并不陌生.在我们调用Http接口的时候,总会因为某种原因调用失败,这个时候我们可以通过重试的方式,来重新请求接口. 生活中这样的事例很多,比如打电话,对方正在通话中啊,信号不好啊等等原因,你总会打不通,当你第一次没打通之后,你会打第二次,第三次...第四次就通了. 重试也要注意应用场景,读数据的接口比较适合重试的场景,写数据的接口就需要注意接口的幂等性了.还有就是重试次数如果太多的话会导致请求量加倍,给后端造成更大的压力,设置合理的重试机制才是最关键的. 今天我们来简单的了

  • Spring Cloud Gateway全局异常处理的方法详解

    前言 Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式.Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等

随机推荐