当我们使用 @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. vue 动态ip配置,避免重复打包

    目前比较流行的打包大都是在vue.config.js配置代理,然后在根目录新建.env.xxx文件配置正式环境,测试环境,开发环境等用于打包时配置不同的访问地址,作为一名随波逐流的前端开发,我也是这么 ...

  2. python字典时间日期

    字典时间日期 学习完本篇,你将会深入掌握 字典操作. 1.如何新建一个字典 2.如何正序以及反序访问字典 3.如何更新字典元素 4.如何删除字典 日期时间操作 1.如何打印一个2021-9-20 17 ...

  3. PHP中的MySQLi扩展学习(三)mysqli的基本操作

    我们继续 MySQLi 扩展的学习,上篇文章中提到过,MySQLi 的扩展相对于 PDO 来说功能更加的丰富,所以我们依然还会在学习过程中穿插各种 MySQLi 中好玩的方法函数.不过,今天的主角是 ...

  4. php发送邮件方法-亲测可用,email.class.php过期解决办法

    php虽然提供了mail()函数,但并不好用,而PHPMailer是一个不错的邮件发送工具,使用起来也是非常简单!使用PHPMailer发送邮件: <?php header("cont ...

  5. Jmeter系列(6)- 分析源码,创建登录、浏览商品接口请求

    前言简介 接口的压力测试有个二八原则:线上80%的用户量在一天24小时20%(即4.8个小时)的时间里可以平稳运行,这个接口就算是通过压力测试了 源码分析 登录 浏览商品 创建请求 登录 浏览菜单 C ...

  6. docker启动jenikns,提示 :This image is for research only, DO NOT USE

    下载的jenkins镜像有问题?

  7. layui左右移动tab标签模版

    {% load staticfiles %} <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...

  8. 鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽 | 百篇博客分析OpenHarmony源码 | v28.03

    百篇博客系列篇.本篇为: v28.xx 鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽 | 51.c.h .o 进程通讯相关篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 自旋锁当 ...

  9. vm 将宿主机文件夹 映射至 虚拟机

    一.关于centos如何安装(自行百度) 二.设置共享文件夹 添加共享文件夹(关闭虚拟机时操作) 虚拟机->设置->选项->共享文件夹 三.安装vm-tools (请用root用户执 ...

  10. 如何通过云效Flow完成自动化部署—主机部署

    如何通过云效Flow完成自动化部署-主机部署,云效流水线Flow是持续交付的载体,通过构建自动化.集成自动化.验证自动化.部署自动化,完成从开发到上线过程的持续交付.通过持续向团队提供及时反馈,让交付 ...