使用 Spring Cloud Config 重新启动 HikariCP

HikariCP restart with Spring Cloud Config

我最近将我的应用程序配置为使用 Spring Cloud Config 和 Github 作为配置存储库。

  • Spring Boot - 2.1.1.RELEASE
  • Spring Cloud Dependencies - Greenwich.RC2

我的应用程序使用了几乎所有开箱即用的东西。我刚刚在 application.yml 中配置了数据库,并且我有 HikariCP 自动配置在后台发挥作用。

我正在使用这项调用 RefreshEndpoint 上的 refresh() 方法的作业刷新我的应用程序。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.endpoint.RefreshEndpoint;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@EnableScheduling
@Component
public class ConfigRefreshJob {

    private static final Logger LOG = LoggerFactory.getLogger(ConfigRefreshJob.class);

    private static final int ONE_MINUTE = 60 * 1000;

    private final RefreshEndpoint refreshEndpoint;

    @Autowired
    public ConfigRefreshJob(final RefreshEndpoint refreshEndpoint) {
        this.refreshEndpoint = refreshEndpoint;
    }

    @Scheduled(fixedDelay = ONE_MINUTE)
    public void refreshConfigs() {
        LOG.info("Refreshing Configurations - {}", refreshEndpoint.refresh());
    }
}

一切似乎都运行良好,但每次刷新配置时我都会看到以下日志。这些日志显示 HikariCP 池在我每次刷新时关闭并启动。

2019-01-16 18:54:55.817  INFO 14 --- [taskScheduler-9] o.s.b.SpringApplication       : Started application in 0.155 seconds (JVM running for 144.646)
2019-01-16 18:54:55.828  INFO 14 --- [taskScheduler-9] c.z.h.HikariDataSource        : HikariPool-1555 - Shutdown initiated...
2019-01-16 18:54:55.828  INFO 14 --- [taskScheduler-9] c.z.h.HikariDataSource        : HikariPool-1555 - Shutdown completed.
2019-01-16 18:54:55.828  INFO 14 --- [taskScheduler-9] c.d.ConfigRefreshJob          : Refreshing Configurations - []
2019-01-16 18:55:03.094  INFO 14 --- [  XNIO-1 task-5] c.z.h.HikariDataSource        : HikariPool-1556 - Starting...
2019-01-16 18:55:03.123  INFO 14 --- [  XNIO-1 task-5] c.z.h.HikariDataSource        : HikariPool-1556 - Start completed.

如果我查看这些日志的时间,重新配置 HikariCP 大约需要 8 秒。

到目前为止我还没有在我的应用程序中发现任何问题,因为现在应用程序的负载不是那么多,但这里有几个问题。

  1. Does this restart of HikariCP cause issues with the load to the application is increased?

  2. If the restarting can cause issues, is there a way to not refresh the HikariCP?

HikariCP 默认情况下可刷新,因为一旦池启动,对其进行的更改将密封配置。

所以禁用它,将 spring.cloud.refresh.refreshable 设置为一个空集。

这里是在yaml中配置的例子

spring:
  cloud:
    refresh:
      refreshable:
      - com.example.app.config.ConfigProperties

其中 ConfigProperties 是用 @RefreshScope 注释的 class。

这对我有用 (spring-boot-2.2.7.RELEASE, spring-cloud-Hoxton .SR4)

spring.cloud.refresh.extra-refreshable=com.zaxxer.hikari.HikariDataSource