在使用 @refreshScope 注释的多个实例上应用 /refresh
Apply /refresh on multiple instances annotated with @refreshScope
我正在编写 spring boot 应用程序,它使用 spring 配置 ,部署在 pivotal cloud foundry 并由 Netflix Eureka 作为发现服务/负载平衡器公开。
我创建了一个 bean,如下所示:
@Component
@ConfigurationProperties("config")
@RefreshScope
@Data
public class GeneralProperties {
private boolean ignoreEvent;
}
在配置库中更改实际属性后调用Eureka用/refresh
暴露的应用程序路由时,由@refreshScope[=32=注释的值] 已更改(以字段存在的响应状态结束),这意味着它工作正常。
当 运行 云上同一应用程序的多个实例并调用 /refresh
时问题开始。
beeing 使用的路由是 Eureka 公开的路由,它使用它的负载均衡器将调用路由到可用实例之一。
这会导致意外结果,即并非所有实例都使用 属性 中的最新更改进行更新。
对如何在所有实例上应用更改有什么建议吗?
在这种情况下,您应该使用 Spring Cloud Bus。
该框架背后的想法是将所有应用程序实例绑定到消息代理(RabbitMQ 或 Apache Kafka)中的主题。
将以下依赖项添加到您的pom.xml:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus-parent</artifactId>
<version>1.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
</dependencies>
在上面的示例中,我添加了对 amqp 的依赖,即 RabbitMQ。您还需要将您的应用程序绑定到 RabbitMQ,在 PCF 中这很容易,因为它内置于平台中。
需要刷新时调用:
POST /bus/refresh
这会触发一个主题的事件,您的应用程序的所有实例都在监听,结果 - 所有实例都会刷新它们的 bean 配置。
祝你好运。
我正在编写 spring boot 应用程序,它使用 spring 配置 ,部署在 pivotal cloud foundry 并由 Netflix Eureka 作为发现服务/负载平衡器公开。
我创建了一个 bean,如下所示:
@Component
@ConfigurationProperties("config")
@RefreshScope
@Data
public class GeneralProperties {
private boolean ignoreEvent;
}
在配置库中更改实际属性后调用Eureka用/refresh
暴露的应用程序路由时,由@refreshScope[=32=注释的值] 已更改(以字段存在的响应状态结束),这意味着它工作正常。
当 运行 云上同一应用程序的多个实例并调用 /refresh
时问题开始。
beeing 使用的路由是 Eureka 公开的路由,它使用它的负载均衡器将调用路由到可用实例之一。
这会导致意外结果,即并非所有实例都使用 属性 中的最新更改进行更新。
对如何在所有实例上应用更改有什么建议吗?
在这种情况下,您应该使用 Spring Cloud Bus。 该框架背后的想法是将所有应用程序实例绑定到消息代理(RabbitMQ 或 Apache Kafka)中的主题。
将以下依赖项添加到您的pom.xml:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus-parent</artifactId>
<version>1.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
</dependencies>
在上面的示例中,我添加了对 amqp 的依赖,即 RabbitMQ。您还需要将您的应用程序绑定到 RabbitMQ,在 PCF 中这很容易,因为它内置于平台中。
需要刷新时调用:
POST /bus/refresh
这会触发一个主题的事件,您的应用程序的所有实例都在监听,结果 - 所有实例都会刷新它们的 bean 配置。
祝你好运。