启动时使用Netflix Eureka Discovery的Spring Cloud Config Server循环依赖

时间:2017-09-20 00:09:59

标签: java spring-boot spring-cloud-netflix spring-cloud-config

我跟随此tutorial,但我在查找服务的正确启动顺序方面遇到了一些麻烦,以便不会出现错误(我需要为Docker swarm提供无错误的响应)正确初始化。)

我启动服务的顺序是:

  1. 配置服务:8081(春天云)< - 尝试注册下一个
  2. 发现服务:8082(eureka)< - 从之前的
  3. 获得它的配置
  4. API网关服务:8080(Zuul)
  5. 图书服务:8083(示例教程应用程序)
  6. 如果我按照书面说明完成教程,我就无法通过 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错误。

2 个答案:

答案 0 :(得分:3)

在本教程中,他们已经启动了一个存在静态ip / port的配置服务器,并且不会尝试查找发现。 然后他们启动发现服务。这允许发现服务使用静态配置服务器中的配置。

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

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

您遇到的问题是,您尝试启动所有操作,而无需完成创建静态配置服务器的第一步,因此您将始终使用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 / port上,并在其自己的application.properties(或yml)中定义配置,并从其pom中删除spring config依赖项。然后你的开始订单将是Eureka> config>其他服务。这将允许其他服务通过id识别配置服务器,eureka将不会在外部查找配置。

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

的属性

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

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

现在首次启动应用程序时,请使用命令。

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

然后在eureka启动后,可以使用

终止配置服务器并再次启动

java -jar path / to / config / server.jar

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

答案 1 :(得分:3)

如果使用@ConditionalOnProperty注释不起作用,可以尝试另一种类似的方式(我使用的是Spring Boot 2.0.1):

您可以通过在spring.cloud.service-registry.auto-registration.enabled中将属性false设置为application.properties来禁用发现客户端自动注册,以便配置服务器无需在注册时尽快注册到Eureka起来。您以这种方式运行.jar文件(指定属性是可选的,因为您已经在属性文件中执行了该操作):

  

java -jar -Dspring.cloud.service-registry.auto-registration.enabled = false config-server.jar

现在启动Eureka服务器,以便获取配置。完成后,终止配置服务器并重新运行它:

  

java -jar -Dspring.cloud.service-registry.auto-registration.enabled = true config-server.jar

这次,配置服务器将自动在Eureka注册。