gpt4 book ai didi

java - 启动时 Netflix Eureka 发现的 Spring Cloud Config 服务器循环依赖

转载 作者:行者123 更新时间:2023-11-29 06:51:38 25 4
gpt4 key购买 nike

我正在关注这个 tutorial但是我在确定服务的正确启动顺序以便没有错误时遇到了一些麻烦(我需要一个无错误的响应来让我的 Docker 群正确初始化)。

我启动服务的顺序是:

  1. 配置服务:8081(spring cloud)<- 尝试注册下一个
  2. discovery service : 8082 (eureka) <- 从之前获取它的配置
  3. API网关服务:8080(Zuul)
  4. 预订服务:8083(示例教程应用程序)

如果我按照所写的方式完成教程,我将无法通过步骤 3.5,因为配置服务器从未注册到发现服务。我做了一些挖掘,发现配置服务器需要用 @EnableEurekaClient 注释其主类,以便它定期 ping 发现服务以注册自己。

然后我在代码中添加了这个注解,如下所示:

@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient /* this line was missing */
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}

并将此添加到配置服务中的application.properties:

...
spring.application.name=config
# the following line was missing
spring.cloud.config.name=config
...

这样做之后,我能够重新启动配置服务器,并且一切都按预期工作,因为当我使用更新的代码重新启动配置时,它向已经在运行的发现服务注册了自己。

当我关闭所有服务,然后尝试使用我在开头列出的相同启动顺序时,我注意到配置服务器每次尝试向发现服务注册时都会抛出连接错误。这对我来说非常有意义,因为发现服务尚未运行。尽管如此,配置服务器似乎运行良好,所以当我继续执行其余服务时,应用程序运行良好,一旦发现服务存在,配置服务器就会停止抛出错误。

所以我的问题分为 3 个部分:

  1. 我的假设是否正确,即教程作者在教程中省略 @EnableEurekaClient 注释和 spring.cloud.config.name 注册时犯了错误?<
  2. 我是否应该忽略配置启动时的这个错误,因为它会在发现服务备份后自行解决并且微服务架构允许服务启动和关闭?
  3. 有没有办法打破发现服务依赖于配置服务的循环依赖,而配置服务又依赖于发现服务?我通过增加 eureka 的刷新间隔来减少配置错误的数量,这将第二个 ping 延迟到 eureka 启动之后,但我仍然在启动时遇到 1 个错误。

最佳答案

在教程中,他们已经启动了一个配置服务器,该服务器具有静态 ip/端口并且不会尝试发现。然后他们启动发现服务。这允许发现服务使用来自静态配置服务器的配置。

在该场景中,当发现服务正在运行时 - 配置服务器使用步骤 3.4 中引入的新 Eureka 配置重新启动。重新启动的配置服务器将自己注册到 Eureka(你是对的,这一步需要 @EnableEurekaClient 注释)。这允许其他服务通过其服务器 id 而不是静态 ip/端口来发现配置服务器。

在这种情况下不会有错误,因为配置服务器是作为静态服务启动的,它没有尝试最初注册发现。

您遇到的问题是,您试图在不执行创建静态配置服务器的第一步的情况下启动所有内容,因此您总是会收到带有 Eureka 错误的初始注册。

如果你绝对必须避免这种情况,那么你可以做一些事情:
您可以将配置服务器保留在静态 ip/端口上,并且不要在 eureka 上注册它。这将要求您从服务配置中删除以下内容:

spring.cloud.config.discovery.service-id=config
spring.cloud.config.discovery.enabled=true

并将它们替换为

spring.cloud.config.uri=http://static_ip:port

另一种选择是将 Eureka 保留在静态 ip/端口上,并在其自己的 application.properties(或 yml)中定义配置,并从其 pom.properties 中删除 spring config 依赖项。那么您的启动顺序将是 Eureka > 配置 > 其他服务。这将允许其他服务通过 id 识别配置服务器,eureka 将不会在外部查找配置。

另一种选择是按照教程稍作调整。在服务器配置应用程序属性中有一个名为 eureka.enabled=true 的属性

使用注解@ConditionalOnProperty(name="eureka.enabled")创建一个EurekaConfig类

@Configuration
@EnableEurekaClient
@ConditionalOnProperty(name="eureka.enabled")
public class EurekaConfig {
}

现在,当第一次启动您的应用程序时,请使用该命令。

java -jar -Deureka.enabled=false path/to/config/server.jar

然后在 eureka 启动后,配置服务器可以被杀死并再次启动

java -jar 路径/to/config/server.jar

第一个命令将在不查找 eureka 的情况下启动配置服务器,第二个命令将启动向 eureka 注册的配置服务器

关于java - 启动时 Netflix Eureka 发现的 Spring Cloud Config 服务器循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46311405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com