我的环境就是使用了zuul来控制全局回退异常,如果其中任何一个服务导致连接超时或者其它异常,都将通过zuul进行回退异常。
网关核心类如下:该类的作用就是控制了所有注册到eureka上面的服务的-全局异常处理。
/**
*@Component 这个注解就是说将它注册到服务中去(也就是spring容器中)
*它和@Bean 大同小异 @Bean也是注册到spring容器中,只不过它是基于配置类使用
*再加上 @Configuration 注解就行了
**/
@Component
public class ServiceFallbackProvider implements ZuulFallbackProvider {
//这个就是控制所有服务经过网关访问时可能出现的异常捕捉
@Override
public String getRoute() {
return "*";
}
//重写回退方法体
@Override
public ClientHttpResponse fallbackResponse() {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
return 200;
}
@Override
public String getStatusText() throws IOException {
return "OK";
}
@Override
public void close() {
}
//这个就是控制全局异常的核心方法
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("服务故障,请稍后重试!".getBytes());
}
//设置编码为utf-8
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
return headers;
}
};
}
}
网关配置如下:截取解决此次其它服务超时连接异常的代码
#设置调用者等待命令执行得超时限制,超过此时间,hystrixCommand被标记未TIMEOUT,并执行回退逻辑
#默认值1000 毫秒=1秒
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
#ribbon 超时时间配置 以毫秒为单位
ribbon:
#正常情况下,当客户端向服务器端发送请求时,如果网络很差,就会无法响应内容,这里可以设置为1分钟,如果1分钟访问不到则抛出超时异常
ReadTimeout: 60000
#这个指建立连接所用的时间,适应于网络正常情况下,如果1分钟未建立连接,抛出异常
ConnectTimeout: 60000
#这个表示在响应非正常情况时,表示开启重试机制,
spring:
cloud:
loadbalancer:
retry:
enabled: true
这样问题就解决了。~~~