spring源码案例分析之健康检查
今天给⼤家带来的分析案例是springboot集成的程序健康检测案例,⾸先是基于springboot1.5.13版本,其次主要分析的包如下图所⽰。
主要类包
之所以要分析这块内容,其实还是由于⼯作上导致的,前段时间,运维想要让我们在程序种加⼊⼀个可以访问程序状态的路径,以便于运维检测程序,然后springboot也⾃带了这个功能,所以我就直接使⽤了,但是使⽤的过程种,发现了⼀个问题,如下图所⽰。
显⽰我的db的状态为unknown,这我就瞬间来精神了,凭啥我得db就是unknown状态,难道不配显⽰信息吗?当然这是玩笑之话,为啥显⽰未知状态,肯定还是由程序判断的结果,⾄于原因,我们接下来具体分析这⼀块内容,也会顺带分析到整个健康检测的⼀些核⼼机制功能实现点。
⾄于如何引⼊spring健康检查,在boot的情况下,下⾯俩张图估计⼤家都应该明⽩了。
主要引⼊的jar包
yml⽂件需要配置的点
怀着好奇⼼态的我,对引⼊jar没啥兴趣,但是我有点对这个配置感兴趣,我怀着试试的⼼态,直接把这个配置给删除了,然后重新访问了/health路径,如下图所⽰。
好家伙,还有这么⼀⼿,配置不配置依旧还会显⽰信息,但是显⽰的信息不⼀样,于是我们带着疑问进⾏分析去了。
⾸先我们分析下这个配置究竟是⼲嘛的,根据spring⾃带的配置提⽰,如下图所⽰
org.springframework.boot.actuate.autoconfigure.ManagementServerProperties
我们到了配置的类在这⾥,所有在yml中配置的信息都会注⼊到这个类中。关于配置信息,我们先简单分析这到,后续会有关联点。
关于配置信息,我们先简单分析这到,后续会有关联点。springboot是啥
接下来我们分析/health这个路径,⼤家都知道,既然我能通过http访问这个/health,说明他在spring容器中肯定存在⼀个控制器,但是我们并没有⾃⼰去写这个控制器,由此猜测可能是spring⾃⼰注册的,这⾥就有点⼩⿇烦了,如果我们⾃⼰写的话起来还⽐较好,因为直接
使⽤idea搜索或者包都浏览⼀遍,但是spring⾃⼰注册的话,就不可控了,⿁知道他是怎么注册进去的,我们先试着使⽤idea全局搜索试⼀下:
我们发现了这个使⽤点,但是经过排查,发现并不是我们要的。貌似这样我们⼜陷⼊了⿊暗,感觉前途⼀⽚⿊暗,spring源码分析之路宣告封闭,总不能把spring所有类都看⼀遍在哪注册了这个/health,估计看完头发都掉完了。各位莫着急,我这⾥教⼤家俩招,保证⼿到擒来:
第⼀种⽅式:
观看spring启动⽇志,
会有这么⼀⾏数据
2021-01-15 09:59:29 [main] [org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry:543] -Mapped "{[/health || /health.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object
org.springframework.dpoint.mvc.HealthMvcEndpoint.invoke(javax.servlet.http.HttpServletRequest,java.security.Pr
incipal)
到这⾥估计⼤家都看明⽩了,spring启动⼤多数情况下会默认输出所有控制器的映射信息,包括对应的handler,上⾯的信息告诉我们,这
个/health对应的控制器为HealthMvcEndpoint,我们⼀会再去分析这个类。接下来看第⼆种⽅式。
第⼆种⽅式:
debug源码,这个需要对springmvc相关源码⽐较熟悉的⼈适⽤,⼤家都知道,我们spring有⼀个核⼼servlet就是dispatcherservlet,所有的映射控制器处理,都要经过他转发,因此我们直接去到这个类。
在第940⾏打上断点,然后使⽤postman或者浏览器发起请求,就会⾃动跳转到这个断点上,⾄于如何定位到doDispatcher以及这个mappedHandler,详细过程需要结合springmvc部份的源码以及梳理,这⾥就暂不深究了,有兴趣的⼩伙伴们可以私信或者留⾔告诉我,我
有兴趣的⼩伙伴们可以私信或者留⾔告诉我,我抽时间可以安排⼀下,你懂得!
好了,俩种⽅式⼤致上已经告诉⼩伙伴们了,这⾥再说⼀点,貌似还有⼀种⽅式可以使⽤接⼝请求输出所有映射的详细信息,这⾥也不深究了,这俩种⽅式不仅仅限于本篇⽂章的⽤途,以后你们如果也想去寻某个映射或者控制器,都可以使⽤这俩种⽅式。还是⽐较实⽤的。
接下来,我们重点去分析这个HealthMvcEndpoint类。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。