在带有嵌入式tomcat的spring boot中运行代码时,spring cloud consul可以按预期工作。
当我们在独立的tomcat上部署代码时,它不起作用。似乎有一个ConsulAutoServiceRegistrationListener
在WebServerInitializedEvent
上启动了领事服务注册。仅当我们在带有嵌入式tomcat的spring boot中运行代码时,才会触发此事件。
https://github.com/spring-cloud/spring-cloud-consul/issues/302提供了几种解决方法,但是在最新的Greenwich.RC2
版本中,它们都不再起作用。
在独立的tomcat上启动服务注册的其他方法有哪些?
如果您需要更多详细信息,请告诉我。
答案 0 :(得分:0)
我认为您可以设置spring.cloud.consul.discovery.port=${server.port}
,并且不需要setPort()
方法。
答案 1 :(得分:0)
这只是后续帖子,上面的答案仍然有效。今天,我遇到了同样的问题,我的Spring Boot应用程序在外部Tomcat服务器上运行时未向Consul注册。尽管可以根据以上帖子中提到的所有信息提出一个可行的解决方案,但我在一篇文章中提供了所有信息。
我确实不得不更改solution code中的一件事,使用了注释@AutoConfigurationAfter(...)
。我不得不将其更改为@AutoConfigureAfter(...)
根据solution code,将以下MyConsulLifecycle
添加到您的应用中:
@Configuration
@ConditionalOnConsulEnabled
@ConditionalOnMissingBean(type= "org.springframework.cloud.consul.discovery.ConsulLifecycle")
@AutoConfigureAfter(ConsulAutoServiceRegistrationAutoConfiguration.class)
public class MyConsulLifecycle implements ApplicationContextAware {
private ConsulAutoServiceRegistration registration;
public MyConsulLifecycle(ConsulAutoServiceRegistration registration) {
this.registration = registration;
}
public void setApplicationContext(ApplicationContext context) throws BeansException {
if (registration != null ) {
registration.start();
}
}
}
与Brian Peterson's解决方案相反,方法setPort()
不再可用。 Sagar Veeram在他的帖子评论中已经提到了这一点。
正如spencergibb所说,这可以通过在spring.cloud.consul.discovery.port=${server.port}
文件中设置application.properties
来解决:
server.port=8080
spring.cloud.consul.discovery.port=${server.port}
请注意,使用独立的Tomcat服务器时需要具有server.port
属性是有点奇怪。