使用Zuul进行请求分发的过程中,当后端服务出现超时异常的时候,服务可以像hystrix熔断器一样进行降级操作,就需要我们设置路由熔断,提供快速失败返回预设的信息。

启动类中增加@EnableZuulProxy注解

新建类实现ZuulFallbackProvider接口,可以查看异常信息

getRoute()方法,指定对某个服务访问出现问题时进行熔断处理,如果支持所有的服务都快速失败,则返回null或者*即可

fallbackResponse()方法,自定义返回值来处理错误请求

自定义的一个fallback实现类的模板

package com.qiangqiang.fallback;

import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

@Component
public class ZuulFallback implements FallbackProvider {

/**
* 返回fallback处理哪个服务,返回的是服务名称
* 如果支持所有的服务都快速失败,则返回null或者*即可
* @return
*/
@Override
public String getRoute() {
return "*";
}

/**
* 服务容错处理
* @param route 容错服务名称
* @param cause 服务异常信息
* @return
*/
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}

@Override
public int getRawStatusCode() throws IOException {
return 500;
}

@Override
public String getStatusText() throws IOException {
return "error";
}

@Override
public void close() {

}

@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("The service is unavailable.".getBytes());
}

@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
}