feign中的HystrixInvocationHandler作用是什么
这篇文章主要讲解了“feign中的HystrixInvocationHandler作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“feign中的HystrixInvocationHandler作用是什么”吧!
十载的嘉黎网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都营销网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整嘉黎建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联公司从事“嘉黎网站设计”,“嘉黎网站推广”以来,每个客户项目都认真落实执行。
序
本文主要研究一下feign的HystrixInvocationHandler
HystrixInvocationHandler
feign-hystrix-10.2.3-sources.jar!/feign/hystrix/HystrixInvocationHandler.java
final class HystrixInvocationHandler implements InvocationHandler { private final Target> target; private final Mapdispatch; private final FallbackFactory> fallbackFactory; // Nullable private final Map fallbackMethodMap; private final Map setterMethodMap; HystrixInvocationHandler(Target> target, Map dispatch, SetterFactory setterFactory, FallbackFactory> fallbackFactory) { this.target = checkNotNull(target, "target"); this.dispatch = checkNotNull(dispatch, "dispatch"); this.fallbackFactory = fallbackFactory; this.fallbackMethodMap = toFallbackMethod(dispatch); this.setterMethodMap = toSetters(setterFactory, target, dispatch.keySet()); } /** * If the method param of InvocationHandler.invoke is not accessible, i.e in a package-private * interface, the fallback call in hystrix command will fail cause of access restrictions. But * methods in dispatch are copied methods. So setting access to dispatch method doesn't take * effect to the method in InvocationHandler.invoke. Use map to store a copy of method to invoke * the fallback to bypass this and reducing the count of reflection calls. * * @return cached methods map for fallback invoking */ static Map toFallbackMethod(Map dispatch) { Map result = new LinkedHashMap (); for (Method method : dispatch.keySet()) { method.setAccessible(true); result.put(method, method); } return result; } /** * Process all methods in the target so that appropriate setters are created. */ static Map toSetters(SetterFactory setterFactory, Target> target, Set methods) { Map result = new LinkedHashMap (); for (Method method : methods) { method.setAccessible(true); result.put(method, setterFactory.create(target, method)); } return result; } @Override public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { // early exit if the invoked method is from java.lang.Object // code is the same as ReflectiveFeign.FeignInvocationHandler if ("equals".equals(method.getName())) { try { Object otherHandler = args.length > 0 && args[0] != null ? Proxy.getInvocationHandler(args[0]) : null; return equals(otherHandler); } catch (IllegalArgumentException e) { return false; } } else if ("hashCode".equals(method.getName())) { return hashCode(); } else if ("toString".equals(method.getName())) { return toString(); } HystrixCommand
HystrixInvocationHandler实现了InvocationHandler接口,其构造器接收target、dispatch、setterFactory、fallbackFactory;invoke方法主要是创建hystrixCommand,然后执行hystrixCommand的execute或toObservable等方法;hystrixCommand的run方法执行HystrixInvocationHandler.this.dispatch.get(method).invoke(args),其getFallback方法主要是执行fallbackMethodMap.get(method).invoke(fallback, args)
InvocationHandlerFactory
feign-core-10.2.3-sources.jar!/feign/InvocationHandlerFactory.java
public interface InvocationHandlerFactory { InvocationHandler create(Target target, Mapdispatch); /** * Like {@link InvocationHandler#invoke(Object, java.lang.reflect.Method, Object[])}, except for a * single method. */ interface MethodHandler { Object invoke(Object[] argv) throws Throwable; } static final class Default implements InvocationHandlerFactory { @Override public InvocationHandler create(Target target, Map dispatch) { return new ReflectiveFeign.FeignInvocationHandler(target, dispatch); } } }
InvocationHandlerFactory接口定义了create方法用于创建InvocationHandler;它有一个Default的实现,其create方法创建的是ReflectiveFeign.FeignInvocationHandler
HystrixFeign
feign-hystrix-10.2.3-sources.jar!/feign/hystrix/HystrixFeign.java
public final class HystrixFeign { //...... public static final class Builder extends Feign.Builder { private Contract contract = new Contract.Default(); private SetterFactory setterFactory = new SetterFactory.Default(); //...... @Override public Feign build() { return build(null); } /** Configures components needed for hystrix integration. */ Feign build(final FallbackFactory> nullableFallbackFactory) { super.invocationHandlerFactory(new InvocationHandlerFactory() { @Override public InvocationHandler create(Target target, Mapdispatch) { return new HystrixInvocationHandler(target, dispatch, setterFactory, nullableFallbackFactory); } }); super.contract(new HystrixDelegatingContract(contract)); return super.build(); } //...... } //...... }
HystrixFeign.Builder的build方法使用的InvocationHandlerFactory创建的是HystrixInvocationHandler
FeignClientsConfiguration
spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/openfeign/FeignClientsConfiguration.java
@Configuration public class FeignClientsConfiguration { //...... @Configuration @ConditionalOnClass({ HystrixCommand.class, HystrixFeign.class }) protected static class HystrixFeignConfiguration { @Bean @Scope("prototype") @ConditionalOnMissingBean @ConditionalOnProperty(name = "feign.hystrix.enabled") public Feign.Builder feignHystrixBuilder() { return HystrixFeign.builder(); } } //...... }
FeignClientsConfiguration的HystrixFeignConfiguration在有HystrixCommand.class, HystrixFeign.class以及feign.hystrix.enabled为true的情况下,其创建的Feign.Builder为HystrixFeign.builder
小结
HystrixInvocationHandler实现了InvocationHandler接口,其构造器接收target、dispatch、setterFactory、fallbackFactory;invoke方法主要是创建hystrixCommand,然后执行hystrixCommand的execute或toObservable等方法;hystrixCommand的run方法执行HystrixInvocationHandler.this.dispatch.get(method).invoke(args),其getFallback方法主要是执行fallbackMethodMap.get(method).invoke(fallback, args)
感谢各位的阅读,以上就是“feign中的HystrixInvocationHandler作用是什么”的内容了,经过本文的学习后,相信大家对feign中的HystrixInvocationHandler作用是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!
名称栏目:feign中的HystrixInvocationHandler作用是什么
文章路径:http://pwwzsj.com/article/gijose.html