feign结合hystrix之后生成动态代理的变化

816 阅读1分钟

feign的核心原理是什么?

@EnableFeignClients注解->扫描->@FeignClient注解->针对接口生成动态代理->基于SpringMvcContract解析注解 mvc->请求都是基于feign动态代理->根据ribbon进行负载均衡->根据之前解析出来的spring mvc注解里的信息生成已给请求url -> 针对负载均衡选择出来的server发出一个http请求

这就是feign的基本原理,那么feign与hystrix整合之后,feign动态代理里面一定又一些hystrix相关的代码,然后请求走feign动态代理的时候,就会基于hystrix command发送请求,实现服务间的隔离、限流、超时、异常、降级、熔断、统计。

和原生feign相比整合了hystrix之后feign生成动态代理不同之处有:

  • Feign.Bilder 整合了hystrix之后Feign.Builder变成了HystrixFeign.Builder,看源码 enter description here

  • HystrixTarget.target()方法 如果没有整合hystrix就会走原生Feign.Builder.target()方法

if (!(feign instanceof feign.hystrix.HystrixFeign.Builder)) {
			return feign.target(target);
	}

整合了之后就会加载你定义的fallBackFactory类型,并调用targetWithFallbackFactory()方法。 enter description here

  • FeignInvocationHandler 整合之后不在是FeignInvocationHandler,变成了HystrixInvocationHandler
 /** Configures components needed for hystrix integration. */
    Feign build(final FallbackFactory<?> nullableFallbackFactory) {
      super.invocationHandlerFactory(new InvocationHandlerFactory() {
        @Override public InvocationHandler create(Target target,
            Map<Method, MethodHandler> dispatch) {
          return new HystrixInvocationHandler(target, dispatch, setterFactory, nullableFallbackFactory);
        }
      });
      super.contract(new HystrixDelegatingContract(contract));
      return super.build();
    }
  • HystrixDelegatingContract 不在是SpringMvcContract,而是HystrixDelegatingContract