您可以使用ZuulFallbackProvider
来实现,但需要先配置下面的第一个。
首先,url-routing - 直接在zuul.routes.<service>.url
中指定url - 在Zuul中不会在HystrixCommand中执行。要实现这一点,您需要像下面那样更改您的配置。
zuul:
routes:
whatever:
path: /whatever/**
sensitiveHeaders: Cookie,Set-Cookie
serviceId: whatever
stripPrefix: false
ribbon:
eureka:
enabled: false
whatever:
ribbon:
listOfServers: http://server1:8080/
上述配置使用没有尤里卡的功能区。您可以找到detai here
现在,您的请求将通过功能区在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();
}
};
}
}
感谢您的回答。我不会将其标记为解决方案,只是为了查看是否有任何“仅配置”替代方案。我将使用您的解决方案,甚至可以在使用完整的Spring云基础架构时直接使用Netflix OSS组件之一而不是RestTemplate。 –
我终于回到了这个问题,并尝试了这种方法。但ZuulFallbackProvider是一个静态回退。是否有任何Zuul,Ribbon或Hystrix将请求重定向到我的备用服务?我不希望它添加到功能区服务器列表中,因为我希望它作为最后的手段执行,仅当服务器关闭时才会执行。 –
如果您不想使用hystrix后退,我认为另一种可能的方法是制作您自己的完整'路由'或'后置'过滤器。在您的过滤器中,您可以检查原始请求的结果,然后使用适当的参数将请求转发给备用服务器。 –