![](/img/trans.png)
[英]Spring Cloud: How to define default fallback for Hystrix in Zuul gateway?
[英]Spring Cloud Zuul fallback service
是否可以設置到主服務器/服務器/服務的代理,但是當這不可用時,將請求重定向到輔助服務器/服務器/服務?
次要服務不是與主要服務相同類型的實例。 它們的 API 兼容但不相同。 當主要資源不可用時,次要資源是性能較差的最后一個資源。
我們還沒有使用 Eureka,只使用固定 IP。
zuul:
routes:
whatever:
path: /whatever/**
sensitiveHeaders: Cookie,Set-Cookie
url: http://server1:8080/whatever
我看過ZuulFallbackProvider
,但是這個接口是為了在錯誤的情況下提供一個固定的響應。 我想,當http://server1:8080/whatever沒有響應時,重定向到http://server2:8080/whateverApi2 。
謝謝。
您可以使用ZuulFallbackProvider
做到這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/
上面的配置是使用Ribbon,沒有eureka。 你可以在這里找到詳細信息
現在,您的請求將通過功能區在 HystrixCommand 中執行。 所以你可以提供你自己的 ZuulFallbackProvider。
在 ZuulFallbackProvider 中,您可以向http://server2:8080/whateverApi2.
發出回退請求http://server2:8080/whateverApi2.
在fallbackResponse
方法中,如下所示。 下面是一個非常幼稚的例子。 :-) 您需要根據自己的目的完成以下示例。
@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();
}
};
}
}
如果有人試圖做類似的事情,那么真正有效的是 Hystrix 而不是 Zuul 組件。
在網關 API 中,我們創建了一個外觀控制器來響應我們想要設置回退解決方案的服務:
@HystrixCommand(fallbackMethod = "fallbackWhatever")
@PostMapping
ResponseEntity<Object> whatever(final RequestEntity<?> request) {
return defaultClient.searchSubmissions(request.getHeaders(), request.getBody());
}
ResponseEntity<Object> fallbackWhatever(final RequestEntity<?> request) {
return fallbackClient.searchSubmissions(request.getHeaders(), request.getBody());
}
defaultClient 和 fallbackClient 是兩個不同的 FeignClient 接口,每個接口都指向每個服務端點。
就是這樣! 如果您關閉主服務,網關 API 將開始調用回退服務,而不會返回任何不可用的服務,更改只需幾毫秒。
此外,如果您重新打開它,它也會在准備好幾毫秒后重新響應。
需要添加可重試
zuul:
routes:
whatever:
path: /whatever/**
sensitiveHeaders: Cookie,Set-Cookie
url: http://server1:8080/whatever
retryable=true
類似情況
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.