概述-达内培训负责整理
Spring Cloud中默认的服务发现采用的netflix的eureka,本篇文章就是阅读Spring cloud中通过eureka做服务发现时的笔记.
顺藤摸瓜
读取Spring各种框架的时候,很多时候不知道从什么地方开始,因为Spring中很多模块的开启就是通过一行注解,例如@EnableXXX.而Spring Cloud中的配置服务则是通过@EnableDiscoveryClient,(其实@EnableEurekaClient就是@EnableDiscoveryClient)
/*** Annotation to enable a DiscoveryClient implementation.* @author Spencer Gibb*/@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Import(EnableDiscoveryClientImportSelector.class)public @interface EnableDiscoveryClient {/*** If true, the ServiceRegistry will automatically register the local server.*/boolean autoRegister() default true;}
上面有一个@Import(EnableDiscoveryClientImportSelector.class),然后看一下EnableDiscoveryClientImportSelector这个类
public class EnableDiscoveryClientImportSelectorextends SpringFactoryImportSelector<EnableDiscoveryClient> {@Overridepublic String[] selectImports(AnnotationMetadata metadata) {...boolean autoRegister = attributes.getBoolean("autoRegister");if (autoRegister) {List<String> importsList = new ArrayList<>(Arrays.asList(imports));importsList.add("org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration");imports = importsList.toArray(new String[0]);}return imports;}}
一看代码第一反应就是引入了
org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration这个类,再看一下这个类
@Configuration@EnableConfigurationProperties(AutoServiceRegistrationProperties.class)public class AutoServiceRegistrationConfiguration {}
什么都没有,怎么回事.其实机关就是在SpringFactoryImportSelector<EnableDiscoveryClient>这个类.其实他会把类全命名作为自动配置类的key,了解Spring Boot自动加载过程的就应该知道在某个jar包下META-INFO/spring.factories.
org.springframework.cloud.client.discovery.EnableDiscoveryClient=org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration
这样,Spring Cloud启动的时候初始化Eureka就是在EurekaDiscoveryClientConfiguration这个类中.仔细一看,也不对啊,这个类只注册了一个Marker类,而且这个类是个空类.再全局搜索一下哪里引用了这个Marker类,终于发现真正初始化Eureka的类:EurekaClientAutoConfiguration
@Configuration@EnableConfigurationProperties@ConditionalOnClass(EurekaClientConfig.class)@ConditionalOnBean(EurekaDiscoveryClientConfiguration.Marker.class)@ConditionalOnProperty(value = "eureka.client.enabled", matchIfMissing = true)@AutoConfigureBefore({ NoopDiscoveryClientAutoConfiguration.class,CommonsClientAutoConfiguration.class, ServiceRegistryAutoConfiguration.class })@AutoConfigureAfter(name = "org.springframework.cloud.autoconfigure.RefreshAutoConfiguration")public class EurekaClientAutoConfiguration
以上就是达内培训给大家做的内容详解,更多关于IT知识的学习,请继续关注达内培训