Feign Hystrix (HystrixCommonKey) 设置单独接口的超时时间和FallBack

先说结论:HystrixCommonKey生成方法:类名#方法名(入参类型)

然后说原理:

在package feign.hystrix.SetterFactory中看是如何生产commandKey的:

package feign.hystrix;
public interface SetterFactory {
    Setter create(Target<?> var1, Method var2);

    public static final class Default implements SetterFactory {
        public Default() {
        }

        public Setter create(Target<?> target, Method method) {
            String groupKey = target.name();
            String commandKey = Feign.configKey(target.type(), method);
            return Setter.withGroupKey(Factory.asKey(groupKey)).andCommandKey(com.netflix.hystrix.HystrixCommandKey.Factory.asKey(commandKey));
        }
    }
}

再继续看configKey方法:

实际上默认的会将FeignClient所有的方法都根据默认的参数生成commandkey

    public static String configKey(Class targetType, Method method) {
        StringBuilder builder = new StringBuilder();
        builder.append(targetType.getSimpleName());
        builder.append('#').append(method.getName()).append('(');
        Type[] var3 = method.getGenericParameterTypes();
        int var4 = var3.length;

        for(int var5 = 0; var5 < var4; ++var5) {
            Type param = var3[var5];
            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();
    }

那么我们可以进行如下配置:

 
hystrix:
  threadpool:
    default:
      # 核心线程池大小  默认10
      coreSize: 20
      # 最大最大线程池大小
      maximumSize: 30
      # 此属性允许maximumSize的配置生效。 那么该值可以等于或高于coreSize。 设置coreSize <maximumSize会创建一个线程池,该线程池可以支持maximumSize并发,但在相对不活动期间将向系统返回线程。 (以keepAliveTimeInMinutes为准)
      allowMaximumSizeToDivergeFromCoreSize: true
      # 请求等待队列
      maxQueueSize: 10
      # 队列大小拒绝阀值 在还未超过请求等待队列时也会拒绝的大小
      queueSizeRejectionThreshold: 10
  command:
    LimitCheckApi#rcsLimitCheck(RpcRequest):  #default全局有效 默认值为 commonKey commonKey生成方法在 Feign.configKey(target.type(), method) 中
      fallback:
        enabled: true
      execution:
        timeout:
          #如果enabled设置为false,则请求超时交给ribbon控制,为true,则超时作为熔断根据
          enabled: true
        isolation:
          #隔离策略,有THREAD和SEMAPHORE
          #THREAD - 它在单独的线程上执行,并发请求受线程池中的线程数量的限制
          #SEMAPHORE - 它在调用线程上执行,并发请求受到信号量计数的限制
          #对比:https://www.cnblogs.com/java-synchronized/p/7927726.html
          thread:
            timeoutInMilliseconds: 800 #断路器超时时间,默认1000ms
    LimitCheckApi#testTimeOutFallBack(long):
      fallback:
        enabled: true
      execution:
        timeout:
            #如果enabled设置为false,则请求超时交给ribbon控制,为true,则超时作为熔断根据
            enabled: true
        isolation:
          #隔离策略,有THREAD和SEMAPHORE
          #THREAD - 它在单独的线程上执行,并发请求受线程池中的线程数量的限制
          #SEMAPHORE - 它在调用线程上执行,并发请求受到信号量计数的限制
          #对比:https://www.cnblogs.com/java-synchronized/p/7927726.html
          thread:
            timeoutInMilliseconds: 800 #断路器超时时间,默认1000ms
 
feign:
  hystrix:
    enabled: true

猜你喜欢

转载自blog.csdn.net/jerry010101/article/details/90143919
今日推荐