• Spring Boot Admin2 AdminServerAutoConfiguration详解


    其他相关文章:

    1. Spring Boot Admin 参考指南
    2. SpringBoot Admin服务离线、不显示健康信息的问题
    3. Spring Boot Admin2 @EnableAdminServer的加载

    前面已经分析了@EnableAdminServer的作用,唯一的功能是将AdminServerMarkerConfiguration.Marker类加载到Spring中,并且知道了AdminServerAutoConfiguration类的加载依赖于AdminServerMarkerConfiguration.Marker类。
    这篇文章主要来分析AdminServerAutoConfiguration的作用,加载了哪些东西。

    首先AdminServerAutoConfiguration类头部有如下几个注解:

    @Configuration(proxyBeanMethods = false)
    @Conditional(SpringBootAdminServerEnabledCondition.class)
    @ConditionalOnBean(AdminServerMarkerConfiguration.Marker.class)
    @EnableConfigurationProperties(AdminServerProperties.class)
    @ImportAutoConfiguration({ AdminServerInstanceWebClientConfiguration.class, AdminServerWebConfiguration.class })
    @AutoConfigureAfter({ WebClientAutoConfiguration.class })
    @Lazy(false)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • @Configuration(proxyBeanMethods = false)
      表示是一个配置类,并且不被Spring 代理,如同普通类一样
    • @Conditional(SpringBootAdminServerEnabledCondition.class)
      根据SpringBootAdminServerEnabledCondition做为条件判断是否加载该类,SpringBootAdminServerEnabledCondition中根据spring.boot.admin.server.enabled是否为true来处理,优先级最高
    • @ConditionalOnBean(AdminServerMarkerConfiguration.Marker.class)
      判断Spring容器中是否存在AdminServerMarkerConfiguration.Marker 的Bean
    • @EnableConfigurationProperties(AdminServerProperties.class)
      启用AdminServerProperties配置文件,AdminServerProperties能够做为Bean 注入该类,其是我们常用的spring.boot.admin 相关配置
    • @ImportAutoConfiguration({ AdminServerInstanceWebClientConfiguration.class, AdminServerWebConfiguration.class })
      加载AdminServerInstanceWebClientConfiguration、AdminServerWebConfiguration配置类。AdminServerInstanceWebClientConfiguration 包括了一系列服务实例Http调用相关的Bean配置。AdminServerWebConfiguration定义了SBA2监控相关的接口Controller,以及ReactiveRestApiConfiguration和ServletRestApiConfirguation相关的配置
    • @AutoConfigureAfter({ WebClientAutoConfiguration.class })
      顾名思义,表示该类将在WebClientAutoConfiguration载入后,再加载
    • @Lazy(false)
      表示不延迟加载,覆盖默认配置

    再往下看,是构造器部分

    	private final AdminServerProperties adminServerProperties;
    
    	public AdminServerAutoConfiguration(AdminServerProperties adminServerProperties) {
    		this.adminServerProperties = adminServerProperties;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里将AdminServerProperties配置以构造器的方式注入该类

    继续看其他加载的配置

    	@Bean
    	@ConditionalOnMissingBean
    	public InstanceRegistry instanceRegistry(InstanceRepository instanceRepository,
    			InstanceIdGenerator instanceIdGenerator) {
    		return new InstanceRegistry(instanceRepository, instanceIdGenerator);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    该部分创建了一个用于管理实例注册的Bean,InstanceRepository 用于提供实例的持久化,InstanceIdGenerator 用于生成实例id

    	@Bean
    	@ConditionalOnMissingBean
    	public ApplicationRegistry applicationRegistry(InstanceRegistry instanceRegistry,
    			InstanceEventPublisher instanceEventPublisher) {
    		return new ApplicationRegistry(instanceRegistry, instanceEventPublisher);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    该部分创建一个用于管理所有已注册的应用

    	@Bean
    	@ConditionalOnMissingBean
    	public InstanceIdGenerator instanceIdGenerator() {
    		return new HashingInstanceUrlIdGenerator();
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    该部分创建了一个根据实例健康URL地址来生成实例ID的Bean

    	@Bean
    	@ConditionalOnMissingBean
    	public StatusUpdater statusUpdater(InstanceRepository instanceRepository,
    			InstanceWebClient.Builder instanceWebClientBulder) {
    		return new StatusUpdater(instanceRepository, instanceWebClientBulder.build());
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    该部分创建了一个用于查询更新实例状态的Bean

    	@Bean(initMethod = "start", destroyMethod = "stop")
    	@ConditionalOnMissingBean
    	public StatusUpdateTrigger statusUpdateTrigger(StatusUpdater statusUpdater, Publisher<InstanceEvent> events) {
    		StatusUpdateTrigger trigger = new StatusUpdateTrigger(statusUpdater, events);
    		trigger.setInterval(this.adminServerProperties.getMonitor().getStatusInterval());
    		trigger.setLifetime(this.adminServerProperties.getMonitor().getStatusLifetime());
    		return trigger;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    StatusUpdateTrigger 会在加载的时候开启一个定时任务,用来检查所有实例的状态,检测周期和状态生存时间可以通过spring.boot.admin.monitor.status-intervalspring.boot.admin.monitor.status-lifetime配置。除此之外,其监听了实例变更事件,会在实例注册和实例更新的时候,触发去更新实例状态。

    	@Bean
    	@ConditionalOnMissingBean
    	public EndpointDetector endpointDetector(InstanceRepository instanceRepository,
    			InstanceWebClient.Builder instanceWebClientBuilder) {
    		InstanceWebClient instanceWebClient = instanceWebClientBuilder.build();
    		ChainingStrategy strategy = new ChainingStrategy(new QueryIndexEndpointStrategy(instanceWebClient),
    				new ProbeEndpointsStrategy(instanceWebClient, this.adminServerProperties.getProbedEndpoints()));
    		return new EndpointDetector(instanceRepository, strategy);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    EndpointDetector 用于检测实例暴露的端点

    	@Bean(initMethod = "start", destroyMethod = "stop")
    	@ConditionalOnMissingBean
    	public EndpointDetectionTrigger endpointDetectionTrigger(EndpointDetector endpointDetector,
    			Publisher<InstanceEvent> events) {
    		return new EndpointDetectionTrigger(endpointDetector, events);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    EndpointDetectionTrigger 实例端点检测触发器,在实例状态变更和实例注册更新的时候,触发检测

    	@Bean
    	@ConditionalOnMissingBean
    	public InfoUpdater infoUpdater(InstanceRepository instanceRepository,
    			InstanceWebClient.Builder instanceWebClientBuilder) {
    		return new InfoUpdater(instanceRepository, instanceWebClientBuilder.build());
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    InfoUpdater 调用info接口,更新实例信息

    	@Bean(initMethod = "start", destroyMethod = "stop")
    	@ConditionalOnMissingBean
    	public InfoUpdateTrigger infoUpdateTrigger(InfoUpdater infoUpdater, Publisher<InstanceEvent> events) {
    		InfoUpdateTrigger trigger = new InfoUpdateTrigger(infoUpdater, events);
    		trigger.setInterval(this.adminServerProperties.getMonitor().getInfoInterval());
    		trigger.setLifetime(this.adminServerProperties.getMonitor().getInfoLifetime());
    		return trigger;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    InfoUpdateTrigger 实例信息检查触发器,道理同StatusUpdateTrigger

    	@Bean
    	@ConditionalOnMissingBean(InstanceEventStore.class)
    	public InMemoryEventStore eventStore() {
    		return new InMemoryEventStore();
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    InMemoryEventStore 实例存储类,基于ConcurrentMap

    	@Bean(initMethod = "start", destroyMethod = "stop")
    	@ConditionalOnMissingBean(InstanceRepository.class)
    	public SnapshottingInstanceRepository instanceRepository(InstanceEventStore eventStore) {
    		return new SnapshottingInstanceRepository(eventStore);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    SnapshottingInstanceRepository 实例持久化类,用于操作InstanceEventStore

    到此AdminServerAutoConfiguration自动配置类结束

  • 相关阅读:
    多线程(进阶) - 2.5w字总结
    【golang】interface 如此动人,却被遗忘
    X86实模式与保护模式简介
    5-Spring架构源码分析-Spring IOC之 Spring 统一资源加载策略
    中风失语 18 年,AI + 脑机接口帮她「意念发声」
    多亏了这个神器,让我斩获华为入场券
    算法--分隔链表(Kotlin)
    Linux一行命令筛选并停止某个服务的进程
    基于Java毕业设计养老院管理系统源码+系统+mysql+lw文档+部署软件
    2023-10-24 LeetCode每日一题(掷骰子等于目标和的方法数)
  • 原文地址:https://blog.csdn.net/weixin_40972073/article/details/127990150