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
发生变化的其他加薪条件?
一些需要思考的事情。
在一个项目中,我有一个 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
发生变化的其他加薪条件?
一些需要思考的事情。