0

背景:我需要提供一种在生产过程中以尽可能低的性能成本更改参数值的方法。

目标:我想即时更改注释值并将其立即应用于所有微服务实例。

个人背景和限制:我知道我可以使用 Spring Cloud Config 来动态更改参数,就像本文中解释的那样 ,我知道动态更改注释涉及一些挑战和陷阱,就像在stackoveflow 问题中讨论的那样。

我知道 Spring Cloud Config 可用于在启动/启动期间设置应用于所有微服务实例的集中配置。我用过一点。我想知道是否可以使用它来集中可能影响自定义注释的参数。

一个想象的解决方案是:

... 每当我需要 somepPropertyValue

@Value("${config.somePropertyValue}")
private String somePropertyValue;

@Bean
public String somePropertyValue(){
    return somePropertyValue;
}

所有微服务端点中的配置客户端,不仅在应用程序启动时而且在 Spring Cloud Config Server bootstrap.properties 中管理的 somePropertyValue 更新时都必须调用:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class SpringConfigClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringConfigClientApplication.class, args);
    }
}

@RefreshScope
@RestController
class MessageRestController {

    @Value("${server.somePropertyValue:Unable to connect to config server}")
    private String somePropertyValue;

    @RequestMapping("/server/somePropertyValue")
    String getSomePropertyValue() {
        return this.somePropertyValue;
    }
}
 

并且以某种方式在 Spring Cloud Config 中维护了 somePropertyValue,如果在生产期间发生更改,它会影响所有微服务实例中对 somePropertyValue 进行注释的任何地方的需求。

我目前正在通过在所有侦听/观察主题的 SpringBoot 微服务中添加一个 kafka 消费者来实现这种行为,并且当它接收到新消息时,它会即时更改参数值。我在所有公司微服务中创建了一个 Kafka 依赖项,这似乎很奇怪。由于我在类似的场景中使用了 Spring Config,我想知道是否有更好的选择使用一些开箱即用的 Spring 方法。在我的情况下,性能也非常重要,同步所有参数的一点延迟不是问题。延迟是指在所有微服务中更新参数的两三秒不是问题。

4

1 回答 1

2

有两种方法可以做到这一点:

i-有一个刷新端点,您实际上可以为服务调用它,它实际上会在不重新启动自身的情况下刷新其配置,这非常简洁。例如,MS-A正在列出,8080然后POST在此端点发出请求: localhost:8080/refresh

注意: 我们在 MS-A 中使用@RefreshScope.

ii-您还可以做的是使用Spring Cloud Bus并广播一个事件,然后每个服务都会监听它并自行刷新。如果您有数十个服务都使用Config Server/refresh ,并且您不想像我们在第一种方法中所做的那样逐个访问端点,那将非常方便。您只想向公共汽车广播一条消息,并让所有这些东西自动接收。

参考:我在Pluralsight 上课时学到的两个概念

于 2020-07-16T06:50:56.753 回答