解决SpringCloud Gateway Finchley.SR2服务宕机,不走熔断报fallbackCmd failed and fallback failed.问题

Posted jinshuaishuai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决SpringCloud Gateway Finchley.SR2服务宕机,不走熔断报fallbackCmd failed and fallback failed.问题相关的知识,希望对你有一定的参考价值。

在项目中,遇到网关Gateway路由的服务宕机,但是最后并没有走熔断的重定向。

在Gateway的application.yml文件中有配置:

filters:

            - RewritePath=/olesellercenter/(?<segment>.*), /$\{segment} 

    #路由重写

            - name: Hystrix                  

        #熔断过滤器

              args:

                name: fallbackCmd  

                    #符合Java命名规范即可

                fallbackUri: forward:/fallback/serviceFailurePage 

        #服务器访问失败,会出现熔断,这是一个重定向

 

配置了熔断,如果服务宕机,路由不到服务,会走熔断。自己让一个Controller处理该转发,如下所示:

@RestController

@RequestMapping("/fallback")

public class FallbackController {

 

@GetMapping("/sellercenter")

public String fallback() {

return "商家服务繁忙,请稍后重试";

}

}

但是,在实际中会报出一个很奇怪的问题,就是可以处理GET方式的请求,就是说,当服务宕机后,

以GET方法走网关,访问服务,会出现熔断机制

,会报出“商家服务繁忙,请稍后重试”,但是以POST方式请求,不会走熔断,当时是百思不得其解。

后来想想,既然我这个Controller里有GetMapping

方式映射。是不是缺少PostMapping映射导致的原因,后来加上PostMapping映射,果然,问题迎刃而解。

即:

@RestController

@RequestMapping("/fallback")

public class FallbackController {

 

@GetMapping("/sellercenter")

public String fallback() {

return "商家服务繁忙,请稍后重试";

}

 

@PostMapping("/sellercenter")

public String postFallback() {

return "商家服务繁忙,请稍后重试";

}

}

 

后来仔细想想:当以post方式通过网关访问服务,服务宕机,Gateway此时会进行重定向,走熔断,

会以客户端的post请求走熔断器,而自己的Controller处理程序没有PostMapping映射,所以会出现以Post请求的方式不走熔断的机制。

网上看了很多资料,也有很多相似的问题,希望有相同问题的小伙伴看到这篇文章,可以解决你们的问题!!!

 

以上是关于解决SpringCloud Gateway Finchley.SR2服务宕机,不走熔断报fallbackCmd failed and fallback failed.问题的主要内容,如果未能解决你的问题,请参考以下文章

springcloud gateway概念精讲

SpringCloud-2.0-周阳:(12. 服务网关 - Gateway)

SpringCloud Gateway

微服务权限终极解决方案(spring-cloud-gateway-oauth2)

API网关:SpringCloud Gateway

SpringCloud Gateway全链路实现