在使用@refreshScope注释的多个实例上应用/刷新

时间:2017-12-25 10:47:51

标签: java spring-boot netflix-eureka pivotal-cloud-foundry spring-config

我正在编写 spring boot 应用程序,该应用程序使用弹簧配置,部署在关键云代工厂上,并由 Netflix Eureka公开作为发现服务/负载均衡器。

我创建了一个bean:

@Component
@ConfigurationProperties("config")
@RefreshScope
@Data
public class GeneralProperties {
    private boolean ignoreEvent;
}

在更改配置库中的实际属性后调用Eureka用/refresh公开的应用程序路由时, @refreshScope 注释的值已更改(在响应状态中结束)现场存在),这意味着它正常工作。

当在云上运行同一应用程序的多个实例并呼叫/refresh时,问题就开始了 使用的路由是Eureka公开的路由,它使用负载均衡器将呼叫路由到其中一个可用实例。

这会导致意外的结果,并非所有实例都会根据属性的最新更改进行更新。

有关如何在所有实例上应用更改的任何建议吗?

1 个答案:

答案 0 :(得分:2)

在这种情况下,您应该使用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配置。

祝你好运。