Spring Cloud Zuul 回退服务

Spring Cloud Zuul fallback service

是否可以设置主服务器的代理 server/servers/service,但是当这不可用时,将请求重定向到辅助服务器 server/servers/service?

次要服务不是与主要服务相同类型的实例。他们的 API 兼容但不相同。当主要资源不可用时,辅助资源是性能较差的最后资源。

我们还没有使用 Eureka,只使用固定 IP。

zuul:
  routes:
    whatever:
      path: /whatever/**
      sensitiveHeaders: Cookie,Set-Cookie
      url: http://server1:8080/whatever

我查看了 ZuulFallbackProvider,但此接口是为了在出现错误时提供固定响应。我要,当http://server1:8080/whatever is not responding, redirect to http://server2:8080/whateverApi2.

谢谢。

您可以使用 ZuulFallbackProvider 执行此操作,但您需要先配置以下内容。

首先,url-路由 - 直接在 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/

以上配置使用的是没有eureka的Ribbon。您可以找到详细信息 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();
            }
        };
    }
}

如果有人试图做类似的事情,那么实际起作用的是 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

相似situation