当我们使用 @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
相关推荐
- **熔断与降级**:Hystrix作为容错管理工具,可以在服务出现故障时,启用回退策略,防止雪崩效应。 5. **项目结构与配置** - `springcloudzuulstart`可能包含`application.properties`或`application.yml`,用于...
- **ERROR过滤器**:在其他阶段发生错误时执行,用于错误处理和回退机制。 请求生命周期中,这些过滤器按照特定顺序执行,提供了一种灵活的方式来处理微服务间的交互。 2. **编写Zuul过滤器** 编写Zuul过滤器...
4. **Zuul和Gateway**:Zuul是SpringCloud早期的API网关,负责路由转发和过滤器操作。SpringCloud Gateway是较新的API网关实现,它基于Spring Framework和Project Reactor,提供了更高效且功能丰富的路由和服务代理...
4. **断路器模式**:Hystrix是实现断路器模式的库,防止因某个服务故障导致整个系统雪崩,通过隔离故障服务、回退策略和健康检查机制来增强系统的健壮性。 5. **配置中心**:Spring Cloud Config提供了集中化的配置...
3. Hystrix源码:学习Hystrix如何实现断路器模式,如何监控服务的运行状态,以及熔断、降级和回退策略的实现。 4. Zuul或Spring Cloud Gateway源码:了解它们如何处理请求转发,实现API路由和过滤器,以及安全策略的...
书中会介绍如何使用Hystrix实现熔断、降级和回退策略。 此外,Spring Cloud Bus和Spring Cloud Data Flow也是重要的组成部分。Bus负责在微服务之间传递事件,而Data Flow则提供了数据流管理和部署的工具,简化了...
2. **负载均衡**:Spring Cloud 结合 Ribbon 或者 Netflix Zuul 可以实现客户端负载均衡,通过在服务消费者中自动配置负载均衡策略,提升系统性能和可靠性。 3. **容错管理**:Hystrix 是 Spring Cloud 中的关键组件...
Hystrix是Spring Cloud中提供的断路器组件,它能够帮助系统防止级联故障并提供回退机制。Hystrix仪表板提供了实时监控和指标流的功能。而Turbine则允许你聚合来自多个Hystrix客户端的监控信息。 Ribbon是客户端负载...
SpringCloud是中国开发者非常熟悉的一个微服务框架,它提供了一系列用于构建分布式系统的工具,极大地简化了在云端部署和管理复杂应用的流程。以下是对标题和描述中提到的关键知识点的详细解释: 1. **配置管理**:...
Zuul的高可用性和限流、熔断回退、跨域处理、统一异常处理等实战案例提供了微服务治理的能力。 Apollo(分布式配置中心)提供了一套完整的配置管理解决方案,支持统一管理不同环境、不同集群的配置,动态刷新配置,...
├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...
Zuul也支持通过上传文件、禁用过滤器、设置Hystrix回退等功能。 在消息驱动方面,Spring Cloud Stream为消息中间件提供了统一的消息通信模式。它通过定义Binder抽象,提供持续发布-订阅、消费群体分区以及编程模型...
这个“Spring Cloud SpringCloud全套高清视频教程”旨在帮助开发者深入理解和掌握Spring Cloud的相关技术栈,通过高清视频的方式进行学习,确保理论与实践相结合。 在微服务架构中,Spring Cloud 提供了多种组件来...
Hystrix是Netflix开源的容错管理工具,提供断路器模式以防止级联失败,并提供回退策略。 以上各子项目展示了SpringCloud核心组件的使用,包括服务注册与发现(Eureka)、配置管理(Config Server/Client)、API网关...
《微服务书籍管理系统springcloud.rar》是一个包含使用Spring Cloud构建微服务架构的书籍管理系统的资源压缩包。Spring Cloud是基于Spring Boot实现的服务发现、配置、路由、熔断、负载均衡等全套微服务解决方案,它...
4. **Spring Cloud Hystrix**:Hystrix是Netflix开发的一个用于处理延迟和容错的库,它通过隔离请求、回退、超时、熔断等机制,保护系统免受雪崩效应的影响。 5. **Spring Cloud Ribbon**:Ribbon是Netflix提供的一...
3. **Hystrix**:断路器组件,用于防止服务雪崩,当某个服务不可用时,Hystrix 可以打开断路器,避免系统被拖垮,同时提供回退机制。 4. **Config Server**:配置中心,集中管理所有服务的配置,支持远程配置和实时...
3. **Hystrix**:针对服务间的断路器设计,Hystrix提供故障隔离和回退策略,防止服务雪崩。学习如何配置和监控Hystrix,理解其熔断、降级、隔离舱等概念,对于构建容错性强的系统至关重要。 4. **Ribbon**:作为...
- **为路线提供 Hystrix 回退**:Zuul 可以与 Hystrix 配合使用,为路由提供回退机制。 #### Polyglot 支持 Sidecar - **Polyglot 支持 Sidecar**:Spring Cloud 支持多种语言的服务部署在同一系统中,Sidecar ...
7. **熔断与降级策略**:Hystrix提供了一套完善的熔断机制,包括熔断、降级和回退策略。当服务不可用时,可以执行预定义的降级操作,以保证系统的稳定性和可用性。 8. **服务追踪**:Spring Cloud Sleuth与Zipkin的...