您的位置:首页 > 编程语言 > Java开发

Spring Cloud - Eureka Client源码分析

2017-11-20 20:08 761 查看
准备做个Spring Cloud源码分析系列, 作为Spring Cloud的源码分析笔记.

这一篇是Eureka的客户端.


客户端

两种方式, 最终的实现基本一样.


显示指定服务发现的实现类型

使用
@EnableEurekaClient
注解显示的指定使用Eureka作为服务发现的实现, 并实例化
EurekaClient
实例.
实际上使用的是
@EnableDiscoveryClient
注解.
12345678
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@EnableDiscoveryClientpublic @interface EnableEurekaClient {}


动态配置实现

使用
@EnableDiscoveryClient
注解来配置服务发现的实现.


源码分析

EnableDiscoveryClient
12345678
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Import(EnableDiscoveryClientImportSelector.class)public @interface EnableDiscoveryClient {}
EnableDiscoveryClient
注解的作用主要是用来引入
EnableDiscoveryClientImportSelector


Enab
cc0f
leDiscoveryClientImportSelector

12345678910111213141516
@Order(Ordered.LOWEST_PRECEDENCE - 100)public class EnableDiscoveryClientImportSelector		extends SpringFactoryImportSelector<EnableDiscoveryClient> {	@Override	protected boolean isEnabled() {		return new RelaxedPropertyResolver(getEnvironment()).getProperty(				"spring.cloud.discovery.enabled", Boolean.class, Boolean.TRUE);	}	@Override	protected boolean hasDefaultFactory() {		return true;	}}
EnableDiscoveryClientImportSelector
继承了
SpringFactoryImportSelector
并指定了泛型
EnableDiscoveryClient
这里的泛型是重点.

SpringFactoryImportSelector
123456789101112131415
public abstract class SpringFactoryImportSelector<T>		implements DeferredImportSelector, BeanClassLoaderAware, EnvironmentAware {	private ClassLoader beanClassLoader;	private Class<T> annotationClass;	protected SpringFactoryImportSelector() {		this.annotationClass = (Class<T>) GenericTypeResolver				.resolveTypeArgument(this.getClass(), SpringFactoryImportSelector.class);	}	public String[] selectImports(AnnotationMetadata metadata) {	       ...	}}
这里只截取了部分变量和方法
SpringFactoryImportSelector
是spring cloud common包中的一个抽象类, 主要作用是检查泛型T是否有指定的factory实现, 即spring.factories中有对应类的配置.

spring.factories

spring-cloud-netflix-eureka-client.jar!/META-INF/spring.factories
EnableDiscoveryClient
的指定factory实现是
1234567891011
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.cloud.netflix.eureka.config.EurekaClientConfigServerAutoConfiguration,\org.springframework.cloud.netflix.eureka.config.EurekaDiscoveryClientConfigServiceAutoConfiguration,\org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration,\org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfigurationorg.springframework.cloud.bootstrap.BootstrapConfiguration=\org.springframework.cloud.netflix.eureka.config.EurekaDiscoveryClientConfigServiceBootstrapConfigurationorg.springframework.cloud.client.discovery.EnableDiscoveryClient=\org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration
同时
EnableAutoConfiguration
中包含了
org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration
EurekaClientAutoConfiguration
会为
EurekaDiscoveryClientConfiguration
的实例依赖进行初始化,
如EurekaClient. EurekaClient在构造时会启动一个HeartBeat线程, 线程在运行的时候会做renew的操作, 将Application的信息注册更新到Eureka的服务端.

EurekaDiscoveryClientConfiguration

12345678
@Configuration@EnableConfigurationProperties@ConditionalOnClass(EurekaClientConfig.class)@ConditionalOnProperty(value = "eureka.client.enabled", matchIfMissing = true)@CommonsLogpublic class EurekaDiscoveryClientConfiguration implements SmartLifecycle, Ordered {        ...}
如果你想学习Java工程化、高性能及分布式、高性能、深入浅出。性能调优、Spring,MyBatis,Netty源码分析和大数据等知识点可以来找我。

而现在我就有一个平台可以提供给你们学习,让你在实践中积累经验掌握原理。主要方向是JAVA架构师。如果你想拿高薪,想突破瓶颈,想跟别人竞争能取得优势的,想进BAT但是有担心面试不过的,可以加我的Java架构进阶群:554355695
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 源码 架构 Java