美文网首页JavaWeb 知识点
Spring Cloud: Feign Fallback配置方式

Spring Cloud: Feign Fallback配置方式

作者: MeazZa | 来源:发表于2018-08-27 17:46 被阅读2354次

在Spring Cloud的微服务框架中,Feign是非常重要且常用的功能,我们可以通过Feign处理服务调用的负责均衡。在使用Feign中,一个非常重要的场景就是配置Feign的Fallback机制,用于解决当依赖的微服务不可用时,使用默认的返回值。本文会针对Feign Fallback的配置方式和常见问题进行介绍。

1. Feign的基础配置

  • 引入spring-cloud-starter-feign依赖包
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>
  • 在Application类上增加注解
@SpringCloudApplication
@EnableEurekaClient
@EnableFeignClients
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class);
  }
}
  • 接口类的配置
@FeignClient("cache")
@RequestMapping("/cache")
public interface CacheService {

  @RequestMapping(value = "/passive/{hashCode}", method = RequestMethod.GET)
  QueryResult get(@PathVariable(value = "hashCode") int hashCode);

  @RequestMapping(value = "/passive/{hashCode}", method = RequestMethod.POST)
  void set(@PathVariable(value = "hashCode") int hashCode, @RequestBody QueryResult queryResult);
}

到此,已经可以通过@Autowired的方式,将CacheService引入到其他Service中,实现对cache这个服务的调用了。

2. Feign的Fallback配置

  • Fallback类的配置

这里要重点强调的是@RequestMapping URL路径映射的问题,如果@RequestMapping的值和CacheService的接口相同,会导致同一个URL映射到两个方法上,因此需要保证Fallback类的@RequestMapping的值与interface不同。

@Component
@RequestMapping("/fallback/cache")
public class CacheServiceFallback implements CacheService {
  @Override
  public QueryResult get(int hashCode) {
    return null;
  }

  @Override
  public void set(int hashCode, QueryResult queryResult) {

  }
}
  • 接口类的配置修改

接口类中通过@FeignClient注解的参数进行Fallback类的指定,同时需要增加@Component注解,因为在Spring中同时存在两个CacheService的实例,需要增加@Component以进行区分。

@Component
@FeignClient(value = "cache", fallback = CacheServiceFallback.class)
@RequestMapping("/cache")
public interface CacheService {

  @RequestMapping(value = "/passive/{hashCode}", method = RequestMethod.GET)
  QueryResult get(@PathVariable(value = "hashCode") int hashCode);

  @RequestMapping(value = "/passive/{hashCode}", method = RequestMethod.POST)
  void set(@PathVariable(value = "hashCode") int hashCode, @RequestBody QueryResult queryResult);
}
  • 打开Feign的Hystrix熔断功能

在application.yml中增加以下配置,打开Hystrix熔断功能:

feign:
  hystrix:
    enabled: true
  • 设置Hystrix的time-out时间

Hystrix的默认time-out时间为1s,如果不做修改的话,有可能会报出以下的异常。如果不清楚设置什么超时时间合适的话,可以设置Hystrix不超时。

Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: Service#function() timed-out and no fallback available.

设置超时时间为20s:

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 20000

设置从不超时:

hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: false

完成了以上的配置,就可以完美的使用Feign的Fallback功能了!

相关文章

网友评论

    本文标题:Spring Cloud: Feign Fallback配置方式

    本文链接:https://www.haomeiwen.com/subject/dbstwftx.html