springboot2性能优化

在 Spring Boot 应用开发中,性能优化是一个非常重要的主题。以下是一些常见的性能优化策略,包括 Profiling 和监控、连接池配置,以及 Caffeine 和 Redis 缓存的集成。我们将详细讲解每个部分,并给出相应的示例。

1. Profiling 和监控

1.1 Profiling

Profiling 是分析程序性能的过程,您可以使用多种工具和方法来分析您的 Spring Boot 应用程序的性能瓶颈。常用的工具有:

  • VisualVM: 一个监控和故障排除工具,可以查看运行中的 Java 应用程序的 CPU 和内存使用情况。
  • JProfiler: 更专业的性能分析工具,提供详细的内存、CPU 和线程分析。

1.2 监控

为了对 Spring Boot 应用程序进行监控,可以使用 Spring Boot Actuator。Actuator 提供了一组功能强大的监控和管理功能。

添加依赖

pom.xml 中添加 Actuator 依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置 Actuator

application.properties 中,启用 Actuator 的端点:

1
2
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

访问监控数据

启动应用后,您可以通过以下 URL 访问 Actuator 提供的监控数据:

  • 健康检查:http://localhost:8080/actuator/health
  • 应用信息:http://localhost:8080/actuator/info
  • 性能指标:http://localhost:8080/actuator/metrics

2. 连接池配置

连接池是管理数据库连接的机制,可以提高数据库访问的性能。在 Spring Boot 中,您通常可以使用 HikariCP,这是默认的连接池实现。

配置连接池

application.properties 中配置 HikariCP:

1
2
3
4
5
6
7
8
9
10
11
spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# HikariCP 配置
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.max-lifetime=1800000
  • maximum-pool-size:最大连接数。
  • minimum-idle:最小空闲连接数。
  • idle-timeout:连接空闲时间。
  • connection-timeout:连接超时。
  • max-lifetime:连接的最长生命周期。

3. Caffeine 和 Redis 缓存集成

缓存可以显著提高应用程序的性能,减少数据库负载。Caffeine 是一个高性能的缓存库,而 Redis 是一个分布式缓存解决方案。

3.1 Caffeine 缓存集成

添加依赖

pom.xml 中添加 Caffeine 的依赖:

1
2
3
4
5
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.9.2</version>
</dependency>

创建 Caffeine 缓存配置

您可以在 Spring Boot 中创建配置类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cache.CacheManager;
import org.springframework.cache.caffeine.CaffeineCacheManager;

import java.util.concurrent.TimeUnit;

@Configuration
@EnableCaching
public class CacheConfig {

@Bean
public CacheManager caffeineCacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager("users");
cacheManager.setCaffeine(Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(100));
return cacheManager;
}
}

使用 Caffeine 缓存

在服务类中使用缓存:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

private final UserMapper userMapper;

public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}

@Cacheable(value = "users")
public List<User> getAllUsers() {
return userMapper.findAll();
}
}

3.2 Redis 缓存集成

添加依赖

pom.xml 中添加 Redis 的依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置 Redis

application.properties 中配置 Redis 连接:

1
2
spring.redis.host=localhost
spring.redis.port=6379

创建 Redis 缓存配置

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
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cache.CacheManager;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import java.time.Duration;

@Configuration
@EnableCaching
public class RedisConfig {

@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfig = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(cacheConfig)
.build();
}
}

使用 Redis 缓存

在服务类中使用缓存:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

private final UserMapper userMapper;

public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}

@Cacheable(value = "users")
public List<User> getAllUsers() {
return userMapper.findAll();
}
}