为什么Spring Cloud Consul无法与独立的tomcat一起使用?

时间:2019-01-11 14:31:42

标签: java spring spring-boot spring-cloud spring-cloud-consul

在带有嵌入式tomcat的spring boot中运行代码时,spring cloud consul可以按预期工作。

当我们在独立的tomcat上部署代码时,它不起作用。似乎有一个ConsulAutoServiceRegistrationListenerWebServerInitializedEvent上启动了领事服务注册。仅当我们在带有嵌入式tomcat的spring boot中运行代码时,才会触发此事件。

https://github.com/spring-cloud/spring-cloud-consul/issues/302提供了几种解决方法,但是在最新的Greenwich.RC2版本中,它们都不再起作用。

在独立的tomcat上启动服务注册的其他方法有哪些?

如果您需要更多详细信息,请告诉我。

2 个答案:

答案 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属性是有点奇怪。