`
阅读更多

     当我们使用 @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

 

 

  • 大小: 1.9 MB
分享到:
评论

相关推荐

    Spring Cloud Zuul带注册中心Consul

    - **熔断与降级**:Hystrix作为容错管理工具,可以在服务出现故障时,启用回退策略,防止雪崩效应。 5. **项目结构与配置** - `springcloudzuulstart`可能包含`application.properties`或`application.yml`,用于...

    深入理解Spring Cloud Zuul过滤器

    - **ERROR过滤器**:在其他阶段发生错误时执行,用于错误处理和回退机制。 请求生命周期中,这些过滤器按照特定顺序执行,提供了一种灵活的方式来处理微服务间的交互。 2. **编写Zuul过滤器** 编写Zuul过滤器...

    SpringCloud第3季2024.7z

    4. **Zuul和Gateway**:Zuul是SpringCloud早期的API网关,负责路由转发和过滤器操作。SpringCloud Gateway是较新的API网关实现,它基于Spring Framework和Project Reactor,提供了更高效且功能丰富的路由和服务代理...

    springcloud视频学习,学习springcloud推荐的视频,讲的真的很好

    4. **断路器模式**:Hystrix是实现断路器模式的库,防止因某个服务故障导致整个系统雪崩,通过隔离故障服务、回退策略和健康检查机制来增强系统的健壮性。 5. **配置中心**:Spring Cloud Config提供了集中化的配置...

    基于spring cloud项目源码源码.rar

    3. Hystrix源码:学习Hystrix如何实现断路器模式,如何监控服务的运行状态,以及熔断、降级和回退策略的实现。 4. Zuul或Spring Cloud Gateway源码:了解它们如何处理请求转发,实现API路由和过滤器,以及安全策略的...

    spring cloud 实战教程

    书中会介绍如何使用Hystrix实现熔断、降级和回退策略。 此外,Spring Cloud Bus和Spring Cloud Data Flow也是重要的组成部分。Bus负责在微服务之间传递事件,而Data Flow则提供了数据流管理和部署的工具,简化了...

    Spring Cloud面试题2020·8(35题).pdf

    2. **负载均衡**:Spring Cloud 结合 Ribbon 或者 Netflix Zuul 可以实现客户端负载均衡,通过在服务消费者中自动配置负载均衡策略,提升系统性能和可靠性。 3. **容错管理**:Hystrix 是 Spring Cloud 中的关键组件...

    Spring Cloud dalston 中文文档 参考手册

    Hystrix是Spring Cloud中提供的断路器组件,它能够帮助系统防止级联故障并提供回退机制。Hystrix仪表板提供了实时监控和指标流的功能。而Turbine则允许你聚合来自多个Hystrix客户端的监控信息。 Ribbon是客户端负载...

    SpringCloud学习代码

    SpringCloud是中国开发者非常熟悉的一个微服务框架,它提供了一系列用于构建分布式系统的工具,极大地简化了在云端部署和管理复杂应用的流程。以下是对标题和描述中提到的关键知识点的详细解释: 1. **配置管理**:...

    Spring Cloud 学习笔记.pdf

    Zuul的高可用性和限流、熔断回退、跨域处理、统一异常处理等实战案例提供了微服务治理的能力。 Apollo(分布式配置中心)提供了一套完整的配置管理解决方案,支持统一管理不同环境、不同集群的配置,动态刷新配置,...

    spring boot+spring cloud视频教学下载全套

    ├37 6.9 Zuul的回退.avi ├38 6.10 使用Sidecar支持异构平台的微服务.avi ├39 6.10 Sidecar补充.avi ├4 服务提供者与服务消费者.avi ├4 服务提供者与服务消费者new.avi ├40 6.11-1 Zuul过滤器.avi ├41 6.11-2...

    Spring Cloud 中文文档 参考手册 中文版2018

    Zuul也支持通过上传文件、禁用过滤器、设置Hystrix回退等功能。 在消息驱动方面,Spring Cloud Stream为消息中间件提供了统一的消息通信模式。它通过定义Binder抽象,提供持续发布-订阅、消费群体分区以及编程模型...

    Spring Cloud SpringCloud全套高清视频教程

    这个“Spring Cloud SpringCloud全套高清视频教程”旨在帮助开发者深入理解和掌握Spring Cloud的相关技术栈,通过高清视频的方式进行学习,确保理论与实践相结合。 在微服务架构中,Spring Cloud 提供了多种组件来...

    SpringCloud.zip

    Hystrix是Netflix开源的容错管理工具,提供断路器模式以防止级联失败,并提供回退策略。 以上各子项目展示了SpringCloud核心组件的使用,包括服务注册与发现(Eureka)、配置管理(Config Server/Client)、API网关...

    微服务书籍管理系统springcloud.rar

    《微服务书籍管理系统springcloud.rar》是一个包含使用Spring Cloud构建微服务架构的书籍管理系统的资源压缩包。Spring Cloud是基于Spring Boot实现的服务发现、配置、路由、熔断、负载均衡等全套微服务解决方案,它...

    mastering-spring-cloud2018

    4. **Spring Cloud Hystrix**:Hystrix是Netflix开发的一个用于处理延迟和容错的库,它通过隔离请求、回退、超时、熔断等机制,保护系统免受雪崩效应的影响。 5. **Spring Cloud Ribbon**:Ribbon是Netflix提供的一...

    springcloud 后台管理系统

    3. **Hystrix**:断路器组件,用于防止服务雪崩,当某个服务不可用时,Hystrix 可以打开断路器,避免系统被拖垮,同时提供回退机制。 4. **Config Server**:配置中心,集中管理所有服务的配置,支持远程配置和实时...

    解锁SpringCloud主流组件 解决微服务诸多难题

    3. **Hystrix**:针对服务间的断路器设计,Hystrix提供故障隔离和回退策略,防止服务雪崩。学习如何配置和监控Hystrix,理解其熔断、降级、隔离舱等概念,对于构建容错性强的系统至关重要。 4. **Ribbon**:作为...

    Spring Cloud 中文文档.pdf

    - **为路线提供 Hystrix 回退**:Zuul 可以与 Hystrix 配合使用,为路由提供回退机制。 #### Polyglot 支持 Sidecar - **Polyglot 支持 Sidecar**:Spring Cloud 支持多种语言的服务部署在同一系统中,Sidecar ...

    Spring Cloud Greenwich SR2 官方文档

    7. **熔断与降级策略**:Hystrix提供了一套完善的熔断机制,包括熔断、降级和回退策略。当服务不可用时,可以执行预定义的降级操作,以保证系统的稳定性和可用性。 8. **服务追踪**:Spring Cloud Sleuth与Zipkin的...

Global site tag (gtag.js) - Google Analytics