[记录点滴]Spring Boot Admin源码分析笔记

0x00 摘要

本文是过去使用Spring Boot Admin时候分析源码的笔记。虽然比较简单,但是也可以看出Spring Boot Admin的实现思想。

0x01 如何使用

如何使用?

在你自己application中加入 @EnableAdminServer,就可以被监控到。

@EnableAdminServer的实现

@Import(AdminServerImportSelector.class) ----- 引入Spring Boot Admin的自动配置类
@EnableZuulServer -------------------------- Spring Boot Admin做了个gateway
public @interface EnableAdminServer {
}

@Import(AdminServerImportSelector.class)

其作用是导出配置:

NotifierConfiguration,
HazelcastStoreConfiguration,
AdminServerCoreConfiguration,
AdminServerWebConfiguration,
DiscoveryClientConfiguration,
RevereseZuulProxyConfiguration

0x02 configuration

以下是各种相关配置

  • AdminServerCoreConfiguration 生成很多基础bean
  • AdminServerWebConfiguration web相关的配置和bean,EventListener
  • DiscoveryClientConfiguration 与client发现相关的bean
  • NotifierConfiguration: NotifierListener,以及各种notify需要的配置:CompositeNotifierConfiguration,MailNotifierConfiguration。TelegramNotifierConfiguration......
  • RevereseZuulProxyConfiguration 关于zuul的配置, 比如 ApplicationHeadersFilter,SimpleHostRoutingFilter... 因为SBA默认使用@EnableZuulServer
  • HazelcastStoreConfiguration 暂时用不到,网格存储用的

0x03 几个关键类

以下是一些关键类

  • ApplicationRegistry - 主要作用是: 响应各个service client的注册,生成一个application,然后放到 ApplicationStore中。很多地方会用到,比如 RegistryController 会调用它获取application列表, 获取某一个app details。
  • ApplicationStore --- 存储application,可以从这里入手来进行mysql存储,比如自己写一个MysqlApplicationStore。
    • SimpleApplicationStore -------- 就是一个内存map
    • HazelcastApplicationStore ----- 开源的可扩展的内存数据网格
  • ApplicationIdGenerator --- 就是产生个id
  • AdminServerProperties --- 每个应用对应的属性,用来配置zuul路由

0x04 discovery

Spring Boot Admin 使用 Spring Clouds DiscoveryClient @EnableDiscoveryClient 来发现应用。

org.springframework.cloud.client.ServiceInstance转换成Application。其中还获取了 instance.getMetadata().get(KEY_HEALTH_PATH); instance.getMetadata().get(KEY_MANAGEMENT_PATH); 

ApplicationDiscoveryListener : 分别响应了以下消息来发现client

import org.springframework.cloud.client.discovery.event.HeartbeatEvent;
import org.springframework.cloud.client.discovery.event.InstanceRegisteredEvent;
import org.springframework.cloud.client.discovery.event.ParentHeartbeatEvent;
import org.springframework.boot.context.event.ApplicationReadyEvent;

如果收到了HeartbeatEvent,则在discover中,会通过 discoveryClient.getServices() 得到目前注册到eureka的服务名字列表,然后注册。

0x05 event

这是内部的各种event,发现了client之后就在内部进行消息传递,进行内部后续动作,比如updateStatus,更新application store

0x06 journal

数据结构

ApplicationEventJournal 就是用SimpleJournaledEventStore(list) 存储 ClientApplicationEvent 

Web resource

使用SseEmitter实现了推送。

所谓的Sse其实就是Server-Sent Events,即服务器推送事件,属于HTML5的一项新功能,常用于服务器主动通知客户端有相关信息的更新。其他替代方法一般有WebSocket和客户端定时轮询,前者过于复杂,后者又过于低效而笨拙。SseEmitter属于ResponseBodyEmitter的子类,可以生成text/event-stream格式的信息。

会不停地往浏览器推送最新的journal。

0x07 Model

StatusInfo, Info 这两个类都在Application中存储。

StatusUpdateApplicationListener 会在 ApplicationReadyEvent/ContextClosedEvent/ClientApplicationRegisteredEvent 各种响应中进行update。

0x08 registry

ApplicationRegistry : 主要作用就是响应各个service client的注册,生成一个application,然后放到 ApplicationStore中。

RegistryController : REST controller for controlling registration of managed applications。也用来给浏览器获取applicaiton列表,application detail。

0x09 web

AdminController : 用来注释了几个类 RegistryController, NotificationFilterController

@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AdminController {
}

ApplicationOperations : Handles all rest operations invoked on a registered application. 对于info, health, 就是调用application中的对应url获取数据后转发。

[记录点滴]Spring Boot Admin源码分析笔记的更多相关文章

  1. Spring Boot缓存源码分析

    前言 项目里面要增加一个应用缓存,原本想着要怎么怎么来整合ehcache和springboot,做好准备配置这个配置那个,结果只需要做三件事: pom依赖 写好一个ehcache的配置文件 在boot ...

  2. spring boot 入口源码分析

    public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); / ...

  3. spring boot admin 源码包的编译

    https://github.com/codecentric/spring-boot-admin 下载地址: 编译要求: Build Requirements: Node.js v8.x (LTS) ...

  4. Spring的IOC源码分析

    Spring IOC 容器源码分析 Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不 ...

  5. Spring IOC 容器源码分析 - 循环依赖的解决办法

    1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...

  6. Spring IOC 容器源码分析 - 创建单例 bean 的过程

    1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...

  7. Spring IOC 容器源码分析 - 获取单例 bean

    1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...

  8. spring boot @Value源码解析

    Spring boot 的@Value只能用于bean中,在bean的实例化时,会给@Value的属性赋值:如下面的例子: @SpringBootApplication @Slf4j public c ...

  9. Spring Developer Tools 源码分析:三、重启自动配置'

    接上文 Spring Developer Tools 源码分析:二.类路径监控,接下来看看前面提到的这些类是如何配置,如何启动的. spring-boot-devtools 使用了 Spring Bo ...

  10. Spring Developer Tools 源码分析:二、类路径监控

    在 Spring Developer Tools 源码分析一中介绍了 devtools 提供的文件监控实现,在第二部分中,我们将会使用第一部分提供的目录监控功能,实现对开发环境中 classpath ...

随机推荐

  1. vue中方法中数据已更新,但是视图却没有变化解决方法

    今天在项目中碰到这样一个问题: 从父组件中传过来的props中的数据,在子组件中想加入一个变量.在created中加入变量,在方法中打印次变量是有的,但是当变量发生变化之后,视图中是响应不到的. 解决 ...

  2. Linux之新增硬盘,分区,挂载

    1.新增硬盘后, 查看当前磁盘信息 fdisk -l 可以看到除了当前的第一块硬盘(sda)外还有一块sdb的第二块硬盘(sdb),然后用命令: fdisk /dev/sdb  给第二块硬盘进行分区 ...

  3. 【Amadeus原创】centos中挖矿病毒kdevtmpfsi的终极解决方法

    试了很久,最终的解决方法如下: 1,编写sh脚本:rm_wk.sh #!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr ...

  4. 百度地图基本事件: marker、polygon等覆盖物添加以及删除

    marker拖拽获取坐标 https://www.cnblogs.com/niunan/p/6822124.html   如果添加大量聚合点的时候,请参考如下几篇文章 https://www.zhih ...

  5. 用触摸屏辅助3D建模

    现在在触摸屏上进行3D建模的软件很多,这里说的是另一个概念. 我的设想是将触摸屏当做一个带有 ViewPort 的输入设备. 比如 Blender 在建模时,我们可以通过一个外接的触摸屏从另一个角度观 ...

  6. 搭建 zerotier 的行星服务

    放弃moon节点,直接搭建Zerotier根服务器_软件应用_什么值得买 Zerotier的优点在于其部署十分简便,只需在zerotier官网注册登陆并创建网络,在自己的设备安装客户端加入网络后,ze ...

  7. [sa-token]StpUtil.getLoginId

    闲聊 一般情况下,我们想用uid,可能需要前端将uid传过来,或者将token传来,然后我们进行识别. 用了sa-token之后,可以使用StpUtil.getLoginId()方法获取当前会话的用户 ...

  8. Spark面试题汇总及答案(推荐收藏)

    一.面试题 Spark 通常来说,Spark与MapReduce相比,Spark运行效率更高.请说明效率更高来源于Spark内置的哪些机制? hadoop和spark使用场景? spark如何保证宕机 ...

  9. Mac下SSH Key配置

    1 .检查.ssh文件夹是否存在 $ ls -al ~/.ssh 2.如果不存在新建.ssh文件平 $ mkdir ~/.ssh 3.生成KEY在命令行中输入,your_email@example.c ...

  10. Qt开发经验小技巧236-240

    关于在头文件中定义函数使用static关键字的血的教训. 有时候我们需要将一些常用函数写在一个文件中供很多地方调用,如果写的是 int doxxx{} 这种,在你多个地方引用的时候,肯定会编译报错提示 ...