日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Cloud Netflix Eureka client源码分析

發(fā)布時(shí)間:2025/4/5 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Cloud Netflix Eureka client源码分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.client端

EurekaClient提供三個(gè)功能:

EurekaClient API contracts are:
* - provide the ability to get InstanceInfo(s) (in various different ways)
* - provide the ability to get data about the local Client (known regions, own AZ etc)
* - provide the ability to register and access the healthcheck handler for the client

使用@EnableEurekaClient起效,其定義如下:

/*** Convenience annotation for clients to enable Eureka discovery configuration* (specifically). Use this (optionally) in case you want discovery and know for sure that* it is Eureka you want. All it does is turn on discovery and let the autoconfiguration* find the eureka classes if they are available (i.e. you need Eureka on the classpath as* well).** @author Dave Syer* @author Spencer Gibb*/ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @EnableDiscoveryClient public @interface EnableEurekaClient {}

?

注冊

/*** 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; } EnableDiscoveryClientImportSelector繼承自SpringFactoryImportSelector,在容器啟動(dòng)時(shí)觸發(fā),前文已經(jīng)有介紹執(zhí)行路徑:

在其父類org.springframework.cloud.commons.util.SpringFactoryImportSelector
的String[] selectImports(AnnotationMetadata metadata)方法中正是根據(jù)這個(gè)標(biāo)記類判定是否加載如下定義的類。

@Overridepublic String[] selectImports(AnnotationMetadata metadata) {if (!isEnabled()) {return new String[0];}AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(this.annotationClass.getName(), true));Assert.notNull(attributes, "No " + getSimpleName() + " attributes found. Is "+ metadata.getClassName() + " annotated with @" + getSimpleName() + "?");// Find all possible auto configuration classes, filtering duplicates List<String> factories = new ArrayList<>(new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(this.annotationClass, this.beanClassLoader)));if (factories.isEmpty() && !hasDefaultFactory()) {throw new IllegalStateException("Annotation @" + getSimpleName()+ " found, but there are no implementations. Did you forget to include a starter?");}if (factories.size() > 1) {// there should only ever be one DiscoveryClient, but there might be more than// one factorylog.warn("More than one implementation " + "of @" + getSimpleName()+ " (now relying on @Conditionals to pick one): " + factories);}return factories.toArray(new String[factories.size()]);}

SpringFactoriesLoader調(diào)用loadFactoryNames其實(shí)加載META-INF/spring.factories下的class。

spring-cloud-netflix-eureka-client\src\main\resources\META-INF\spring.factories中配置:

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

1.1?EurekaClientAutoConfiguration

?1.1.1 定義HasFeatures Bean

@Beanpublic HasFeatures eurekaFeature() {return HasFeatures.namedFeature("Eureka Client", EurekaClient.class);}

1.1.2 定義EurekaClientConfigBean bean

@Bean@ConditionalOnMissingBean(value = EurekaClientConfig.class, search = SearchStrategy.CURRENT)public EurekaClientConfigBean eurekaClientConfigBean() {EurekaClientConfigBean client = new EurekaClientConfigBean();if ("bootstrap".equals(this.env.getProperty("spring.config.name"))) {// We don't register during bootstrap by default, but there will be another// chance later.client.setRegisterWithEureka(false);}return client;}

1.1.3 定義EurekaInstanceConfigBean bean

@Bean@ConditionalOnMissingBean(value = EurekaInstanceConfig.class, search = SearchStrategy.CURRENT)public EurekaInstanceConfigBean eurekaInstanceConfigBean(InetUtils inetUtils) {EurekaInstanceConfigBean instance = new EurekaInstanceConfigBean(inetUtils);instance.setNonSecurePort(this.nonSecurePort);instance.setInstanceId(getDefaultInstanceId(this.env));if (this.managementPort != this.nonSecurePort && this.managementPort != 0) {if (StringUtils.hasText(this.hostname)) {instance.setHostname(this.hostname);}RelaxedPropertyResolver relaxedPropertyResolver = new RelaxedPropertyResolver(env, "eureka.instance.");String statusPageUrlPath = relaxedPropertyResolver.getProperty("statusPageUrlPath");String healthCheckUrlPath = relaxedPropertyResolver.getProperty("healthCheckUrlPath");if (StringUtils.hasText(statusPageUrlPath)) {instance.setStatusPageUrlPath(statusPageUrlPath);}if (StringUtils.hasText(healthCheckUrlPath)) {instance.setHealthCheckUrlPath(healthCheckUrlPath);}String scheme = instance.getSecurePortEnabled() ? "https" : "http";instance.setStatusPageUrl(scheme + "://" + instance.getHostname() + ":"+ this.managementPort + instance.getStatusPageUrlPath());instance.setHealthCheckUrl(scheme + "://" + instance.getHostname() + ":"+ this.managementPort + instance.getHealthCheckUrlPath());}return instance;}

1.1.4 定義DiscoveryClient bean

@Beanpublic DiscoveryClient discoveryClient(EurekaInstanceConfig config,EurekaClient client) {return new EurekaDiscoveryClient(config, client);}

1.1.5 定義EurekaServiceRegistry bean

@Beanpublic EurekaServiceRegistry eurekaServiceRegistry() {return new EurekaServiceRegistry();}

1.1.6 定義EurekaRegistration bean

@Bean@ConditionalOnBean(AutoServiceRegistrationProperties.class)@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)public EurekaRegistration eurekaRegistration(EurekaClient eurekaClient, CloudEurekaInstanceConfig instanceConfig, ApplicationInfoManager applicationInfoManager) {return EurekaRegistration.builder(instanceConfig).with(applicationInfoManager).with(eurekaClient).with(healthCheckHandler).build();}

1.1.7 定義EurekaAutoServiceRegistration bean

@Bean@ConditionalOnBean(AutoServiceRegistrationProperties.class)@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)public EurekaAutoServiceRegistration eurekaAutoServiceRegistration(ApplicationContext context, EurekaServiceRegistry registry, EurekaRegistration registration) {return new EurekaAutoServiceRegistration(context, registry, registration);}
1.2 EurekaClientConfiguration
1.2.1 定義EurekaClient bean @Bean(destroyMethod = "shutdown")@ConditionalOnMissingBean(value = EurekaClient.class, search = SearchStrategy.CURRENT)public EurekaClient eurekaClient(ApplicationInfoManager manager,EurekaClientConfig config) {return new CloudEurekaClient(manager, config, this.optionalArgs,this.context);}

1.2.2 定義ApplicationInfoManager bean

@Bean@ConditionalOnMissingBean(value = ApplicationInfoManager.class, search = SearchStrategy.CURRENT)public ApplicationInfoManager eurekaApplicationInfoManager(EurekaInstanceConfig config) {InstanceInfo instanceInfo = new InstanceInfoFactory().create(config);return new ApplicationInfoManager(config, instanceInfo);}

1.3?RefreshableEurekaClientConfiguration

1.3.1 定義EurekaClient bean

@Bean(destroyMethod = "shutdown")@ConditionalOnMissingBean(value = EurekaClient.class, search = SearchStrategy.CURRENT)@org.springframework.cloud.context.config.annotation.RefreshScope@Lazypublic EurekaClient eurekaClient(ApplicationInfoManager manager,EurekaClientConfig config, EurekaInstanceConfig instance) {manager.getInfo(); // force initializationreturn new CloudEurekaClient(manager, config, this.optionalArgs,this.context);}

1.3.2 定義ApplicationInfoManager

@Bean@ConditionalOnMissingBean(value = ApplicationInfoManager.class, search = SearchStrategy.CURRENT)@org.springframework.cloud.context.config.annotation.RefreshScope@Lazypublic ApplicationInfoManager eurekaApplicationInfoManager(EurekaInstanceConfig config) {InstanceInfo instanceInfo = new InstanceInfoFactory().create(config);return new ApplicationInfoManager(config, instanceInfo);} 參考文獻(xiàn):
http://blog.csdn.net/neosmith/article/details/53131023




?

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/6347168.html

總結(jié)

以上是生活随笔為你收集整理的Spring Cloud Netflix Eureka client源码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。