0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Spring Boot启动 Eureka流程

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-10 11:40 次阅读

在上篇中已经说过了 Eureka-Server 本质上是一个 web 应用的项目,今天就来看看 Spring Boot 是怎么启动 Eureka 的。

Spring Boot 启动 Eureka 流程

@SpringBootApplication
@EnableEurekaServer
public class EurekaServer {
 public static void main(String[] args) {
  SpringApplication.run(EurekaServer.class, args);
 }
}

上面的代码是最最平常的 Spring Boot 启动类。Spring Boot 启动 eureka 的关键注解就在 @EnableEurekaServer 上面。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({EurekaServerMarkerConfiguration.class})
public @interface EnableEurekaServer {
}

可以看到这注解导入了一个 EurekaServerMarkerConfiguration 类。

@Configuration
public class EurekaServerMarkerConfiguration {

 @Bean
 public Marker eurekaServerMarkerBean() {
  return new Marker();
 }

 class Marker {
 }
}

EurekaServerMarkerConfiguration 向 Spring 容器注入了一个 EurekaServerMarkerConfiguration.Marker 对象。Maker 是一个空对象,是一个标记开关的类。具体开关的类在上面的注释中。

/**
 * Responsible for adding in a marker bean to activate
 * {@link EurekaServerAutoConfiguration}
 *
 * @author Biju Kunjummen
 */

EurekaServerMarkerConfiguration.Marker 对象用于激活 EurekaServerAutoConfiguration 类。

那 EurekaServerAutoConfiguration 类是在什么时候加载的呢?

图片

org.springframework.boot.autoconfigure.EnableAutoConfiguration=
  org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration

如上图,EurekaServerAutoConfiguration 启动的调用是在 spring.factories 中的,在 Spring Boot 的启动过程中,会加载所有的 spring.factories。这个时候会读取并加载里面的内容到 Spring 中。

  • @Import(EurekaServerInitializerConfiguration.class):初始化 EurekaServerAutoConfiguration 的时候会导入 EurekaServerInitializerConfiguration 类。
  • @ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class):当 Spring 中有 EurekaServerMarkerConfiguration.Marker 类的实例存在就把 EurekaServerAutoConfiguration 也导入到 Spring 的容器中。
public class EurekaServerInitializerConfiguration
  implements ServletContextAware, SmartLifecycle, Ordered
  • ServletContextAware:实现这个类可以获取到 ServletContext 容器上下文。
  • SmartLifecycle:当 Spring 容器加载所有 bean 并完成初始化之后,会接着回调实现该接口的类中对应的 start() 方法

看一下 start() 方法里面调用了什么?

@Override
public void start() {
 new Thread(new Runnable() {
  @Override
  public void run() {
   try {
    eurekaServerBootstrap.contextInitialized(EurekaServerInitializerConfiguration.this.servletContext);
    log.info("Started Eureka Server");

    publish(new EurekaRegistryAvailableEvent(getEurekaServerConfig()));
    EurekaServerInitializerConfiguration.this.running = true;
    publish(new EurekaServerStartedEvent(getEurekaServerConfig()));
   }
   catch (Exception ex) {
    // Help!
    log.error("Could not initialize Eureka servlet context", ex);
   }
  }
 }).start();
}

start() 启动了一个线程,在线程里面 Start 了 Eureka Server。eurekaServerBootstrap 是一个自动注入 EurekaServerBootstrap 的对象。EurekaServerBootstrap 在上一篇中已经说过了,它是 Eureka Server 的启动类。最后看看它的 contextInitialized() 方法。

public void contextInitialized(ServletContext context) {
 try {
  initEurekaEnvironment();
  initEurekaServerContext();

  context.setAttribute(EurekaServerContext.class.getName(), this.serverContext);
 }
 catch (Throwable e) {
  log.error("Cannot bootstrap eureka server :", e);
  throw new RuntimeException("Cannot bootstrap eureka server :", e);
 }
}

contextInitialized 方法调用了 initEurekaEnvironment(),初始化 Eureka 的运行环境;initEurekaServerContext(),初始化 Eureka 的上下文。

总结

Spring Boot 启动 Erueka Server 经历了一下步骤:

  1. @EnableEurekaServer 注解
  2. 注入了 EurekaServerMarkerConfiguration.Marker 对象
  3. 判断容器里是否有 EurekaServerMarkerConfiguration.Marker 对象注入了 EurekaServerAutoConfiguration
  4. 导入了实现 SmartLifecycle 接口的 EurekaServerInitializerConfiguration 类
  5. Spring 容器在初始化后调用了 EurekaServerInitializerConfiguration 对象的 start() 方法
  6. start() 中启动了一个线程,调用了 Erueka Server 的启动类:EurekaServerBootstrap。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web
    Web
    +关注

    关注

    2

    文章

    1262

    浏览量

    69441
  • 容器
    +关注

    关注

    0

    文章

    495

    浏览量

    22060
  • eureka
    +关注

    关注

    0

    文章

    4

    浏览量

    1764
  • SpringBoot
    +关注

    关注

    0

    文章

    173

    浏览量

    177
收藏 人收藏

    评论

    相关推荐

    启动Spring Boot项目应用的三种方法

    基础。我们知道了Spring Boot是个什么了,那么我们又该如何启动Spring Boot应用呢?这里小编给大家推荐常用的三种方法。分别是
    发表于 01-14 17:33

    Spring Boot嵌入式Web容器原理是什么

    同样改变了一个传统的Web应用服务的启动流程和部署方式。通过自动配置机制,Spring Boot提供了一个
    发表于 12-16 07:57

    Spring Boot定时任务的重写方法

    Spring Boot应该是目前最火的java开源框架了,它简化了我们创建一个web服务的过程,让我们可以在很短时间、基本零配置就可以启动一个web服务。
    的头像 发表于 01-20 17:38 2440次阅读

    Spring Boot从零入门1 详述

    在开始学习Spring Boot之前,我之前从未接触过Spring相关的项目,Java基础还是几年前自学的,现在估计也忘得差不多了吧,写Spring
    的头像 发表于 12-10 22:18 632次阅读

    Spring认证」什么是Spring GraphQL?

    这个项目建立在 Boot 2.x 上,但它应该与最新的 Boot2.4.x5 相关。 要创建项目,请转到start.spring.io并为要使用的GraphQL传输选择启动器:
    的头像 发表于 08-10 14:08 814次阅读
    「<b class='flag-5'>Spring</b>认证」什么是<b class='flag-5'>Spring</b> GraphQL?

    HAB boot启动流程与实现步骤

    在《深扒HAB boot 启动安全性》中,小编介绍了HAB boot启动流程(如图1所示),其中的1、2、3验证步骤本质上就是验签过程。
    的头像 发表于 08-12 09:39 1543次阅读

    Spring Boot特有的实践

    Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验
    的头像 发表于 09-29 10:24 901次阅读

    强大的Spring Boot 3.0要来了

    来源:OSC开源社区(ID:oschina2013) Spring Boot 3.0 首个 RC 已发布,此外还为两个分支发布了更新:2.7.5 2.6.13。 3.0.0-RC1: https
    的头像 发表于 10-31 11:17 1856次阅读

    Spring Boot Web相关的基础知识

    上一篇文章我们已经学会了如何通过IDEA快速建立一个Spring Boot项目,还介绍了Spring Boot项目的结构,介绍了项目配置文件pom.xml的组成部分,并且撰写了我们
    的头像 发表于 03-17 15:03 649次阅读

    Eureka Server面向接口的方式读取配置文件

    eureka sersver 配置环境 在上一篇中已经介绍了,spring boot 是调用 类的 方法启动 Eureka Server 的
    的头像 发表于 10-09 17:05 552次阅读
    <b class='flag-5'>Eureka</b> Server面向接口的方式读取配置文件

    Spring Boot Actuator快速入门

    不知道大家在写 Spring Boot 项目的过程中,使用过 Spring Boot Actuator 吗?知道 Spring
    的头像 发表于 10-09 17:11 633次阅读

    Spring Boot启动原理

    来指定依赖,才能够运行。我们今天就来分析讲解一下 Spring Boot启动原理。 1. Spring Boot 打包插件
    的头像 发表于 10-13 11:44 643次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的<b class='flag-5'>启动</b>原理

    Spring Boot 的设计目标

    什么是Spring Boot Spring BootSpring 开源组织下的一个子项目,也是 S
    的头像 发表于 10-13 14:56 580次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的设计目标

    安全启动Secure Boot流程

    安全启动-Secure Boot 除了NSPE和SPE两个环境的沟通流程之外,secure boot也是Trusted Firmware很重要的设计环节。 Secure
    的头像 发表于 11-02 16:45 1365次阅读
    安全<b class='flag-5'>启动</b>Secure <b class='flag-5'>Boot</b><b class='flag-5'>流程</b>

    springboot启动流程

    Spring Boot启动流程可以分为以下几个步骤:初始化启动环境、加载自动配置类、创建 Spr
    的头像 发表于 11-22 16:04 653次阅读