您可以使用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後退,我認爲另一種可能的方法是製作您自己的完整'路由'或'後置'過濾器。在您的過濾器中,您可以檢查原始請求的結果,然後使用適當的參數將請求轉發給備用服務器。 –