Spring 属性热重载

Spring properties hot reloading

在一个项目中,我有一个 org.apache.commons.configuration.PropertiesConfiguration 对象注册为 Bean,以提供围绕应用程序的配置值,具有热重载功能。

例子:我定义了一个DataSource单例Bean。然后我创建了一个 ReloadingDataSource 对象,它包装并委托给 "real" DataSource,每次配置文件更改时,它都能够以线程安全的方式重新创建它。

我想为简单的属性值做类似的事情。
我想创建一个简单的 Autowire 可用对象,将检索委托给 Apache PropertiesConfiguration Bean。

用法应类似于:

@Property("my.config.database")
private Property<String> database;

呼叫站点将是:

final String databaseValue = database.get()

你会说,只是传递 PropertiesConfiguration 对象。也许你是对的,但我想提供另一种抽象,一种更易于使用的抽象。

我知道使用 ProxyFactoryBean 可以为方法调用创建 AOP 代理。这是正确的道路,还是有更好的选择?也许纯SpringAOP/AspectJ?

我不想使用 Spring 云或类似的依赖项。

Spring Cloud 将重新创建 bean,因此请记住您提出的任何解决方案,如果您有另一个 bean,例如在启动时仅读取一次该值,则它不会重新创建- 自行初始化,这就是问题 Spring Cloud Config 会处理的问题。

据我了解,AOP 仅在方法级别起作用,因此您绝对可以拦截对 somebean.getFoo() 的调用。但在 somebean 内,无法代理对变量本身的调用:somebean.foo。每次 PropertiesConfiguration 更改时,您都必须重置 foo,并再次记住,如果有任何其他需要 foo 的新值,您将需要处理这个或硬着头皮使用 Spring 云。

在 运行 时更改内容以避免重新部署的开销确实应该仔细考虑。对于 Netflix 来说,这是有道理的,因为他们拥有成千上万台服务器。但对于较小的玩家,我看不出有什么理由,这个决定增加了很多复杂性。噩梦测试。

  • 您是在 运行 时测试更改您的配置还是接受风险并假设它有效?
  • 您是否在用户对数据库执行事务的负载下测试从 A -> B 的更改?
  • 测试 foo 发生变化的其他加薪条件?

一些需要思考的事情。