服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

从 SpringBoot 生命周期来看服务注册到 Eureka/Nacos 的时机

日期: 来源:Java知音收集编辑:秃秃爱健身

服务注册入口

无论是将服务注册到哪种服务注册中心,服务注册的时机都是在AbstractApplicationContext#finishRefresh()方法中;即Spring容器加载完成、Web服务启动之后;

从SpringCloud规范来看,Spring-cloud-common包定义了一套服务注册、发现的规范;服务注册逻辑在ServiceRegistry类中;

package org.springframework.cloud.client.serviceregistry;

/**
 * Contract to register and deregister instances with a Service Registry.
 *
 * @param <R> registration meta data
 * @author Spencer Gibb
 * @since 1.2.0
 */
public interface ServiceRegistry<R extends Registration> {

 /**
  * Registers the registration. A registration typically has information about an
  * instance, such as its hostname and port.
  * @param registration registration meta data
  */
 void register(R registration);

 /**
  * Deregisters the registration.
  * @param registration registration meta data
  */
 void deregister(R registration);

 /**
  * Closes the ServiceRegistry. This is a lifecycle method.
  */
 void close();

 /**
  * Sets the status of the registration. The status values are determined by the
  * individual implementations.
  * @param registration The registration to update.
  * @param status The status to set.
  * @see org.springframework.cloud.client.serviceregistry.endpoint.ServiceRegistryEndpoint
  */
 void setStatus(R registration, String status);

 /**
  * Gets the status of a particular registration.
  * @param registration The registration to query.
  * @param <T> The type of the status.
  * @return The status of the registration.
  * @see org.springframework.cloud.client.serviceregistry.endpoint.ServiceRegistryEndpoint
  */
 <T> T getStatus(R registration);

}

1、Eureka

从SpringBoot自动装配来看,spring-cloud-netflix-eureka-client包中有一个自动装配类EurekaClientAutoConfiguration

其中使用@Bean注入一个类EurekaAutoServiceRegistration,它实现了SmartLifecycle接口

当Spring容器初始化完成之后会执行所有SmartLifecycle#start()方法,链路如下:

进而走到EurekaAutoServiceRegistration#start()方法中;

其中的serviceRegistry.register()负责服务注册到服务注册中⼼Eureka。Eureka中EurekaServiceRegistry类实现了ServiceRegistry接口,因此Eureka服务注册的入口为EurekaServiceRegistry#register()方法;

@Override
public void register(EurekaRegistration reg) {
 maybeInitializeClient(reg);

 if (log.isInfoEnabled()) {
  log.info("Registering application "
    + reg.getApplicationInfoManager().getInfo().getAppName()
    + " with eureka with status "
    + reg.getInstanceConfig().getInitialStatus());
 }

 reg.getApplicationInfoManager()
   .setInstanceStatus(reg.getInstanceConfig().getInitialStatus());

 reg.getHealthCheckHandler().ifAvailable(healthCheckHandler -> reg
   .getEurekaClient().registerHealthCheck(healthCheckHandler));
}

2、Nacos

从SpringBoot自动装配来看,spring-cloud-alibaba-nacos-discovery 包中有一个自动装配类NacosServiceRegistryAutoConfigurationNacosServiceRegistryAutoConfiguration中会使用@Bean注解装配NacosAutoServiceRegistration类;

public class NacosServiceRegistryAutoConfiguration {

 @Bean
 public NacosServiceRegistry nacosServiceRegistry(
   NacosDiscoveryProperties nacosDiscoveryProperties) {
  return new NacosServiceRegistry(nacosDiscoveryProperties);
 }

 @Bean
 @ConditionalOnBean(AutoServiceRegistrationProperties.class)
 public NacosAutoServiceRegistration nacosAutoServiceRegistration(
   NacosServiceRegistry registry,
   AutoServiceRegistrationProperties autoServiceRegistrationProperties,
   NacosRegistration registration) {
  return new NacosAutoServiceRegistration(registry,
    autoServiceRegistrationProperties, registration);
 }

    ....
}

NacosAutoServiceRegistration间接实现了ApplicationListener接⼝;

其会监听Web服务初始化完成事件WebServerInitializedEvent

在Spring生命周期中,上下文刷新完成阶段,即finishRefresh()方法中会执行所有SmartLifecycle#start()方法;

WebServerStartStopLifecycle实现了SmartLifecycle接口,进而走到WebServerStartStopLifecycle#start()方法,其中会发布Servlet服务初始化完成事件ServletWebServerInitializedEvent

ServletWebServerInitializedEventWebServerInitializedEvent的子类。所以监听WebServerInitializedEventApplicationListener可以监听到ServletWebServerInitializedEvent

NacosAutoServiceRegistration的父类AbstractAutoServiceRegistration中基于ApplicationListener#onApplicationEvent()监听到事件;

然后走到NacosAutoServiceRegistration#register()方法开始做服务注册;

最终会走到ServiceRegistry接口的register(R registration)⽅法将服务注册到注册中⼼。Nacos中NacosServiceRegistry类实现了ServiceRegistry接口。

总结

从Eureka和Nacos做服务注册的入口来看,有两种方式让我们去做服务注册。

  • 基于扩展SmartLifecycle接口实现,在Spring上下文刷新完毕之后会执行SmartLifecycle#start()方法;
  • 基于监听Spring事件WebServerInitializedEvent,在ApplicationListener#onApplicationContext()方法中写逻辑;

基于Spring事件机制的特性,可以做异步服务注册处理。

本质上也是利用了SmartLifecycle接口,区别在于使用了SpringBoot web模块的WebServerStartStopLifecycle

此外,还要遵循spring-cloud-common定义的规范,自定义服务注册的入口类一定要是ServiceRegistry接口的实现类。

作者:秃秃爱健身

来源:blog.csdn.net/Saintmm/article/

details/129250124

推荐

Java面试题宝典

技术内卷群,一起来学习!!

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

相关阅读

  • Spring 官宣,干掉原生 JVM!

  • 「 关注“石杉的架构笔记”,大厂架构经验倾囊相授 」文章来源:http://t.csdn.cn/ioC1d目录1. 团队协作2. 支持的范围3. start.spring.io4. 预先转换5. 结论Spring 团队日前发
  • Spring Boot 关于日期时间格式化处理方式总结

  • 关注我,回复关键字“spring”,免费领取Spring学习资料。来源:juejin.im/post/5e62817fe51d4526d05962a2项目中使用LocalDateTime系列作为DTO中时间的数据类型,但是SpringMVC收到

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 自然资源部公开通报25起土地矿产违法案件

  • 耕地是粮食生产的命根子,关系国家粮食安全;矿产是国家经济社会发展的基础,关系国家经济安全。近年来,各级自然资源主管部门认真贯彻党中央、国务院关于严守国家资源安全底线的决
  • 几万犯罪嫌疑人都在这个贴吧里问“判几年”

  • 「取保候审」是一种特殊的法律措施。根据我国法律规定,有犯罪嫌疑、将被追究刑事责任者,如其涉嫌情节并不严重,且能满足一定条件,便能申请进入「取保候审」的状态。如申请成功,当