通过Fallback Factory检查回退原因

很多场景下,需要了解回退的原因,此时可使用注解@FeignClient的fallbackFactory属性,下面通过一个例子说明
一 新建项目microservice-consumer-movie-feign-hystrix-fallback-factory
二 UserFeignClient如下
package com.itmuch.cloud.study.user.feign;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.itmuch.cloud.study.user.entity.User;

import feign.hystrix.FallbackFactory;

@FeignClient(name = "microservice-provider-user", fallbackFactory = FeignClientFallbackFactory.class)
public interface UserFeignClient {
  @RequestMapping(value = "/{id}", method = RequestMethod.GET)
  public User findById(@PathVariable("id") Long id);
}

/**
* UserFeignClient的fallbackFactory类,该类需实现FallbackFactory接口,并覆写create方法
* The fallback factory must produce instances of fallback classes that
* implement the interface annotated by {@link FeignClient}.
*/
@Component
class FeignClientFallbackFactory implements FallbackFactory<UserFeignClient> {
  private static final Logger LOGGER = LoggerFactory.getLogger(FeignClientFallbackFactory.class);

  @Override
  public UserFeignClient create(Throwable cause) {
    return new UserFeignClient() {
      @Override
      public User findById(Long id) {
        // 日志最好放在各个fallback方法中,而不要直接放在create方法中。
        // 否则在引用启动时,就会打印该日志。
        // 详见https://github.com/spring-cloud/spring-cloud-netflix/issues/1471
        FeignClientFallbackFactory.LOGGER.info("fallback; reason was:", cause);
        User user = new User();
        user.setId(-1L);
        user.setUsername("默认用户");
        return user;
      }
    };
  }
}
三 测试
1 启动eureka
2 启动user微服务
3 启动电影微服务
4 访问 http://localhost:8010/user/1,能获得如下结果
{"id":1,"username":"account1","name":"张三","age":20,"balance":100.00}
5 停止用户微服务
6 再次访问访问 http://localhost:8010/user/1,可获得如下结果
{"id":-1,"username":"默认用户","name":null,"age":null,"balance":null}
控制台有如下打印:
2018-06-23 10:42:58.760  INFO 5976 --- [provider-user-1] c.i.c.s.u.f.FeignClientFallbackFactory   : fallback; reason was:
java.lang.RuntimeException: com.netflix.client.ClientException
说明进入了回退类中的回退方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值