zoukankan      html  css  js  c++  java
  • feignclient设置hystrix参数

    feign默认集成了hystrix,那么问题来了,如何像hystrix command那样设置每个方法的hystrix属性呢。

    实例

    @FeignClient("product")
    public interface RemoteProductService {
    
        @RequestMapping(method = RequestMethod.GET,value = "/product/{productId}")
        public Product getProduct(@PathVariable(value = "productId")  int productId);
    }
    

    FeignClientsConfiguration

    spring-cloud-netflix-core-1.2.6.RELEASE-sources.jar!/org/springframework/cloud/netflix/feign/FeignClientsConfiguration.java

        @Configuration
        @ConditionalOnClass({ HystrixCommand.class, HystrixFeign.class })
        protected static class HystrixFeignConfiguration {
            @Bean
            @Scope("prototype")
            @ConditionalOnMissingBean
            @ConditionalOnProperty(name = "feign.hystrix.enabled", matchIfMissing = true)
            public Feign.Builder feignHystrixBuilder() {
                return HystrixFeign.builder();
            }
        }

    HystrixFeign

    feign-hystrix-9.3.1-sources.jar!/feign/hystrix/HystrixFeign.java

    private SetterFactory setterFactory = new SetterFactory.Default();

    SetterFactory

    feign-hystrix-9.3.1-sources.jar!/feign/hystrix/SetterFactory.java

    public interface SetterFactory {
    
      /**
       * Returns a hystrix setter appropriate for the given target and method
       */
      HystrixCommand.Setter create(Target<?> target, Method method);
    
      /**
       * Default behavior is to derive the group key from {@link Target#name()} and the command key from
       * {@link Feign#configKey(Class, Method)}.
       */
      final class Default implements SetterFactory {
    
        @Override
        public HystrixCommand.Setter create(Target<?> target, Method method) {
          String groupKey = target.name();
          String commandKey = Feign.configKey(target.type(), method);
          return HystrixCommand.Setter
              .withGroupKey(HystrixCommandGroupKey.Factory.asKey(groupKey))
              .andCommandKey(HystrixCommandKey.Factory.asKey(commandKey));
        }
      }
    }

    groupKey,这里为product,即@FeignClient("product")中的值。

    Feign.configKey

    feign-core-9.3.1-sources.jar!/feign/Feign.java

    public static String configKey(Class targetType, Method method) {
        StringBuilder builder = new StringBuilder();
        builder.append(targetType.getSimpleName());
        builder.append('#').append(method.getName()).append('(');
        for (Type param : method.getGenericParameterTypes()) {
          param = Types.resolve(targetType, targetType, param);
          builder.append(Types.getRawType(param).getSimpleName()).append(',');
        }
        if (method.getParameterTypes().length > 0) {
          builder.deleteCharAt(builder.length() - 1);
        }
        return builder.append(')').toString();
      }

    commandKey的构造,这里组装了类、方法名、参数,比如本文的实例,commandKey=RemoteProductService#getProduct(int)

    配置文件指定

    hystrix:
        command:
            "RemoteProductService#getProduct(int)":
                execution:
                    isolation:
                        thread:
                            timeoutInMilliseconds: 500

    Java中指定

    @Bean
        public Feign.Builder feignHystrixBuilder() {
            return HystrixFeign.builder().setterFactory(new SetterFactory() {
                @Override
                public HystrixCommand.Setter create(Target<?> target, Method method) {
                    return HystrixCommand.Setter
                            .withGroupKey(HystrixCommandGroupKey.Factory.asKey(RemoteProductService.class.getSimpleName()))// 控制 RemoteProductService 下,所有方法的Hystrix Configuration
                            .andCommandPropertiesDefaults(
                                    HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(10000) // 超时配置
                            );
                }
            });
        }

    小结

    论灵活程度,还是配置文件灵活一点,唯一的工作量就是根据规则构造commandKey,然后就可以进行相关配置了。

    import com.netflix.hystrix.HystrixCommand;     
     HystrixCommand.Setter
     
  • 相关阅读:
    MYSQL导入,导出命令。
    MySQL修改,表结构大幅修改
    Ajax
    js和jQuery的日常
    freemarker 分页取值
    Timer定时任务
    汉字相似度比较
    读取Properties键值对
    Python+requests+unittest+excel实现接口自动化测试框架
    Android App 压力测试方法(Monkey)
  • 原文地址:https://www.cnblogs.com/tiancai/p/9585005.html
Copyright © 2011-2022 走看看