https://www.jianshu.com/p/fd93d941bf3b

Endpoint

SpringBoot的Endpoint主要是用来监控应用服务的运行状况,并集成在Mvc中提供查看接口。内置的Endpoint比如HealthEndpoint会监控dist和db的状况,MetricsEndpoint则会监控内存和gc的状况。 Endpoint的接口如下,其中*invoke()*是主要的方法,用于返回监控的内容,*isSensitive()*用于权限控制。

public interface Endpoint {

String getId();

boolean isEnabled();

boolean isSensitive();

T invoke();

}

Endpoint的加载还是依靠spring.factories实现的。spring-boot-actuator包下的META-INF/spring.factories配置了EndpointAutoConfiguration。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

...

org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration,\

...

EndpointAutoConfiguration就会注入必要的Endpoint。有些Endpoint需要外部的收集类,比如TraceEndpoint。

@Bean

@ConditionalOnMissingBean

public TraceEndpoint traceEndpoint() {

return new TraceEndpoint(this.traceRepository);

}

TraceEndpoint会记录每次请求的Request和Response的状态,需要嵌入到Request的流程中,这里就主要用到了3个类。

1.TraceRepository用于保存和获取Request和Response的状态。

public interface TraceRepository {

List findAll();

void add(Map traceInfo);

}

2.WebRequestTraceFilter用于嵌入web request,收集请求的状态并保存在TraceRepository中。

3.TraceEndpoint,invoke()方法直接调用TraceRepository保存的数据。

Endpoint的Mvc接口主要是通过EndpointWebMvcManagementContextConfiguration实现的,这个类的配置也放在spring.factories中。

...

org.springframework.boot.actuate.autoconfigure.ManagementContextConfiguration=\

org.springframework.boot.actuate.autoconfigure.EndpointWebMvcManagementContextConfiguration,\

org.springframework.boot.actuate.autoconfigure.EndpointWebMvcHypermediaManagementContextConfiguration

EndpointWebMvcManagementContextConfiguration注入EndpointHandlerMapping来实现Endpoint的Mvc接口。

自定义Endpoint

自定义Endpoint也是类似的原理。这里自定义Endpoint实现应用内存的定时收集。完整的代码放在Github上了。

收集内存,MemStatus是内存的存储结构,MemCollector是内存的收集类,使用Spring内置的定时功能,每5秒收集当前内存。

2.自定义Endpoint,getId是EndPoint的唯一标识,也是Mvc接口对外暴露的路径。invoke方法,取出maxMemory和totalMemory和对应的时间。

3.AutoConfig,注入了MyEndPoint,和MemCollector。

public static class EndPointAutoConfig {

private List status = new ArrayList();

@Bean

public MyEndPoint myEndPoint() {

return new MyEndPoint(status);

}

@Bean

public MemCollector memCollector() {

return new MemCollector(status);

}

}

4.程序入口,运行后访问http://localhost:8080/my 就可以看到了。

@Configuration

@EnableAutoConfiguration

public class CustomizeEndPoint {

public static void main(String[] args) {

SpringApplication application = new SpringApplication(CustomizeEndPoint.class);

application.run(args);

}

}

结语

Endpoint也是通过spring.factories实现扩展功能,注入了对应的Bean来实现应用监控的功能。

转载于:https://www.cnblogs.com/davidwang456/articles/10268127.html

大牛带你深入SpringBoot:自定义Endpoint 及实现原理相关推荐

  1. java endpoint_大牛带你深入SpringBoot:自定义Endpoint 及实现原理

    Endpoint SpringBoot的Endpoint主要是用来监控应用服务的运行状况,并集成在Mvc中提供查看接口.内置的Endpoint比如HealthEndpoint会监控dist和db的状况 ...

  2. 深入SpringBoot:自定义Endpoint

    Endpoint SpringBoot的Endpoint主要是用来监控应用服务的运行状况,并集成在Mvc中提供查看接口.内置的Endpoint比如HealthEndpoint会监控dist和db的状况 ...

  3. @retention注解作用_分分钟带你玩转SpringBoot自定义注解

    在工作中,我们有时候需要将一些公共的功能封装,比如操作日志的存储,防重复提交等等.这些功能有些接口会用到,为了便于其他接口和方法的使用,做成自定义注解,侵入性更低一点.别人用的话直接注解就好.下面就来 ...

  4. 一篇文章带你搞定 SpringBoot 自定义欢迎页和网页图标 favicon

    文章目录 一.SpringBoot 自定义项目启动欢迎页 二.SpringBoot 自定义 favicon 一.SpringBoot 自定义项目启动欢迎页 已经分析过SpringBoot 的资源访问路 ...

  5. 一篇文章带你解决 SpringBoot 中 favicon 失效,不显示问题

    文章目录 一.常规思路 二.其他思路 一.常规思路 正常显示我们已经知道:一篇文章带你搞定 SpringBoot 自定义欢迎页和网页图标 favicon 如果正常设置不好使常规的思路是: (1)旧版的 ...

  6. springboot 自定义过滤器

    springboot 自定义过滤器 Filter 过滤器主要是用来过滤用户请求的,它允许我们对用户请求进行前置处理和后置处理,比如实现 URL 级别的权限控制.过滤非法请求等等.Filter 过滤器是 ...

  7. springboot自定义异常处理

    springboot自定义异常处理 参考文章: (1)springboot自定义异常处理 (2)https://www.cnblogs.com/SimpleWu/p/10044468.html 备忘一 ...

  8. 通过带数据盘的自定义镜像来创建使用应用程序网关的虚拟机规模集

    虚拟机规模集是一种 Azure 计算资源,可用于部署和管理一组相同的 VM. 规模集中的所有 VM 采用相同的配置,无需对 VM 进行预配就可以进行自动横向扩展. 这样就可以更方便地构建面向大型计算. ...

  9. SpringBoot自定义Filter

    SpringBoot自定义Filter SpringBoot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,当然我们可以自定 义F ...

最新文章

  1. 性能测试学习过程中遇到的问题与解答1
  2. Android新版NDK环境配置(免Cygwin)
  3. rabbitmq python amqp user_python 与rabbitmq
  4. mysql md5版本校验_通过MD5校验和验证MySQL软件包的完整性
  5. java邮箱_java发送邮件(qq邮箱)
  6. Angular 7和.NET Core 2.2——全球天气(第3部分)
  7. 面对 MySQL 查询索引失效,程序员的六大优化技巧!
  8. Android、iOS、和Web如何做灰度发布?
  9. 平均值的最值化 - 二分
  10. spark根据key输出到多个目录
  11. Atitit 号码规范 靓号指南 attilax总结 v4 r926.docx
  12. Windows 下快速删除大量文件的办法
  13. Python贴吧小爬虫
  14. october php,关于Laravel之October的安装配置过程
  15. LayoutInflater.inflate()方法的深入理解
  16. Ubuntu 无法连接网络
  17. 封装系统之新手操作版
  18. DCloud之APP离线SDK升级步骤(3.5.3升至最新版3.6.7.81556_20221018)
  19. java ee jpi是什么,JPI 150、300、600RF、RJ什么意思
  20. for…in和for…of的用法与区别

热门文章

  1. 《剑指offer》c++版本 12. 矩阵中的路径
  2. TortoiseGit git push提示fatal: HttpRequestException encountered remote: Invalid username or password.
  3. springboot第十一讲
  4. 一部分 数据 迁移_软件测试员12小时惊魂记:数据库迁移出大事故,如何测试?...
  5. win10 搭载文件服务器,win10远程文件服务器
  6. java每隔一段时间执行_8.Android中,每隔一段时间执行某一个任务(Timer)
  7. python分析双十一销量
  8. MySQL中数据库的操作
  9. 数据库与数据库管理系统的基本概念
  10. java软件测试方法有哪些方法有哪些_如何才算掌握Java