简介
重试,相信大家都不陌生,在springcloud中,ribbon、feign都有重试的机制,可以有效的处理服务的单点故障,或者因为网络的波动,导致首次的请求失败。网关也有自己的重试机制。
代码实现
网关实现重试也相对简单,官方已经为我们提供了现成 的filter,不需要引入任何依赖就可以到达重试机制。
yml
spring:
application:
name: gateway-service
redis:
host: 127.0.0.1
port: 6379
database: 0
password: 123456
cloud:
gateway:
discovery:
locator:
#是否与服务发现组件结合,通过serviceId转发到具体的实例。默认为false,设为true开始根据serviceId创建路由功能
enabled: false
#是将请求路径上的服务名配置为小写(因为服务注册的时候,向注册中心注册时将服务名转成大写的了)
lower-case-service-id: true
routes:
#自定义 全局唯一路由ID
- id: feign-service
#uri以lb://开头(lb代表从注册中心获取服务),后面接的就是你需要转发到的服务名称
uri: lb://FEIGN-SERVICE
#谓词
predicates:
#匹配路由 http://ip:port/feign/** 的请求
- Path=/feign/**
#过滤器
filters:
#剥离请求路径 例如 http://ip:port/feign/FEIGN-SERVICE/hello ==> http://ip:port/FEIGN-SERVICE/hello
- StripPrefix=1
#重试
- name: Retry
args:
#重试次数,默认值是3次
retries: 3
##状态码配置,和series不同的是这边是具体状态码的配置,取值请参考:org.springframework.http.HttpStatus
statuses:
- BAD_GATEWAY
#状态码配置(分段),符合的某段状态码才会进行重试逻辑,默认值是SERVER_ERROR,值是5,也就是5XX(5开头的状态码),共有5个值:
series:
- SERVER_ERROR
#定哪些方法的请求需要进行重试逻辑,默认值是GET方法,取值如下:
methods:
- GET
在microservice-feign新增接口,throw一个异常信息,来达到重试的目的。
@GetMapping("/retry")
public String retry(Integer parm){
log.info(" 接收到请求 ");
if(parm == 1){
throw new RuntimeException("error");
}
return " retry! ";
}