从服务(ServiceA)的独立的spring容器中取出来一个独立的FallbackFactory,调用每个服务的时候,他对应的FallbackFactory都是存在于那个服务关联的独立的spring容器中的。
接着进入到Hystrix.target()中:
public final class HystrixFeign { public static Builder builder() { return new Builder(); } public static final class Builder extends Feign.Builder { private Contract contract = new Contract.Default(); private SetterFactory setterFactory = new SetterFactory.Default(); /** * @see #target(Class, String, FallbackFactory) */ public <T> T target(Target<T> target, FallbackFactory<? extends T> fallbackFactory) { return build(fallbackFactory).newInstance(target); } Feign build(final FallbackFactory<?> nullableFallbackFactory) { super.invocationHandlerFactory(new InvocationHandlerFactory() { @Override public InvocationHandler create(Target target, Map<Method, MethodHandler> dispatch) { // 设置invocationHandlerFactory为HystrixInvocationHandler return new HystrixInvocationHandler(target, dispatch, setterFactory, nullableFallbackFactory); } }); // 设置contact为HystrixDelegatingContract super.contract(new HystrixDelegatingContract(contract)); // 调用父类的build方法 return super.build(); } } } public class ReflectiveFeign extends Feign { public <T> T newInstance(Target<T> target) { Map<String, MethodHandler> nameToHandler = targetToHandlersByName.apply(target); Map<Method, MethodHandler> methodToHandler = new LinkedHashMap<Method, MethodHandler>(); List<DefaultMethodHandler> defaultMethodHandlers = new LinkedList<DefaultMethodHandler>(); for (Method method : target.type().getMethods()) { if (method.getDeclaringClass() == Object.class) { continue; } else if(Util.isDefault(method)) { DefaultMethodHandler handler = new DefaultMethodHandler(method); defaultMethodHandlers.add(handler); methodToHandler.put(method, handler); } else { methodToHandler.put(method, nameToHandler.get(Feign.configKey(target.type(), method))); } } // 和之前一样,生成一个JDK动态代理对象 InvocationHandler handler = factory.create(target, methodToHandler); T proxy = (T) Proxy.newProxyInstance(target.type().getClassLoader(), new Class<?>[]{target.type()}, handler); for(DefaultMethodHandler defaultMethodHandler : defaultMethodHandlers) { defaultMethodHandler.bindTo(proxy); } return proxy; } }最终实际用来去处理这个请求的,其实是InvocationHandler,他是JDK动态代理的核心,基于JDK动态代理机制,生成一个动态代理的对象之后,对这个对象所有的方法调用,都会走关联的那个InvocationHandler。
我们这里设置的是HystrixInvocationHandler,来看下它的构造参数:
target:你要调用的服务,这里是HardCodedTarget,里面包含服务名称等信息
dispatch:map,接口的每个方法的Method对象 -> SynchronousMethodHandler
setterFactory:空
nullableFallbackFactory:我们给的那个降级对象的工程,fallback工程
接下来还设置了contract信息,Contract是解析第三方注解的组件,设置为了HystrixDelegatingContract,顾名思义,就是说,设置了这个组件之后,后面就可以解析你在各个接口上hystrix相关的一些注解。
总结上面已经分析了Hystrix基础原理与Demo的搭建,基础原理中用一张简单地图画了Hystrix实现的流程,后面会更加详细的依据这个图进行讲解。
申明本文章首发自本人博客:https://www.cnblogs.com/wang-meng 和公众号:壹枝花算不算浪漫,如若转载请标明来源!
感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫