当我们使用 @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. 浅谈KMP模式匹配算法

    普通的模式匹配算法(BF算法) 子串的定位操作通常称为模式匹配算法 假设有一个需求,需要我们从串"a b a b c a b c a c b a b"中,寻找内容为"a ...

  2. 对easyui-validatebox的验证类型的扩展--补充

    一.说明 这篇文章是<对easyui-validatebox的验证类型的扩展>的补充.在工程的持续开发中,我们又对此进行了更多的补充. 二.补充代码 增加了更多的验证类型. /* * 比较 ...

  3. 远程线程注入DLL突破session 0 隔离

    远程线程注入DLL突破session 0 隔离 0x00 前言 补充上篇的远程线程注入,突破系统SESSION 0 隔离,向系统服务进程中注入DLL. 0x01 介绍 通过CreateRemoteTh ...

  4. 从 1 开始学 JVM 系列 | JVM 类加载器(一)

    从 1 开始学 JVM 系列 类加载器,对于很多人来说并不陌生.我自己第一次听到这个概念时觉得有点"高大上",觉得只有深入 JDK 源码才会触碰到 ClassLoader,平时都是 ...

  5. 学习Tomcat(三)之容器连接器

    Tomcat最底层使用的是Java标准的SocketServer和Socket接受和处理请求,但是Socket接受到的数据是网络运输层的TCP或UDP协议的数据,需要转为Http或者其它应用层协议的数 ...

  6. 制作nginx+php的docker镜像方法

    制作nginx+php的docker镜像方法一.准备安装的工具工具:docker-17.06.0-ce.nginx-1.13.2.PHP-5.5.38 .supervisor配置思路:1.安装dock ...

  7. 十、Abp vNext 基础篇丨权限

    介绍 本章节来把接口的权限加一下 权限配置和使用 官方地址:https://docs.abp.io/en/abp/latest/Authorization 下面这种代码可能我们日常开发都写过,ASP. ...

  8. supermvc 操作备要

    模板暂时仅支持smarty,需要指定模板文件   系统配置文件在supermvc文件夹下 sconfig.php 修改项目目录下的conf下的config.php 会覆盖系统默认配置   contro ...

  9. dede调用文章内第一张原始图片(非缩略图)的实现方法

    第一步,修改include/extend.func.php文件,最下面插入函数,查询的是文章附加表,如需查询图片集什么的,改表名即可 //取原图地址 function GetFirstImg($arc ...

  10. Java基础系列(37)- 数组下标越界及小结

    数组的四个基本特点 其长度是确定的,数组一旦被创建,它的大小就是不可以改变的 其元素必须是相同类型,不允许出现混合类型 数组中的元素可以是任何数据类型,包括基本类型和引用类型 数组变量属于引用类型,数 ...