0

我到处阅读@RefreshScope,了解与 RabbitMQ 和 Kafka 一起使用的云总线应用程序。但就我而言,我使用的是 AWS Parameter store。我希望自动刷新所有客户端实例,而无需在 AWS 控制台上重建服务器。

我从 Paramstore 创建了 AWS Eventbridge 以通知 Kinesis Stream,但我无法弄清楚它如何通知我的所有客户端节点,而不是将负载均衡器刷新到仅一个节点(实例)。

感谢您提前回复。

4

2 回答 2

1

但是,我从未使用过 AWS Eventbridge / Kinesis:

@RefreshScope是属于spring cloud而不是AWS的东西。

更准确地说,当 Spring Boot 云配置服务中的配置更改时,使用此范围定义的 bean 将由 Spring 重新加载,而不会“动态”重新加载整个应用程序上下文。通常这意味着您不必重新启动应用程序。

refresh现在,应该使用公开端点的执行器部署 Spring Boot 微服务。手动调用此端点将导致所有@RefreshScopebean 重新加载。

这里是源代码RefreshEndpoint


@Endpoint(id = "refresh")
public class RefreshEndpoint {

    private ContextRefresher contextRefresher;

    public RefreshEndpoint(ContextRefresher contextRefresher) {
        this.contextRefresher = contextRefresher;
    }

    @WriteOperation
    public Collection<String> refresh() {
        Set<String> keys = this.contextRefresher.refresh();
        return keys;
    }

}

如您所见,它只是调用contextRefresher.refresh()ContextRefresher是一个 bean,您可以将其注入自定义代码中,该代码将侦听来自 AWS Parameter store 的更改(它应该以某种方式直接调用它,或者可能发送一些您可以使用的消息或其他东西)。

如果您使用的是 spring-cloud-bus (免责声明,我从未使用过它)它bus-refresh也会暴露端点(与我所描述的机制非常相似),请阅读spring-cloud-bus 文档以获取更多详细信息。

于 2021-03-17T05:48:49.620 回答
1

感谢团队分享信息。

这是我为使其工作所做的工作。将这两个库添加到我的项目中

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-stream-binder-kinesis</artifactId>
        <version>1.1.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-bus</artifactId>
    </dependency>

并将这两个条目添加到 bootstrap.properties

cloud.aws.region.static=us-east-1
cloud.aws.stack.auto = false

并使用此端点刷新 (/bus-refresh)

于 2021-03-19T14:13:22.093 回答