Feignclient sets hystrix parameters

  springcloud

Order

Feign integrates hystrix by default, so the problem arises. how to set the hystrix property of each method like hystrix command?

Example

@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, here product, is the value in @ feigninclient (“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();
  }

The construction of commandKey, where classes, method names, and parameters are assembled, such as the example in this article, commandkey = remoteproductservice # getproduct (int)

Profile specification

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

Specified in 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) // 超时配置
                        );
            }
        });
    }

Summary

In terms of flexibility, the configuration file should be more flexible. The only workload is to construct commandKey according to the rules, and then relevant configuration can be carried out.


For the latest content, please pay attention to WeChat public number

图片描述