当前位置: 首页 > 知识库问答 >
问题:

Spring Cloud配置客户端未刷新属性

颜志学
2023-03-14

我有一个配置服务器,一个Spring Boot2.3.1应用程序连接到该服务器,为正确的配置文件加载配置属性。

配置服务器使用git获取每个应用程序和配置文件的配置文件。

这工作正常,当Spring Boot应用程序启动时,它将从配置服务器加载属性的正确值。

当我在配置文件中更新一个值并将其推送到git中,然后对Spring Boot应用程序的postendpoint执行/acturet/refresh操作时,我会看到返回一个json,其中包含我更新的属性的名称,这是我所期望的。

问题是,在此之后,属性实际上并没有更新。它们仍然保持原有的价值。

例如:

@Service
//@RefreshScope
public class WhitelistService {
  private static final Logger log = LoggerFactory.getLogger(WhitelistService.class);

  private final WhitelistRepository whitelistRepository;
  private final Boolean isWhitelistEnabled;
  private final Integer identifier;

  @Autowired
  public WhitelistService(WhitelistRepository whitelistRepository,
        @Value("${app.whitelist.isEnabled:true}") Boolean isWhitelistEnabled,
        @Value("${app.whitelist.identifier:-1}") Integer identifier) {
    super();
    this.whitelistRepository = whitelistRepository;
    this.isWhitelistEnabled = isWhitelistEnabled;
    this.identifier = identifier;
  }

  public boolean processBasedOnWhitelist(Long id) {
    if (!isWhitelistEnabled)
        return true;
    else if (identifier <= -1)
        return isInWhitelist(id);
    else
        return isInWhitelistWithIdentifier(id, identifier);
  }

 }

如果@refrescope被注释掉,并且我在适当的属性文件中更新app.whitelist.isenabled并将其推送到配置文件中,然后执行acture/refresh,那么app.whitelist.isenabled将保持旧值。

即使我为value字段使用setter或在声明字段时使用@value对字段本身进行注释,也是如此。

如果启用@refreshScope,则会按预期更新值。

但是,上次我使用配置服务器和Spring Boot作为客户机,在另一个项目中,情况并非如此(除非在Spring Boot 2.3.1中改变了这一点)。它可以立即更新,而不需要@refreshScope

我是不是漏掉了什么?我希望避免为我有属性值引用的每个Bean添加另一个注释。这不是什么大事,但似乎没有必要,而且容易出错。

共有1个答案

秦浩漫
2023-03-14

在Spring云总线文档:https://Cloud.Spring.io/spring-cloud-static/spring-cloud-bus/2.1.0.release/single/spring-cloud-bus.html#_bus_refresh_endpoint

/acturet/bus-refreshendpoint清除RefreshScope缓存并重新绑定@ConfigurationProperties。有关更多信息,请参阅刷新范围文档。

因此,您可以使用@refreshScope对bean进行注释,也可以使用@ConfigurationProperties进行注释。由于bean没有使用@ConfigurationProperties注释,因此必须使用@RefreshScope注释来刷新它。

在您的其他项目中,您的bean可能会被@ConfigurationProperties注释

 类似资料:
  • 我有一个客户端,它监听配置服务器。配置服务器指向github。使用localhost时一切正常。然而,当我将应用程序部署到Kubernetes时,用于刷新属性的客户端endpoint无法正常工作。 endpoint(后):http://config-client.sbx.com/actuator/refresh 这将在Postman“[]”上返回一个空响应,响应代码为200 OK。我能够看到配置服

  • 本文向大家介绍SpringCloud配置刷新原理解析,包括了SpringCloud配置刷新原理解析的使用技巧和注意事项,需要的朋友参考一下 我们知道在SpringCloud中,当配置变更时,我们通过访问http://xxxx/refresh,可以在不启动服务的情况下获取最新的配置,那么它是如何做到的呢,当我们更改数据库配置并刷新后,如何能获取最新的数据源对象呢?下面我们看SpringCloud如何

  • 本文向大家介绍SpringCloud Bus如何实现配置刷新,包括了SpringCloud Bus如何实现配置刷新的使用技巧和注意事项,需要的朋友参考一下 要想实现配置刷新,首先得有项目基础结构 项目一: 注册中心 项目二: 配置中心 项目三: 客户端 先启动注册中心 然后启动配置中心 然后在不同端口启动客户端的多个实例,这些实例都是通过bootstrap.properties连接到配置中心后,加

  • 我使用的是Spring2.0.3。配置客户端的数据库配置是通过配置服务器从git存储库中获取的。 我已经更改了数据库配置并推回到Git中。 你能帮我解决这个问题吗。

  • 我有一个SpringBoot应用程序,它使用配置服务器加载其属性。属性存在于src中。配置服务器项目的main/resources/config目录。 当我到达restfulendpoint时,属性初始加载良好,然后当我更改属性时,它仍然显示旧的属性值。如何在调用URL时调用刷新终结点?我是在配置服务还是你好服务上调用它?即使从日志看起来已经映射了它们,它仍然会抛出405错误 配置服务器 或者你好

  • 客户端配置项设置示例 lookoutConfig.setProperty(LookoutConfig.LOOKOUT_AGENT_HOST_ADDRESS,"127.0.0.1"); 客户端配置项说明 配置项 对应 SpringBoot 配置项 默认配置值 说明 lookout.enable com.alipay.sofa.lookout.enable true 功能开关,默认是 true。如