现在,我们经常会使用Spring Boot以开发Web服务,其内嵌容器的方法的确使得开发效率大大提升。
由于网关层通常是直接面对用户请求的一层,也是微服务里面最上游的一个服务,其请求量通常是所有服务中最大的,如果服务出现了性能上的问题,网关层通常都会出现阻塞、超时等现象,这时候就很可能需要性能的调优,其中最常见的则是参数调优。但如何知道哪些性能参数成为了瓶颈(如容器线程数是否不足等),则是调优的前提条件。
本文总结介绍如何在使用了Spring Boot的前提下,获取运行时的Tomcat性能运行情况。
Spring Boot中有一个Spring Boot actuator的模块,用来监控和管理应用的运行状态,例如健康状况,线程运行情况等。
Maven 依赖:
1 2 3 4 5 6 |
|
然后当Spring Boot运行之后,Spring Boot会有很多服务暴露在http服务中,这些服务叫EndPoints, 通过 http://{应用路径}/actuator 这个 url 即可访问,例如 http://{应用路径}/actuator/info, http://{应用路径}/actuator/health 这两个endpoints是默认开启的。
其中actuator这个路径可以通过配置修改:
1
|
|
以下是获取健康状态的一个例子:
1
|
|
可能会得到类似这样的结果:
1 2 3 |
|
比较简陋,如果希望这个接口有更多数据,可以尝试这样的配置:
1
|
|
结果就会丰富了(我的应用用了Redis):类似
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
但是这还不够,我们需要详细的容器数据。监控状况只是一部分。而这些我们想要的数据,是在一个叫metric的EndPoint下面。 但是此endpoint 默认没有暴露到http接口的的,需要添加配置:
1 2 |
|
之后我们就能访问这个metric有哪些数据了
$ curl ‘http://localhost:8080/actuator/metric’ -i -X GET
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
|
其中列出的是所有可以获取的监控数据,在其中我们发现了我们想要的
1 2 3 |
|
那么如何获取其中的值呢?只需要在metric路径下加上希望获取的指标即可: curl ‘http://localhost:8080/actuator/metric/tomcat.threads.busy’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
在此,基本我们想要的数据都能实时的通过http服务接口的方式获取了,那么在流量峰值的时候,一些实时的状态便可获取到了。
监控数据
但是我们面对的情况是这样的,半个小时前,一个push活动带来了很大的量,但现在流量已经过去了,需要定位当时的性能问题意味着需要采集到过去的数据。所以我们可能需要一个服务定期去监控这些数据。Spring Boot已经考虑到了这种情况,所以其中有一个prometheus的模块,他是一个独立的服务去采集其中的监控数据并可视化,具体的介绍可以参考:https://www.callicoder.com/spring-boot-actuator-metrics-monitoring-dashboard-prometheus-grafana/
以日志形式定期输出监控数据
很多时候,如果有日志的方法去定期输出监控的数据这样已经足够我们分析了。在Spring Boot 2.x里,只需要配置一个Bean
1 2 3 4 5 6 7 |
|
之所以需要Spring Boot版本2.x,LoggingMeterRegistry是因为是micrometer-core里面的1.10以上才引入的,而Spring Boot 1.x都低于这个版本,如果不想升级Spring Boot版本,可以尝试显示变更此版本:
1 2 3 4 5 |
|
最后日志的内容就会每一分钟的打印出来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
|
如果需要修改打印的频率,可修改LoggingRegistryConfig以更改其打印频率
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|