美文网首页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