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

Spring cloud zuul提供这种降级功能,操作步骤如下:

package microService.app.filter;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;
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 com.netflix.zuul.context.RequestContext; import net.sf.json.JSONObject; /**
* 向用户管理路由发起请求失败时的回滚处理 hystrix的回滚能力
*
*/
@Component
public class MsgCollectionFilter implements ZuulFallbackProvider { private final Logger logger = LoggerFactory.getLogger(MsgCollectionFilter.class); @Override
public String getRoute() {
return "*";// api服务id,如果需要所有调用都支持回退,则return "*"或return null
} /**
* 如果请求用户服务失败,返回什么信息给消费者客户端
*/
@Override
public ClientHttpResponse fallbackResponse() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
return new ClientHttpResponse() { @Override
public InputStream getBody() throws IOException {
JSONObject r = new JSONObject();
r.put("state", "8888");
r.put("msg", "系统错误,请求失败");
logger.error("降级"+r.toString());
return new ByteArrayInputStream(r.toString().getBytes("UTF-8"));
} @Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
// 和body中的内容编码一致,否则容易乱码
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
return headers;
} /**
* 网关向api服务请求是失败了,但是消费者客户端向网关发起的请求是OK的, 不应该把api的404,500等问题抛给客户端
* 网关和api服务集群对于客户端来说是黑盒子
*/
@Override
public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK;
} @Override
public int getRawStatusCode() throws IOException { return HttpStatus.OK.value();
} @Override
public String getStatusText() throws IOException { return HttpStatus.OK.getReasonPhrase();
} @Override
public void close() { } };
} }

  

Spring Cloud Zuul 网关服务的fallback的更多相关文章

  1. Spring Cloud zuul网关服务 一

    上一篇进行Netflix Zuul 1.0 与 gateway的对比.今天来介绍一下 zuul的搭建及应用 Zuul 工程创建 工程创建 cloud-gateway-zuul.还是基于之前的工程 po ...

  2. Spring Cloud gateway 网关服务二 断言、过滤器

    微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...

  3. Spring Cloud Zuul API服务网关之请求路由

    目录 一.Zuul 介绍 二.构建Spring Cloud Zuul网关 构建网关 请求路由 请求过滤 三.路由详解 一.Zuul 介绍 ​ 通过前几篇文章的介绍,我们了解了Spring Cloud ...

  4. 创建swagger的springboot-stater,并在spring cloud zuul网关中引入

    Swagger 是一款RESTFUL接口的.基于YAML.JSON语言的文档在线自动生成.代码自动生成的工具. 通过在controller中添加注解,即可轻易实现代码文档化. Swagger提供ui界 ...

  5. Spring cloud Zuul网关异常处理

    Spring cloud Zuul网关异常处理 一 异常测试: 1> 创建一个pre类型的过滤器,并在该过滤器的run方法实现中抛出一个异常.比如下面的实现,在run方法中调用的doSometh ...

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

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

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

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

  8. Spring Cloud 2-Zuul 网关服务(六)

    Spring Cloud  Zuul  1.pom.xml 2.application.yml Application.java 1.pom.xml <!-- zuul 网关服务 --> ...

  9. Spring Cloud gateway 网关服务 一

    之前我们介绍了 zuul网关服务,今天聊聊spring cloud gateway 作为spring cloud的亲儿子网关服务.很多的想法都是参照zuul,为了考虑zuul 迁移到gateway 提 ...

随机推荐

  1. node.js - 定义全局变量

    1,定义全局变量 app.set('name','八戒') 2,获取全局变量 app.get('name')

  2. 在远程服务器上执行本地的shell脚本

    在远程服务器上执行本地的shell脚本 [root@localhost zzx]# sh echoip.sh 192.168.67.131[root@localhost zzx]# ssh root@ ...

  3. Windows10 网络图标消失 连接不上网络 的解决方法

    [背景]电脑win10的,下载一个软件重启之后网络图标消失,并且无法联网. 参照此解决方法: 原因: [Windows Event Log]服务对应的注册表出现问题,导致无法正常启动,进而导致一些依赖 ...

  4. Elasticsearch 使用集群 - 列出索引

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  5. distpicker.js 根据当前位置初始化select

    学习参考的地址放在最醒目的地方: https://blog.csdn.net/idea_boy/article/details/58280076 百度官方实例:http://developer.bai ...

  6. 第七篇:Python3连接MySQL

    第七篇:Python3连接MySQL 连接数据库 注意事项 在进行本文以下内容之前需要注意: 你有一个MySQL数据库,并且已经启动. 你有可以连接该数据库的用户名和密码 你有一个有权限操作的data ...

  7. mysql 事务使用教程

    一.什么是事务 事务Transaction,是指作为一个基本工作单元执行的一系列SQL语句的操作,要么完全地执行,要么完全地都不执行.   二.事务的特性       原子性         事务是一 ...

  8. springboot - 使用ErrorAttributes 在我们自定义的 ErrorController中

    1.概览 基于<springboot - 映射 /error 到自定义且实现了ErrorController的Controller>改造,仅将MyCustomErrorController ...

  9. CV_图像滤波[转]---python+opencv均值滤波,高斯滤波,中值滤波,双边滤波

    1.图像滤波算法(cv2) https://blog.csdn.net/qq_27261889/article/details/80822270 2.

  10. OpenPose 开源库安装

    一.下载openpose下载openpose 使用Git直接下载openpose git clone https://github.com/CMU-Perceptual-Computing-Lab/o ...