很多时候,由于服务的重启、宕机或者网络的不佳,Zuul进行路由时会出现异常,然后,异常信息直接展示给用户是不友好的, 需要我们提示一些通俗易懂的信息告知用户为什么会出现失败,这时就可以用到回退处理,SpringCloud中使用Hystrix实现微服务的容错与回退,其实Zuul默认已经整合了Hystrix
本文讲解Zuul如何实现回退策略,Hystrix组件不了解的话大家可以前往我的这篇文章:SpringCloud组件之Hystrix
一、实现FallbackProvider接口
本文用的Zuul服务为前几篇文章所搭建的,这里不在搭建Zuul服务,对Zuul不了解的话可以查看之前的文章:SpringCloud组件之Zuul
/**
* @author Gjing
**/
@Component
public class GlobalFallback implements FallbackProvider {
/**
* 这里配置是为哪个服务提供回退,*号代表所有服务
*/
@Override
public String getRoute() {
return "*";
}
/**
* 回退返回
*/
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
@Override
@NonNull
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.BAD_REQUEST;
}
@Override
public int getRawStatusCode() throws IOException {
return HttpStatus.BAD_REQUEST.value();
}
@Override
@NonNull
public String getStatusText() throws IOException {
return HttpStatus.BAD_REQUEST.getReasonPhrase();
}
@Override
public void close() {
}
@Override
@NonNull
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("服务器异常请稍后再试".getBytes(StandardCharsets.UTF_8));
}
@Override
@NonNull
public HttpHeaders getHeaders() {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
return httpHeaders;
}
};
}
}
相关方法介绍
方法名 | 说明 |
---|---|
getRoute | 为哪个服务提供回退,*号代表所有服务 |
fallbackResponse | 回退响应 |
getStatusCode | 回退时的状态码 |
getRawStatusCode | 数字类型状态码 |
getStatusText | 状态文本 |
close | 这个不用管 |
getBody | 响应体 |
getHeaders | 返回的响应头 |
二、配置超时时间
# 负载均衡超时时间设置
ribbon:
ReadTimeout: 读超时时间(单位毫秒)
socketTimeOut: 连接超时时间(单位毫秒)
注意!!!:如果zuul配置了熔断fallback的话,熔断超时也要配置,不然如果你配置的ribbon超时时间大于熔断的超时(Hystirx超时默认1秒),那么会先走熔断,相当于你配的ribbon超时就不生效了,ribbon和hystrix是同时生效的,哪个值小哪个生效,另一个就看不到效果了。
hystrix:
command:
# default为默认所有,可以配置指定服务名
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 超时时间(单位毫秒)
三、启动Eureka、Zuul和一个Web服务,并在web服务接口设置线程休眠,模拟超时,当请求实际达到设置的超时时间后会进行回退
本文到此就结束了,合理的配置超时时间和回退,有助于让程序体验性更好哦,具体还是要视实际业务场景而定哦,本Demo源代码地址为:SpringCloud-Demo