问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SpringBoot:提高性能的五个技巧

创作时间:
作者:
@小白创作中心

SpringBoot:提高性能的五个技巧

引用
CSDN
1.
https://blog.csdn.net/jtaiykt/article/details/144311515


Spring Boot 由于其简单性和易用性,已成为许多企业应用程序的支柱。但是,要构建高性能、可扩展的应用程序,开发人员必须超越基础知识。
在这篇深入探讨的文章中,我们将探讨高级配置技术,这些技术将使您能够从 Spring Boot 应用程序中榨取每一点性能。
我们将涵盖从微调属性、优化线程池、利用 Spring Boot Actuator、有效管理 bean 和优化数据库交互的所有内容。

使用高级配置属性微调 Spring Boot

使用正确的属性配置 Spring Boot 对于优化应用程序性能至关重要。
虽然 Spring Boot 的默认设置在一般场景下足够使用,但如果想应对更复杂的情况,还需要我们对一些高级配置有更多的了解。

使用 HikariCP 进行连接池

HikariCP 是 Spring Boot 中的默认连接池,以其占用空间小、性能卓越而著称。您可以通过调整以下属性来优化连接池:

spring.datasource.hikari.maximum-pool-size: 30
spring.datasource.hikari.minimum-idle: 10
spring.datasource.hikari.idle-timeout: 600000
spring.datasource.hikari.max-lifetime: 1800000
spring.datasource.hikari.connection-timeout: 30000
  • maximum-pool-size:这决定了池中的最大连接数。将此值设置得太高可能会耗尽数据库资源,而设置得太低可能会导致瓶颈。
  • minimum-idle:池中维护的最小空闲连接数。帮助使连接为传入请求做好准备。
  • idle-timeout:连接在符合逐出条件之前可以在池中处于空闲状态的最长时间。
  • max-lifetime:池中连接的最长生命周期。在此时间之后,连接将停用,以避免连接过时的问题。
  • connection-timeout:客户端等待池中连接的最大毫秒数。设置为零表示没有超时。

基准测试:使用 JMH (Java Microbenchmark Harness) 等工具来衡量这些设置对负载下应用程序的影响。

缓存管理

Spring Boot 支持多种缓存解决方案,包括 Redis、Ehcache 和 Caffeine。缓存可以通过减少昂贵的数据库调用次数来显著提高性能。
以下是配置 Redis 缓存的方法:

spring.cache.type: redis
spring.cache.redis.time-to-live: 60000  # 60 seconds
spring.cache.redis.cache-names: users, transactions
spring.redis.host: localhost
spring.redis.port: 6379
  • spring.cache.redis.time-to-live:指定缓存条目的生存时间(以毫秒为单位)。根据您需要数据的最新程度进行调整。
  • spring.cache.redis.cache-names:定义缓存区域。每个缓存名称对应于一个 Redis 键空间。

代码示例

@Service
public class UserService {
@Cacheable(cacheNames = "users", key = "#userId")
    public User getUserById(Long userId) {
        // Simulate a costly database operation
        return userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException(userId));
    }
}

缓存监控:使用 spring-boot-starter-actuator 公开 /actuator/caches 并监控缓存统计信息。

优化线程池

有效地管理线程池可以防止高并发性应用程序中出现瓶颈。Spring Boot 允许你配置线程池以执行任务:

spring.task.execution.pool.core-size: 10
spring.task.execution.pool.max-size: 50
spring.task.execution.pool.queue-capacity: 100
spring.task.execution.thread-name-prefix: taskExecutor-
  • core-size:将创建并保留在池中的线程的核心数。
  • max-size:池中允许的最大线程数。
  • queue-capacity:在执行任务之前保存任务的队列的容量。

代码示例

@Configuration
public class TaskExecutorConfig {
@Bean(name = "taskExecutor")
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(50);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("MyAppExecutor-");
        executor.initialize();
        return executor;
    }
}

性能分析:使用 VisualVM 或 YourKit 等工具监控线程活动并相应地调整线程池设置。

利用 Spring Boot Actuator 进行性能监控

Spring Boot Actuator 提供了大量可用于监控和优化应用程序性能的信息。

运行状况检查和指标

Actuator 的运行状况检查可让您深入了解系统中各种组件的运行状况。您可以扩展运行状况检查以包含自定义指示器:

代码示例

@Component
public class DatabaseHealthIndicator extends AbstractHealthIndicator {
@Autowired
    private DataSource dataSource;
    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        try (Connection conn = dataSource.getConnection()) {
            if (conn.isValid(1000)) {
                builder.up();
            } else {
                builder.down();
            }
        }
    }
}

公开运行状况终端节点

management.endpoints.web.exposure.include: health, metrics
management.endpoint.health.show-details: always

自定义指标

您可以使用 MeterRegistry 定义和公开自定义指标:

代码示例

@Component
public class CustomMetrics {
private final MeterRegistry meterRegistry;
    @Autowired
    public CustomMetrics(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
        registerMetrics();
    }
    private void registerMetrics() {
        Gauge.builder("active.users", this, CustomMetrics::getActiveUsers)
             .description("Number of active users")
             .register(meterRegistry);
    }
    public int getActiveUsers() {
        // Fetch the count of active users from your database
        return userRepository.countActiveUsers();
    }
}

安全最佳实践:限制敏感终端节点(如 /metrics 和 /env)的使用 management.endpoint.web.exposure.include 暴露,并使用基于角色的访问控制保护它们。

用于优化部署的环境特定配置

不同的环境通常需要不同的配置才能实现最佳性能。Spring Boot 使通过配置文件和外部化属性轻松管理这些配置。

特定于配置文件的属性

在单独的文件(如 application-dev.yml、application-prod.yml 等)中定义特定于环境的属性:

# application-prod.yml
server.port: 8080
spring.datasource.url: jdbc:mysql://prod-db-server:3306/myapp
spring.datasource.username: prod_user
spring.datasource.password: prod_pass
spring.jpa.hibernate.ddl-auto: validate

通过命令行参数或环境变量激活配置文件:

$ java -jar myapp.jar --spring.profiles.active=prod

部署提示:使用 Docker 或 Kubernetes ConfigMap 管理云环境中的配置属性。

外部化配置

外部化配置允许您管理应用程序外部的设置,从而更轻松地部署更改,而无需重新部署应用程序:

spring.config.import: configserver:http://config-server-url

配置示例

spring.datasource.url=${DB_URL:jdbc:mysql://localhost:3306/myapp}
spring.datasource.username=${DB_USER:root}
spring.datasource.password=${DB_PASS:password}

安全提示:使用 Vault 等工具安全地管理敏感配置,例如数据库密码和 API 密钥。

使用 ApplicationContext 和 Bean Management 提高性能

正确管理 bean 和应用程序上下文对于优化 Spring Boot 应用程序中的启动时间和内存使用至关重要。

延迟初始化

默认情况下, Spring Boot 在应用程序启动期间预先初始化所有单例 bean。但是,您可以启用延迟初始化以缩短启动时间:

spring.main.lazy-initialization: true

代码示例

@Configuration
public class AppConfig {
@Bean
    @Lazy
    public MyService myService() {
        return new MyServiceImpl();
    }
}

性能提示:请谨慎使用延迟初始化,因为它可能会在首次访问 bean 时引入延迟。

作用域

了解和选择正确的 bean 范围对于应用程序性能至关重要:

  • Singleton:创建并在整个应用程序上下文中共享 Bean 的单个实例。
  • Prototype:每次请求 bean 时都会创建一个新实例。
  • 请求/会话:范围限定为 HTTP 请求或会话,通常用于 Web 应用程序。

代码示例

@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class PrototypeBean {
    // Business logic here
}

用例:对保存用户会话数据的有状态 bean 使用 prototype 范围,以避免线程安全问题。

使用 Spring Data JPA 进行数据库优化

数据库通常是高性能应用程序中的瓶颈。优化应用程序与数据库的交互方式可以显著提高性能。

自定义查询和索引

虽然 Spring Data JPA 会为您生成查询,但复杂的情况可能需要自定义查询:

代码示例

public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.status = :status AND u.registrationDate < :date")
    List<User> findInactiveUsers(@Param("status") String status, @Param("date") LocalDate date);
}

索引提示:确保为经常查询的列(如上例中的 status 和 registrationDate)编制索引,以加快查询执行速度。

批处理

批处理允许您有效地处理大量数据:

spring.jpa.properties.hibernate.jdbc.batch_size: 30
spring.jpa.properties.hibernate.order_inserts: true
spring.jpa.properties.hibernate.order_updates: true

代码示例

@Service
public class UserBatchService {
@Autowired
    private UserRepository userRepository;
    @Transactional
    public void saveUsers(List<User> users) {
        userRepository.saveAll(users);
    }
}

性能提示:根据数据库的功能调整批处理大小,以避免过多的内存使用或事务超时。

通过利用 Spring Boot 中的高级配置技术,可以显著提高 Java 应用程序的性能。
从优化连接池和线程管理,到利用 Spring Boot Actuator 来监控和微调数据库交互,这些策略将帮助您构建不仅高性能而且可扩展,可维护的应用程序。随着应用程序的发展,持续分析和监控是保持最佳性能的关键。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号