我跟随此tutorial,但我在查找服务的正确启动顺序方面遇到了一些麻烦,以便不会出现错误(我需要为Docker swarm提供无错误的响应)正确初始化。)
我启动服务的顺序是:
如果我按照书面说明完成教程,我就无法通过 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部分:
答案 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注册。