您可以使用
ZuulFallbackProvider
来实现此功能,但首先需要进行以下配置。
首先,在Zuul中直接指定
zuul.routes.<service>.url
的URL路由不会在HystrixCommand中执行。为了实现这一点,您需要像下面这样更改配置。
zuul:
routes:
whatever:
path: /whatever/**
sensitiveHeaders: Cookie,Set-Cookie
serviceId: whatever
stripPrefix: false
ribbon:
eureka:
enabled: false
whatever:
ribbon:
listOfServers: http://server1:8080/
上述配置是在不使用Eureka的情况下使用Ribbon。你可以在此处找到详细信息。
(链接)
现在,你的请求将通过Ribbon执行HystrixCommand。因此,你可以提供自己的ZuulFallbackProvider。
在ZuulFallbackProvider中,你可以像以下示例代码一样,在
fallbackResponse
方法中向你的
http://server2:8080/whateverApi2.
发起回退请求。下面是一个非常简单的示例 :-) 你需要根据自己的目的完成以下示例。
@Component
public class TestZuulFallbackProvider implements ZuulFallbackProvider{
@Override
public String getRoute() {
return "test";
}
@Override
public ClientHttpResponse fallbackResponse() {
ResponseEntity<String> response = new RestTemplate().exchange("http://server2:8080/whateverApi2", HttpMethod.GET, null, String.class);
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return response.getStatusCode();
}
@Override
public int getRawStatusCode() throws IOException {
return response.getStatusCodeValue();
}
@Override
public String getStatusText() throws IOException {
return response.getStatusCode().getReasonPhrase();
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream(response.getBody().getBytes("UTF-8"));
}
@Override
public HttpHeaders getHeaders() {
return response.getHeaders();
}
};
}
}