6

我正在编写Spring Boot应用程序,它使用Spring 配置,部署在关键的 Cloud Foundry上,并由Netflix Eureka作为发现服务/负载均衡器公开。

我创建了一个bean,如下所示:

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

/refresh在更改配置库中的实际属性后调用 Eureka 暴露的应用程序路由时,@refreshScope注释的值发生了更改(以响应状态结束的字段存在),这意味着它工作正常。

当在云上运行同一应用程序的多个实例并调用/refresh.
Beeing 使用的路由是 Eureka 公开的路由,它使用它的负载均衡器将调用路由到可用实例之一。

它会导致意想不到的结果,即并非所有实例都使用属性的最新更改进行更新。

有什么建议如何将更改应用于所有实例?

4

1 回答 1

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 配置。

祝你好运。

于 2017-12-26T14:18:08.570 回答