Spring Cloud Zuul 回退服务

Ric*_*oli 4 spring spring-cloud netflix-zuul

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

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

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

zuul:
  routes:
    whatever:
      path: /whatever/**
      sensitiveHeaders: Cookie,Set-Cookie
      url: http://server1:8080/whatever
Run Code Online (Sandbox Code Playgroud)

我看了一下ZuulFallbackProvider,但是这个接口是为了在错误的情况下提供一个固定的响应。我想,当http://server1:8080/whatever没有响应时,重定向到http://server2:8080/whateverApi2

谢谢。

yon*_*oon 6

您可以使用 来做到这一点ZuulFallbackProvider,但您需要先配置以下内容。

首先,url-routing -zuul.routes.<service>.url在 Zuul 中直接指定 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/
Run Code Online (Sandbox Code Playgroud)

上面的配置是使用Ribbon,没有eureka。你可以在这里找到详细信息

现在,您的请求将通过功能区在 HystrixCommand 中执行。所以你可以提供你自己的 ZuulFallbackProvider。

在 ZuulFallbackProvider 中,您可以向您的http://server2:8080/whateverApi2.infallbackResponse方法发出回退请求,如下所示。下面是一个非常幼稚的例子。:-) 您需要根据自己的目的完成以下示例。

@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();
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)