使用 Spring Boot Cloud Config 更改类路径中的 application.properties

Use Spring Boot Cloud Config to change application.properties in classpath

我必须在我的 Spring 引导应用程序运行期间更改自定义定义的 spring 属性(通过 @ConfigurationProperties bean 定义)。

使用 Spring Cloud Config 是否有优雅的方式来做到这一点?

我不想在 git 存储库中使用外部 application.properties(因为 spring 引导应用程序已交付给客户,我不想创建 git 每个人的存储库)。

我只想访问和更改我的 Spring 容器中的本地 application.properties(类路径中的那个,位于 src/main/resources)文件或(如果那不可能)在 Spring 云配置服务器中,我可以将其嵌入到我的 Spring 启动应用程序中。这有可能吗?

顺便说一句:目标是为客户创建一个可视化编辑器,以便他们可以在运行时在 spring 启动应用程序中更改 application.properties。

Spring Boot 支持基于配置文件的应用程序配置。只需添加 application-<profile>.properties 文件。然后就在 运行 将应用程序 select 配置文件根据环境使用 spring.profiles.active.

-Dspring.profiles.active=dev

这将 运行 带有 application-dev.properties 文件的应用程序(覆盖默认的 application.properties,即您可以将通用内容保留在默认文件中,并根据环境)

附带说明一下,拥有用于配置的回购并不是必须的。您可以将它们放在 class 路径中并给出 search-location.

spring:
  application:
    name: config-server
  profiles:
    active: native
  cloud:
    config:
      server:
        native:
          search-locations: classpath:configs/

这实际上是可能的,而且最终很容易实现。我花了一整天的时间来收集所有信息。也许这对某人有帮助:

你基本上只需要 Spring Actuator,但对于某个端点,你还需要 spring 云依赖。 (向 Spring Actuator 的 /env 端点发出 Post 请求)

要在运行时更改您的配置,只需将以下内容添加到您的 application.properties:

management.endpoints.web.exposure.include: env,refresh
management.endpoint.env.post.enabled: true //this property is only available when spring cloud is added as dependency to your project

如果您(像我一样)不需要外部配置的功能,那么您还必须添加以下内容(否则,您的 Spring 应用将无法启动并抛出某些配置的错误丢失)

spring.cloud.config.enabled: false

现在,如果您向 /actuator/env 端点发送一个 POST 请求,并在 HTTP 主体中以 {"name":"...", "value" 的形式包含一个对象: “...”}(名称是配置的名称 属性),然后您的配置就会更改。要检查这一点,您可以向 /actuator/env/[name_of_config_property] 发出 GET 请求,然后查看您的配置 属性 是否已更改。无需重新启动您的应用程序。

如果您使用自定义的,请不要忘记在您的 SecurityConfig 中保护 /actuator 端点。

在我看来,您既不需要配置 类 中的 @RefreshScope 注释,也不需要 /actuator/refresh 端点来“应用”配置更改。