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
是否可以设置主服务器的代理 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