SpringCloud使用Zuul进行容错回退

简介: Zuul进行回退处理

很多时候,由于服务的重启、宕机或者网络的不佳,Zuul进行路由时会出现异常,然后,异常信息直接展示给用户是不友好的, 需要我们提示一些通俗易懂的信息告知用户为什么会出现失败,这时就可以用到回退处理,SpringCloud中使用Hystrix实现微服务的容错与回退,其实Zuul默认已经整合了Hystrix

本文讲解Zuul如何实现回退策略,Hystrix组件不了解的话大家可以前往我的这篇文章:SpringCloud组件之Hystrix

一、实现FallbackProvider接口

本文用的Zuul服务为前几篇文章所搭建的,这里不在搭建Zuul服务,对Zuul不了解的话可以查看之前的文章:SpringCloud组件之Zuul

/**
 * @author Gjing
 **/

@Component
public class GlobalFallback implements FallbackProvider {
    /**
     * 这里配置是为哪个服务提供回退,*号代表所有服务
     */
    @Override
    public String getRoute() {
        return "*";
    }

    /**
     * 回退返回
     */
    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
        return new ClientHttpResponse() {
            @Override
            @NonNull
            public HttpStatus getStatusCode() throws IOException {
                return HttpStatus.BAD_REQUEST;
            }

            @Override
            public int getRawStatusCode() throws IOException {
                return HttpStatus.BAD_REQUEST.value();
            }

            @Override
            @NonNull
            public String getStatusText() throws IOException {
                return HttpStatus.BAD_REQUEST.getReasonPhrase();
            }

            @Override
            public void close() {

            }

            @Override
            @NonNull
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream("服务器异常请稍后再试".getBytes(StandardCharsets.UTF_8));
            }

            @Override
            @NonNull
            public HttpHeaders getHeaders() {
                HttpHeaders httpHeaders = new HttpHeaders();
                httpHeaders.setContentType(MediaType.APPLICATION_JSON);
                return httpHeaders;
            }
        };
    }
}

相关方法介绍

方法名 说明
getRoute 为哪个服务提供回退,*号代表所有服务
fallbackResponse 回退响应
getStatusCode 回退时的状态码
getRawStatusCode 数字类型状态码
getStatusText 状态文本
close 这个不用管
getBody 响应体
getHeaders 返回的响应头

二、配置超时时间

# 负载均衡超时时间设置
ribbon:
  ReadTimeout: 读超时时间(单位毫秒)
  socketTimeOut: 连接超时时间(单位毫秒)

注意!!!:如果zuul配置了熔断fallback的话,熔断超时也要配置,不然如果你配置的ribbon超时时间大于熔断的超时(Hystirx超时默认1秒),那么会先走熔断,相当于你配的ribbon超时就不生效了,ribbon和hystrix是同时生效的,哪个值小哪个生效,另一个就看不到效果了

hystrix:
  command:
   # default为默认所有,可以配置指定服务名
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 超时时间(单位毫秒)

三、启动Eureka、Zuul和一个Web服务,并在web服务接口设置线程休眠,模拟超时,当请求实际达到设置的超时时间后会进行回退

1562037222_1_

本文到此就结束了,合理的配置超时时间和回退,有助于让程序体验性更好哦,具体还是要视实际业务场景而定哦,本Demo源代码地址为:SpringCloud-Demo

目录
相关文章
|
4月前
|
消息中间件 NoSQL Java
Spring Cloud项目实战Spring Cloud视频教程 含源码
Spring Cloud项目实战Spring Cloud视频教程 含源码
84 1
|
4月前
|
监控 Java API
Spring cloud Hystrix 、Dashboard、API(zuul)相关报错
Spring cloud Hystrix 、Dashboard、API(zuul)相关报错
50 2
|
23天前
|
Java Spring
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
|
23天前
|
Java Spring 容器
【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM
【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM
|
23天前
|
存储 Java Spring
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
|
23天前
|
SQL Java 数据库连接
【Azure Spring Cloud】Azure Spring Cloud connect to SQL using MSI
【Azure Spring Cloud】Azure Spring Cloud connect to SQL using MSI
|
23天前
|
Java 开发工具 Spring
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
|
24天前
|
NoSQL Java Redis
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
|
24天前
|
Java Spring
【Azure 应用服务】记一次Azure Spring Cloud 的部署错误 (az spring-cloud app deploy -g dev -s testdemo -n demo -p ./hellospring-0.0.1-SNAPSHOT.jar --->>> Failed to wait for deployment instances to be ready)
【Azure 应用服务】记一次Azure Spring Cloud 的部署错误 (az spring-cloud app deploy -g dev -s testdemo -n demo -p ./hellospring-0.0.1-SNAPSHOT.jar --->>> Failed to wait for deployment instances to be ready)
|
24天前
|
Java Maven Python
【Azure Spring Cloud】部署Azure spring cloud 失败
【Azure Spring Cloud】部署Azure spring cloud 失败