首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring后备服务

Spring后备服务
EN

Stack Overflow用户
提问于 2017-06-19 14:05:14
回答 3查看 2.7K关注 0票数 4

是否可以将代理设置到主服务器/服务器/服务,但如果没有,则将请求重定向到辅助服务器/服务器/服务?

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

我们不使用尤里卡,只有固定的IP。

代码语言:javascript
复制
zuul:
  routes:
    whatever:
      path: /whatever/**
      sensitiveHeaders: Cookie,Set-Cookie
      url: http://server1:8080/whatever

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

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-16 09:25:08

如果有人试图做类似的事情,那么实际工作的是Hystrix,而不是Zuul组件。

在Gateway API中,我们创建了一个facade控制器,该控制器响应我们希望设置回退解决方案的服务:

代码语言:javascript
复制
@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将开始调用回退服务,而不会返回一个不可用的服务,更改只需几毫秒。

另外,如果你把它打开,它就会在准备好几毫秒后返回响应。

票数 4
EN

Stack Overflow用户

发布于 2017-06-20 02:33:05

您可以使用ZuulFallbackProvider来实现这一点,但是您需要首先配置下面的内容。

首先,在Zuul中直接在zuul.routes.<service>.url中指定url的url路由在HystrixCommand中没有执行.要实现这一点,您需要像下面这样更改您的配置。

代码语言:javascript
复制
zuul:
  routes:
    whatever:
      path: /whatever/**
      sensitiveHeaders: Cookie,Set-Cookie
      serviceId: whatever
      stripPrefix: false

ribbon:
  eureka:
    enabled: false

whatever:
  ribbon:
    listOfServers: http://server1:8080/

上面的配置使用的是没有eureka的丝带。你可以找到detais 这里

现在,您的请求将通过丝带在HystrixCommand中执行。这样您就可以提供自己的ZuulFallbackProvider。

在ZuulFallbackProvider中,您可以在fallbackResponse方法中向http://server2:8080/whateverApi2.发出回退请求,如下所示。下面是一个非常天真的例子。-为了自己的目的,你需要完成以下例子。

代码语言:javascript
复制
@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();
            }
        };
    }
}
票数 6
EN

Stack Overflow用户

发布于 2020-08-26 12:01:51

需要添加可还原

代码语言:javascript
复制
zuul:
  routes:
    whatever:
      path: /whatever/**
      sensitiveHeaders: Cookie,Set-Cookie
      url: http://server1:8080/whatever
      retryable=true

相似情况

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44632767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档