feignclient设置hystrix参数

来源:互联网 发布:软件测试的周期 编辑:程序博客网 时间:2024/05/29 09:05

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,然后就可以进行相关配置了。



作者:scipio
链接:http://www.jianshu.com/p/459ecb01b72d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原创粉丝点击