springcloud之gateway路由熔断

在前面学习 Hystrix 的时候,我们知道 Hystrix 有服务降级的能力,即如果服务调用出现了异常,则执行指定的 fallback 方法。Spring Cloud Gateway 也整合了 Hystrix,可以为我们提供路由层面服务降级。

先导入hystrix依赖


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

这里仅对consumer-9091进行配置

#端口
server:
  port: 16000
#服务名
spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes: #路由配置:参数为一个List

      - id: consumer-9090 #唯一标识
        uri: lb://RIBBON-CONSUMER #转发的地址,写服务名称
        predicates:
        - Path=/ribbon/** #判断匹配条件,即地址带有/ribbon/**的请求,会转发至lb:RIBBON-CONSUMER
        filters:
        - StripPrefix=1 #去掉Path前缀,参数为1代表去掉/ribbon
        - name: RequestRateLimiter
          args:
            redis-rate-limiter.replenishRate: 1  # 填充速度,每秒
            redis-rate-limiter.burstCapacity: 3  # 令牌桶的容积
            key-resolver: "#{@remoteAddrKeyResolver}" #SPEL表达式取的对应的bean

      - id: consumer-9091
        uri: lb://FEIGN-CONSUMER
        predicates:
        - Path=/feign/**
        filters:
        - StripPrefix=1
        - name: Hystrix
          args:
            name: suibianqu
            fallbackUri: forward:/myFallback

  redis:
    host: 192.168.183.132
    port: 6379
    password: root
eureka:
  client:
    service-url:
      defaultZone: http://www.aaa.com:10000/eureka,http://www.bbb.com:10001/eureka,http://www.ccc.com:10002/eureka


编写controller与对应的降级方法

@RestController
public class FallbackController {

    @RequestMapping("/myFallback")
    public String myFallback() {
        System.out.println("gateway服务降级");
        return "gateway服务降级";
    }
}

启动路由工程16000,注册中心10000,消费者9091,提供者8080和8081(集群)

springcloud之gateway路由熔断_第1张图片

访问 http://localhost:16000/feign/helloFeign,此时两个提供者正常工作

 关掉提供者8080和8181,继续访问.此时日志显示路由工程16000和消费者9091都调用了自己的fallback,最后页面返回的是16000的降级方法返回.

其实有一点我不懂,既然9091没有挂,为什么16000会触发降级?

补充:将网关的超时时间调大一点就解决了.其问题原因在于,网关的默认超时时间和消费者的默认超时时间相同,因此当消费者调用提供者发生超时,与此同时网关也已经超时了.

你可能感兴趣的:(springcloud)