在项目中,遇到网关Gateway路由的服务宕机,但是最后并没有走熔断的重定向。
在Gateway的application.yml文件中有配置:
filters:
- RewritePath=/olesellercenter/(?
#路由重写
- 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请求的方式不走熔断的机制。
网上看了很多资料,也有很多相似的问题,希望有相同问题的小伙伴看到这篇文章,可以解决你们的问题!!!