2017-06-19 154 views
1

是否可以为主服务器/服务器/服务设置代理,但是如果不可用,请将请求重定向到次级服务器/服务器/服务?Spring Cloud Zuul后退服务

辅助服务不是主要服务的同一类型的实例。他们的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

谢谢。

回答

4

如果有人试图做类似的东西,什么是真正的工作是不使用任何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接口,每一个指向每个服务端点。

就是这样!如果关闭主服务,Gateway API将开始调用回退服务,而不会返回单个服务不可用,并且更改只需几毫秒。另外,如果您再次打开它,准备就绪后也会回复几毫秒。

3

您可以使用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(); 
      } 
     }; 
    } 
} 
+0

感谢您的回答。我不会将其标记为解决方案,只是为了查看是否有任何“仅配置”替代方案。我将使用您的解决方案,甚至可以在使用完整的Spring云基础架构时直接使用Netflix OSS组件之一而不是RestTemplate。 –

+0

我终于回到了这个问题,并尝试了这种方法。但ZuulFallbackProvider是一个静态回退。是否有任何Zuul,Ribbon或Hystrix将请求重定向到我的备用服务?我不希望它添加到功能区服务器列表中,因为我希望它作为最后的手段执行,仅当服务器关闭时才会执行。 –

+1

如果您不想使用hystrix后退,我认为另一种可能的方法是制作您自己的完整'路由'或'后置'过滤器。在您的过滤器中,您可以检查原始请求的结果,然后使用适当的参数将请求转发给备用服务器。 –

相关问题