Zuul内部整合了Hystrix组件,也就是说具有错误熔断的功能,那么如何自定义熔断后的输出结果呢?比如状态、响应码、响应报文等信息。
•只需要自定义类实现ZuulFallbackProvider接口,重写下面的方法即可:
•public String getRoute() 自定义需要熔断的服务
•public ClientHttpResponse fallbackResponse() 自定义失败响应信息
OrderServiceZuulFallBackProvider:
package com.cc.springcloud;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;
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;
@SuppressWarnings("deprecation") //忽略Deprecated(废弃),新版本改为FallbackProvider
//@Component //注释掉不用此接口了,在第五个版本后而废弃
public class OrderServiceZuulFallBackProvider implements ZuulFallbackProvider{
//指定快速熔断的服务
@Override
public String getRoute() {
return "order-service";
}
//配置熔断后的响应信息及响应码
@Override
public ClientHttpResponse fallbackResponse() {
return new ClientHttpResponse() {
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("order-service is not avaliable!".getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
return headers;
}
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.BAD_REQUEST;
}
@Override
public int getRawStatusCode() throws IOException {
return this.getStatusCode().value();
}
@Override
public String getStatusText() throws IOException {
return this.getStatusCode().getReasonPhrase();
}
@Override
public void close() {
// TODO Auto-generated method stub
}
};
}
}
-----------------------------------------------------------------------------------------------
OrderServiceFallBackProvider:
package com.cc.springcloud;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
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;
@Component
public class OrderServiceFallBackProvider implements FallbackProvider{
@Override
public String getRoute() {
return "order-service";
}
@Override
public ClientHttpResponse fallbackResponse() {
// TODO Auto-generated method stub
return null;
}
//新增异常获取,细粒度提供定位
@Override
public ClientHttpResponse fallbackResponse(Throwable cause) {
return new ClientHttpResponse() {
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("order-service is not avaliable!".getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
return headers;
}
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.BAD_REQUEST;
}
@Override
public int getRawStatusCode() throws IOException {
return this.getStatusCode().value();
}
@Override
public String getStatusText() throws IOException {
return this.getStatusCode().getReasonPhrase();
}
@Override
public void close() {
// TODO Auto-generated method stub
}
};
}
}