上下文重新加载
上下文重新加载
Camel 的上下文重新加载功能能够在外部触发事件时,重新加载所有现存的路由和属性占位符。
例如,如果你正在使用 AWS Secrets,那么启用 context-reload 后,当 AWS 中的密钥被更新时,Camel 路由就会重新加载。
上下文重新加载会在重新加载时刷新以下内容:
- 属性占位符
- 配置值为属性占位符的组件选项(需要 Camel Main、Camel Spring Boot 或 Camel Quarkus)
- 所有实现了
SecretRotationAware接口的 bean,以便它们能够就地重新进行身份验证(见下文) - 所有现存的路由(路由结构不会改变;参见路由重新加载)
CamelContext 中的其他常规服务、Java bean 以及 Camel Processor 不会被更新。
重新应用组件选项,正是轮换后的密钥能够传递到组件的原因,因为像下面这样的选项只会在配置组件时解析一次占位符:
camel.component.kafka.saslJaasConfig = {{aws:broker-credentials}}只有值为占位符的选项会被重新应用,因为只有这些选项的解析值可能在配置本身保持不变的情况下发生变化。
使用上下文重新加载
上下文重新加载可以通过 Java 进行配置,也可以按照以下方式使用 Spring Boot、Quarkus 进行配置:
CamelContext context = ...
ContextReloadStrategy reload = new DefaultContextReloadStrategy();
context.addService(reload);而在 Camel Quarkus / Camel Main / Camel Spring Boot 中,你可以在 application.properties: 中进行配置:
# turn on context reloading
camel.main.context-reload-enabled = true触发上下文重新加载
任何自定义代码都可以触发上下文重新加载。具体做法是确保上下文重新加载已启用(见上文说明),然后在 Java 中按如下方式获取 ContextReloadStrategy:
ContextReloadStrategy reload = context.hasService(ContextReloadStrategy.class);
if (reload != null) {
// trigger reload
reload.onReload(this);
}随后 onReload 方法会重新加载所有属性占位符,重新应用通过占位符配置的组件选项,通知所有 SecretRotationAware Bean,然后再重新加载所有现有的路由。
对轮换后的密钥重新认证
重新加载路由会重建路由及其端点,但不会重建组件本身,也不会重建注册表中的任何 Bean。因此,持有已认证的活动资源(例如池化的 JMS 连接工厂、JDBC 连接池或共享的 HTTP 客户端)的组件,即使密钥已经轮换,仍会继续使用其创建时获取的凭据。
这类组件或 Bean 可以实现 org.apache.camel.spi.SecretRotationAware,以便在发生这种情况时得到通知:
public class MyComponent extends DefaultComponent implements SecretRotationAware {
@Override
public void onSecretRotation(Object source) throws Exception {
// re-read the configured credentials and re-authenticate the connection
// that was created with the secret that has just been rotated
}
}该回调在属性占位符重新加载、组件选项重新应用之后被调用,但在路由重启之前触发,因此当路由恢复运行时,底层资源已经使用新密钥完成了认证。
该回调仅起提示作用:它只表示触发了一次重新加载,并不指明哪些密钥发生了变化。由于回调是在重新加载过程中内联执行的,其实现应当保持快速。若回调抛出异常,只会被记录并忽略,这样单个组件既不会阻止其他组件的刷新,也不会导致整个重新加载失败。
另请参阅
参见相关的路由重新加载。
评论
登录后参与评论
KnowForge