【问题标题】:Spring cloud config git refreshRate behaviourSpring cloud config git refreshRate 行为
【发布时间】:2019-08-09 22:06:43
【问题描述】:

我正在尝试设置 Spring Cloud Config Server,并希望根据对支持 git 存储库的更改启用属性的自动刷新。

下面是服务器的bootstrap.yml。

server:
  port: 8080

spring:
  application:
    name: my-configserver
  cloud:
    config:
      server:
        bootstrap: true
        git:
          uri: /Users/anoop/Documents/centralconfig
          refreshRate: 15
          searchPaths:  {application}/properties
    bus:
      enabled: true

根据文档 spring.cloud.config.server.git.refreshRate 确定

配置服务器多久会从 你的 Git 后端

我看到配置客户端在配置更改时没有收到更改通知。我没有为此配置一个 git 钩子,并希望只设置属性就可以完成这项工作。

阿努普

【问题讨论】:

    标签: spring-cloud-config


    【解决方案1】:

    由于您已经配置了refreshRate 属性,每当配置客户端(其他应用程序)调用配置服务器以获取属性时(当应用程序启动或应用程序调用/actuator/refresh 端点时会发生这种情况),它们将获取已获取的属性15 秒(您的刷新率)旧。

    默认情况下,refreshRate 属性设置为 0,这意味着任何时候客户端应用程序请求属性配置服务器都会从 GIT 获取最新的。

    我认为没有任何属性可以让您的客户端应用程序在 GIT 中发生更改/提交时得到通知。这是您的应用需要通过调用actuator/refresh 端点来完成的事情。这可以使用一些调度程序以编程方式完成(尽管我不建议这样做)。

    【讨论】:

      【解决方案2】:

      默认情况下,配置客户端只是在启动时读取 git repo 中的属性,而不是再次读取。

      您实际上可以通过强制 bean 从配置服务器刷新其配置来解决此问题。

      首先,需要在需要重新加载配置的bean中添加@RefreshScope注解。

      其次,在配置客户端的application.yml中启用spring boot actuator。

      # enable dynamic configuration changes using spring boot actuator
      management:
          endpoints:
              web:
                  exposure:
                      include: '*'
      

      然后配置一个计划作业(通过使用 @Scheduled 注释和 fixedRate,...)。当然,fixedRate 应该与配置服务器的 refreshRate 一致。 在该作业中,它将执行如下请求:

      curl -X POST http://username:password@localhost:8888/refresh

      然后您的配置客户端将在每个 fixRate 间隔收到配置 repo 中的更改通知。

      【讨论】:

        【解决方案3】:

        spring.cloud.config.server.git.refreshRate 属性在 Config Server 中配置,并控制拉取更新的频率(如果有),来自 Git。否则,配置服务器的默认行为是仅在某些客户端请求其配置时才连接到 Git 存储库。

        Git Repo -> Config Server
        

        不影响 Config Server 与其客户端的通信。

        Config Server -> Spring Boot app (Config Server clients)
        

        使用 Config Server 客户端构建的 Spring Boot 应用程序在启动期间从 Config Server 中获取所有配置。要使它们能够动态更改初始加载的配置,您需要在 Spring Boot 应用程序 也就是 Config Server 客户端 中执行以下步骤:

        1. 在类路径中包含 Spring Boot Actuator,例如使用 Gradle:
        implementation 'org.springframework.boot:spring-boot-starter-actuator'
        
        1. 通过management.endpoints.web.exposure.include=refresh 属性启用执行器刷新端点
        2. 在你的代码中用@RefreshScope注释持有属性的Bean,例如:
        @RefreshScope
        @Service
        public class BookService {
          @Value("${book.default-page-size:20}")
          private int DEFAULT_PAGE_SIZE;
          //...
        }
        
        1. 随着应用程序的运行,将一些属性更改提交到 repo:
        git commit -am "Testing property changes"
        
        1. 例如,通过向 刷新端点 发送 HTTP POST 请求来触发更新过程(使用 httpie 并假设您的应用在端口 8080 上本地运行:
        http post :8080/actuator/refresh
        

        响应应该如下所示,指示哪些属性(如果有)已更改

        HTTP/1.1 200
        Connection: keep-alive
        Content-Type: application/vnd.spring-boot.actuator.v3+json
        Date: Wed, 30 Jun 2021 10:18:48 GMT
        Keep-Alive: timeout=60
        Transfer-Encoding: chunked
        
        [
            "config.client.version",
            "book.default-page-size"
        ]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-13
          • 2021-05-25
          • 2016-02-18
          • 2019-10-07
          • 2020-07-23
          • 1970-01-01
          • 2016-07-06
          • 2020-07-02
          相关资源
          最近更新 更多