赞
踩
SpringBoot已经成为Java届的No.1框架,每天都在蹂躏着数百万的程序员们。当服务的压力上升,对SpringBoot服务的优化就会被提上议程。
本文将详细讲解SpringBoot服务优化的一般思路,并附上若干篇辅助文章作为开胃菜。
本文较长,最适合收藏之。
在开始对 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的缓存命中率等情况。
火焰图是用来分析程序运行瓶颈的工具。在纵向,表示的是调用栈的深度;横向表明的是消耗的时间。所以格子的宽度越大,越说明它可能是一个瓶颈。
火焰图也可以用来分析Java应用。可以从github上下载 async-profiler
的压缩包 进行相关操作。
比如,我们把它解压到 /root/
目录。然后以 javaagent
的方式来启动Java应用。命令行如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。