非常哇塞的 SpringBoot性能优化长文!

SpringBoot已经成为Java届的No.1框架,每天都在蹂躏着数百万的程序员们。当服务的压力上升,对SpringBoot服务的优化就会被提上议程。

本文将详细讲解SpringBoot服务优化的一般思路,并附上若干篇辅助文章作为开胃菜。

本文较长,最适合收藏之。

1.有监控才有方向

在开始对SpringBoot服务进行性能优化之前,我们需要做一些准备,把SpringBoot服务的一些数据暴露出来。

比如,你的服务用到了缓存,就需要把缓存命中率这些数据进行收集;用到了数据库连接池,就需要把连接池的参数给暴露出来。

我们这里采用的监控工具是Prometheus,它是一个是时序数据库,能够存储我们的指标。SpringBoot可以非常方便的接入到Prometheus中。

创建一个SpringBoot项目后,首先,加入maven依赖。


     org.springframework.boot
     spring-boot-starter-actuator
 
 
     io.micrometer
     micrometer-registry-prometheus
 
 
     io.micrometer
     micrometer-core
 

然后,我们需要在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 来获取监控数据。

非常哇塞的 SpringBoot性能优化长文!_第1张图片

想要监控业务数据也是比较简单的。你只需要注入一个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组件。

非常哇塞的 SpringBoot性能优化长文!_第2张图片

如图,我们通常使用Grafana进行监控数据的展示,使用AlertManager组件进行提前预警。这一部分的搭建工作不是我们的重点,感兴趣的同学可自行研究。下图便是一张典型的监控图,可以看到Redis的缓存命中率等情况。

非常哇塞的 SpringBoot性能优化长文!_第3张图片

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

你可能感兴趣的:(java,大数据,java)