packagecn.arebirth.fallback;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;importorg.springframework.http.HttpHeaders;importorg.springframework.http.HttpStatus;importorg.springframework.http.MediaType;importorg.springframework.http.client.ClientHttpResponse;importorg.springframework.stereotype.Component;importjava.io.ByteArrayInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.nio.charset.Charset;
@Componentpublic class ProductProviderFallback implementsFallbackProvider {private final Logger logger = LoggerFactory.getLogger(ProductProviderFallback.class);/*** getRoute方法的返回值就是要监听的挂掉的微服务的名字
* 如果需要所有服务都走这个熔断回退,则return "*" 或 return null
*
*@return
*/@OverridepublicString getRoute() {return "*";
}/*** 当服务无法执行的时候,返回托底信息
*
*@paramroute
*@paramcause
*@return
*/@OverridepublicClientHttpResponse fallbackResponse(String route, Throwable cause) {
logger.info("--> route:{}进行熔断降级", route);return newClientHttpResponse() {/*** ClientHttpResponse的fallback的状态码
*@return*@throwsIOException*/@Overridepublic HttpStatus getStatusCode() throwsIOException {returnHttpStatus.OK;
}/*** ClientHttpResponse的fallback的状态码
*@return*@throwsIOException*/@Overridepublic int getRawStatusCode() throwsIOException {return this.getStatusCode().value();
}/*** ClientHttpResponse的fallback的状态码
*@return*@throwsIOException*/@Overridepublic String getStatusText() throwsIOException {return this.getStatusCode().getReasonPhrase();
}/*** Close this response, freeing any resources created.*/@Overridepublic voidclose() {
}/*** 设置响应体
*@return*@throwsIOException*/@Overridepublic InputStream getBody() throwsIOException {
String content= "商品服务不可用,请与管理员联系";return newByteArrayInputStream(content.getBytes());
}/*** 设置响应头信息
*@return
*/@OverridepublicHttpHeaders getHeaders() {
HttpHeaders headers= newHttpHeaders();
MediaType mt= new MediaType("application", "json", Charset.forName("utf-8"));
headers.setContentType(mt);returnheaders;
}
};
}
}