SpringBoot已经成为Java届的No.1框架,每天都在蹂躏着数百万的程序员们。当服务的压力上升,对SpringBoot服务的优化就会被提上议程。
本文将详细讲解SpringBoot服务优化的一般思路,并附上若干篇辅助文章作为开胃菜。
本文较长,最适合收藏之。
1.有监控才有方向
在开始对SpringBoot
服务进行性能优化之前,我们需要做一些准备,把SpringBoot
服务的一些数据暴露出来。
比如,你的服务用到了缓存,就需要把缓存命中率这些数据进行收集;用到了数据库连接池,就需要把连接池的参数给暴露出来。
我们这里采用的监控工具是Prometheus
,它是一个是时序数据库,能够存储我们的指标。SpringBoot
可以非常方便的接入到Prometheus
中。
创建一个SpringBoot
项目后,首先,加入maven
依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>
然后,我们需要在application.properties
配置文件中,开放相关的监控接口。
management.endpoint.metrics.enabled=true
management.endpoints.web.exposure.include=*
management.endpoint.prometheus.enabled=true
management.metrics.export.prometheus.enabled=true
启动之后,我们就可以通过访问 http://localhost:8080/actuator/prometheus
来获取监控数据。
想要监控业务数据也是比较简单的。你只需要注入一个MeterRegistry
实例即可。下面是一段示例代码:
@Autowired
MeterRegistry registry;
@GetMapping("/test")
@ResponseBody
public String test() {
registry.counter("test",
"from", "127.0.0.1",
"method", "test"
).increment();
return "ok";
}
从监控连接中,我们可以找到刚刚添加的监控信息。
test_total{from="127.0.0.1",method="test",} 5.0
这里简单介绍一下流行的Prometheus
监控体系,Prometheus
使用拉
的方式获取监控数据,这个暴露数据的过程可以交给功能更加齐全的telegraf
组件。
如图,我们通常使用Grafana
进行监控数据的展示,使用AlertManager
组件进行提前预警。这一部分的搭建工作不是我们的重点,感兴趣的同学可自行研究。下图便是一张典型的监控图,可以看到Redis的缓存命中率等情况。
2.Java生成火焰图
火焰图是用来分析程序运行瓶颈的工具。在纵向,表示的是调用栈的深度;横向表明的是消耗的时间。所以格子的宽度越大,越说明它可能是一个瓶颈。
火焰图也可以用来分析Java应用。可以从github上下载async-profiler
的压缩包 进行相关操作。
比如,我们把它解压到/root/
目录。然后以javaagent
的方式来启动Java应用。命令行如下:
java -agentpath:/root/build/libasyncProfiler.so=start,svg,file=profile.svg -jar spring-petclinic-2.3