当我们使用 @EnableZuulProxy 注解来开启zuul的路由时,默认在@EnableZuulProxy注解上就包含@EnableCircuitBreaker注解,即开启了断路器功能。那么在zuul无法访问到某个微服务时,如何进行回退呢?

需求:

现在我们有2个微服务,product-provider(商品微服务) product-consumer-8201(商品消费微服务),现在我们使用 zuul 来路由访问这2个微服务,对 product-provider 微服务来进行回退处理,另外一个不做处理,看返回的结果是什么。

实现:

一、编写网关回退代码

    对product-provider回退,对 product-consumer-8201不进行回退

package com.huan.study.zuul.fallback;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import com.netflix.hystrix.exception.HystrixTimeoutException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Map; /**
* <pre>
* 服务回退
* 建议实现 FallbackProvider 接口,这个接口可以拿到发生回退的原因,可以根据具体的异常返回不同的信息到前台
* ZuulFallbackProvider 这个接口,已经被标记成过时了,不要在使用。
* </pre>
*
* @author huan.fu
* @date 2018/6/13 - 11:50
*/
@Component
@Slf4j
public class ProductProviderFallbackProvider implements FallbackProvider { @Override
public String getRoute() {
// 返回 null 或者 * 表示为所谓路由的服务提供一个默认的回退实现
return "product-provider";
} @Override
public ClientHttpResponse fallbackResponse(final Throwable cause) {
log.info("zuul error:", cause);
if (cause instanceof HystrixTimeoutException) {
return response(HttpStatus.GATEWAY_TIMEOUT);
} else {
return fallbackResponse();
}
} @Override
public ClientHttpResponse fallbackResponse() {
return response(HttpStatus.INTERNAL_SERVER_ERROR);
} private ClientHttpResponse response(final HttpStatus status) {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() {
return status;
} @Override
public int getRawStatusCode() {
return status.value();
} @Override
public String getStatusText() {
return status.getReasonPhrase();
} @Override
public void close() {
} @Override
public InputStream getBody() throws JsonProcessingException {
Map<String, Object> ret = Maps.newHashMap();
ret.put("msg", "商品服务不可用");
ret.put("code", -999999);
return new ByteArrayInputStream(new ObjectMapper().writeValueAsBytes(ret));
} @Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
}

注意:

          1、需要实现回退接口: FallbackProvider,而不要实现 ZuulFallbackProvider 接口

          2、FallbackProvider可以拿到发生回退的异常信息,根据异常信息可以给前台返回不同信息

          3、ZuulFallbackProvider这个接口现在已经过时了

4、这个类需要被 Spring 管理即可

          5、getRoute() 方法中返回的服务Id的值,即需要为那个服务发生回退,如果要为所有的服务发生回退那么可以写 null 或 写 * 号。

二、pom文件中网关路由的配置

# 服务网关配置
zuul:
ignored-services: "*" # 忽略所有的微服务
routes:
product-route-name:
path: /product/**
serviceId : product-provider
product-consumer-8201: /product-consumer/**

三、运行结果


   可以看到,当只启动网关和注册中心时,product-provider和product-consumer-8201不启动时,访问 product-provider时发生了回退,访问 product-consumer-8201时发生了异常,即没有回退。

完整代码

zuul 网关回退代码: https://gitee.com/huan1993/spring-cloud-parent/tree/master/zuul/product-gateway-fallbackprovider-8206

spring cloud zuul的回退的更多相关文章

  1. Spring Cloud Zuul 网关服务的fallback

    当我们的zuul进行路由分发时,如果后端服务没有启动,或者调用超时,这时候我们希望Zuul提供一种降级功能,而不是将异常暴露出来. Spring cloud zuul提供这种降级功能,操作步骤如下: ...

  2. Spring Cloud Zuul 添加 ZuulFilter

    紧接着上篇随笔Spring Cloud Zuul写,添加过滤器,进行权限验证 1.添加过滤器 package com.dzpykj.filter; import java.io.IOException ...

  3. Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。

    时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...

  4. 笔记:Spring Cloud Zuul 快速入门

    Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了 ...

  5. Spring Cloud Zuul 限流详解(附源码)(转)

    在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...

  6. Spring Cloud Zuul 中文文件上传乱码

    原文地址:https://segmentfault.com/a/1190000011650034 1 描述 使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”.1. ...

  7. spring cloud zuul参数调优

    zuul 内置参数 zuul.host.maxTotalConnections 适用于ApacheHttpClient,如果是okhttp无效.每个服务的http客户端连接池最大连接,默认是200. ...

  8. Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务

    API 网关的出现的原因是微服务架构的出现,不同的微服务一般会有不同的服务地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会 ...

  9. spring cloud: zuul(四): 正则表达式匹配其他微服务(给其他微服务加版本号)

    spring cloud: zuul(四): 正则表达式匹配其他微服务(给其他微服务加版本号) 比如我原来有,spring-boot-user微服务,后台进行迭代更新,另外其了一个微服务: sprin ...

随机推荐

  1. matlab纹理映射之地球

    %地球 cla reset; load topo; [x,y,z] = sphere(45); s = surface(x,y,z,'facecolor','texturemap','cdata',t ...

  2. VSCode一些设置

    //每次保存后自动格式化 "editor.formatOnSave": true, // #每次保存的时候将代码按eslint格式进行修复 "editor.codeAct ...

  3. JDK7u21反序列化详解

    目录 前言 环境 倒序分析 TemplatesImpl AnnotationInvocationHandler HashMap 总结 前言 听说jdk7u21的反序列化涉及的知识量很多,很难啃,具体来 ...

  4. 一文了解Promise使用与实现

    前言 Promise 作为一个前端必备技能,不管是从项目应用还是面试,都应该对其有所了解与使用. 常常遇到的面试五连问: 说说你对 Promise 理解? Promise 的出现解决了什么问题? Pr ...

  5. 使用 elementUI 树形控件Tree 编辑数据

    操作新增/编辑功能时初始化数据: 应用属性 default-checked-keys 给Tree节点赋默认值(赋值数据为节点数组Arr)前,应先清空数组Arr,并且配合使用 this.$refs.tr ...

  6. 动态规划精讲(一)A单串

    单串 单串 dp[i] 线性动态规划最简单的一类问题,输入是一个串,状态一般定义为 dp[i] := 考虑[0..i]上,原问题的解,其中 i 位置的处理,根据不同的问题,主要有两种方式: 第一种是 ...

  7. form表单提交失败

    在使用一个登录/注册模板的时候,发现form表单不了,但是删除模板引用的js后就正常了,查看js文件的源码,有一个 const firstForm = document.getElementById( ...

  8. Writing in the Science 01

    INTRODUCTION What makes good writing? Good writing communicates an idea clearly and effectively. Goo ...

  9. 使用正则表达式在VS中批量移除 try-catch

    使用正则表达式在VS中批量移除 try-catch 前言 try-catch 意为捕获错误,一般在可能出错的地方使用(如调用外部函数或外部设备),以对错误进行正确的处理,并进行后续操作而不至于程序直接 ...

  10. 好未来数据中台 Node.js BFF实践(一):基础篇

    好未来数据中台 Node.js BFF实践系列文章列表: 基础篇 实战篇(TODO) 进阶篇(TODO) 好未来数据中台的Node.js中间层从7月份开始讨论可行性,截止到9月已经支持了4个平台,其中 ...