Spring не принимает изменения в ConfigMap

У меня есть приложение, использующее Springboot, я пытаюсь разрешить обновления конфигурации «на лету», используя следующее.

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.3.1-RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
        <version>1.1.4.RELEASE</version>
    </dependency>

Я пытался следовать этой статье https://medium.com/swlh/kubernetes-configmap-configuration-and-reload-strategy-9f8a286f3a44, и мне удалось заставить Spring извлекать конфигурацию из ConfigMap, однако, если я обновлю ConfigMap во время работы приложения, spring не забрать его. Это мой bootstrap.yml

spring:
  cloud:
    kubernetes:
      config:
        enabled: true
        sources:
          - namespace: default
            name: hello-world
      reload:
        enabled: true
        mode: event
        strategy: refresh

Я также пытался использовать mode: polling, но все равно без изменений. И я добавил роль view.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: {{ include "hello-world.fullname" . }}-view
roleRef:
  kind: ClusterRole
  name: view
  apiGroup: rbac.authorization.k8s.io
subjects:
  # Authorize specific service accounts:
  - kind: ServiceAccount
    name: {{ include "hello-world.serviceAccountName" . }}
    namespace: default

Я думаю, может быть, это то, как я загружаю свою конфигурацию в Java?

@ConfigurationProperties(prefix = "spring.app")
@Bean
public Properties appProperties() {
    return new Properties();
}

@Autowired
@Qualifier("appProperties")
private Properties props;

Моя карта конфигурации:

apiVersion: v1
kind: ConfigMap
metadata:
  name: hello-world
data:
  application.yml: |-
    spring:
      app:
        message: Hello

Затем я получаю доступ к таким значениям, как props.getProperty("message")

ОБНОВЛЕНИЕ:

Итак, мне удалось получить изменения, включив конечную точку обновления актуатора:

management:
  endpoint:
    restart:
      enabled: true

Но теперь у меня новый вопрос, нужно ли это? Есть ли способ заставить это работать без включения привода?


person Dfarrelly    schedule 25.07.2020    source источник
comment
С концептуальной точки зрения: 1) что-то внешнее вызывает приложение весенней загрузки и сообщает ему обновить контекст изменился, и он обновляет контекст. Итак, я думаю, вы сделали первое, и я не знаю, встроен ли в spring boot механизм для 2) или вам нужно построить его, используя @Scheduler   -  person Kavithakaran Kanapathippillai    schedule 25.07.2020
comment
Перезагрузка конфигурации работает, но компонент Spring, использующий это свойство, не обновляется. Нужно ли нам добавлять дополнительную конфигурацию, чтобы зависимый компонент также обновлялся?   -  person Vali7394    schedule 22.12.2020


Ответы (2)


Пожалуйста, убедитесь, что у вас есть следующая зависимость в вашем POM с версией.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

У меня была аналогичная проблема, которая решена после добавления этого.

person PrabhakarP    schedule 06.08.2020

обязательно добавьте @RefreshScope к bean-компоненту, который вы хотите перезагрузить в горячем режиме, с вводом значений из карт конфигурации.

person ams    schedule 02.05.2021