02:远程调用与负载均衡-RestTemplate+OpenFeign+Spring Cloud LoadBalancer
一Ribbon-Feign1.1Ribbon–Fegin源码流程图1.2Ribbon实现负载均衡的原理1LoadBalancerAutoConfiguration这个类这个类主要做的就是把LoadBalancer拦截器封装到RestTemplte拦截器集合里面去。2然后在代码里面调用restTemplate.getForObject或者其他方法的时候就会调用到这个拦截器。3在LoadBalancer拦截器类中就会调用intercept方法这个方法就会通过execute方法获取负载均衡器以及通过负载均衡算法和得到的servicename去获取一台具体的服务。然后通过http调用。4而且ribbon会定时的去更新Nocas中的服务注册中心将其保存在本地而且在负载均衡真正调用之前的时候也会去更新。1.3Fegin原理1从EnableFeginClients注解看这个注解里面有一个Import注解ImportFeginClientRegistrat.class;这个类的方法registerFeginClients方法就能扫描主启动类包同机以及下级包中所有符合FeginClient的类注入到容器当中。SpringBootApplication EnableFeignClients/此注解/ public class OrderFeignMain80 { public static void main(String[] args) { SpringApplication.run(OrderFeignMain80.class,args); } }// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package org.springframework.cloud.openfeign; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.context.annotation.Import; Retention(RetentionPolicy.RUNTIME) Target({ElementType.TYPE}) Documented Import({FeignClientsRegistrar.class})//此注解 public interface EnableFeignClients { String[] value() default {}; String[] basePackages() default {}; Class?[] basePackageClasses() default {}; Class?[] defaultConfiguration() default {}; Class?[] clients() default {}; }2然后loadBalance通过jdk动态代理最总生成LoadBalanceFeginClient这个类中的execute方法中最终去调用我们的ribbon实现负载均衡。public void registerFeignClients(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { ClassPathScanningCandidateComponentProvider scanner this.getScanner(); scanner.setResourceLoader(this.resourceLoader); MapString, Object attrs metadata.getAnnotationAttributes(EnableFeignClients.class.getName()); AnnotationTypeFilter annotationTypeFilter new AnnotationTypeFilter(FeignClient.class);//此方法 Class?[] clients attrs null ? null : (Class[])((Class[])attrs.get(clients)); Object basePackages; if (clients ! null clients.length ! 0) { final SetString clientClasses new HashSet(); basePackages new HashSet(); Class[] var9 clients; int var10 clients.length; for(int var11 0; var11 var10; var11) { Class? clazz var9[var11]; ((Set)basePackages).add(ClassUtils.getPackageName(clazz)); clientClasses.add(clazz.getCanonicalName()); } AbstractClassTestingTypeFilter filter new AbstractClassTestingTypeFilter() { protected boolean match(ClassMetadata metadata) { String cleaned metadata.getClassName().replaceAll(\\$, .); return clientClasses.contains(cleaned); } }; scanner.addIncludeFilter(new FeignClientsRegistrar.AllTypeFilter(Arrays.asList(filter, annotationTypeFilter))); } else { scanner.addIncludeFilter(annotationTypeFilter); basePackages this.getBasePackages(metadata); } Iterator var17 ((Set)basePackages).iterator(); while(var17.hasNext()) { String basePackage (String)var17.next(); SetBeanDefinition candidateComponents scanner.findCandidateComponents(basePackage); Iterator var21 candidateComponents.iterator(); while(var21.hasNext()) { BeanDefinition candidateComponent (BeanDefinition)var21.next(); if (candidateComponent instanceof AnnotatedBeanDefinition) { AnnotatedBeanDefinition beanDefinition (AnnotatedBeanDefinition)candidateComponent; AnnotationMetadata annotationMetadata beanDefinition.getMetadata(); Assert.isTrue(annotationMetadata.isInterface(), FeignClient can only be specified on an interface); MapString, Object attributes annotationMetadata.getAnnotationAttributes(FeignClient.class.getCanonicalName()); String name this.getClientName(attributes); this.registerClientConfiguration(registry, name, attributes.get(configuration)); this.registerFeignClient(registry, annotationMetadata, attributes); } } } }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2441593.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!