package club.mydlq.demo; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.netflix.hystrix.exception.HystrixTimeoutException; import lombok.extern.slf4j.Slf4j; 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.InputStream; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; /** * 服务降级 */ @Slf4j @Component public class ServiceFallbackProvider implements FallbackProvider { private static final ObjectMapper objectMapper = new ObjectMapper(); @Override public String getRoute() { // 可以单独指定 ServiceID,也可以设置“*”即为设置全部服务 return "SPRINGBOOT-ADMIN-DEMO"; } @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { if (cause instanceof HystrixTimeoutException) { return response(HttpStatus.GATEWAY_TIMEOUT); } else { return response(HttpStatus.INTERNAL_SERVER_ERROR); } } private ClientHttpResponse response(final HttpStatus status) { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() { return status; } @Override public int getRawStatusCode() { return status.value(); } @Override public String getStatusText() { return status.getReasonPhrase(); } @Override public void close() { } @Override public InputStream getBody() throws JsonProcessingException { Map map = new HashMap<>(); map.put("code", "501"); map.put("message", "后台服务异常"); String json = objectMapper.writeValueAsString(map); return new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8)); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return headers; } }; } }