spring cloud zuul的回退

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值