为什么 spring 云领事不适用于独立 tomcat?

Why spring cloud consul doesn't work with standalone tomcat?

Spring 当 运行 代码在带有嵌入式 tomcat 的 spring 引导中时,云领事按预期工作。

当我们在独立 tomcat.It 上部署代码时它不起作用似乎有一个 ConsulAutoServiceRegistrationListenerWebServerInitializedEvent 上启动 consul 服务注册。此事件仅在我们 运行 在 spring 引导内嵌入 tomcat 代码时触发。

https://github.com/spring-cloud/spring-cloud-consul/issues/302 中提供了一些解决方法,但其中 none 在最新的 Greenwich.RC2 版本中不再有效。

我们可以通过哪些其他方式在独立 tomcat 上启动服务注册?

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

我认为你可以设置 spring.cloud.consul.discovery.port=${server.port} 而不需要 setPort() 方法。

这只是一个跟进post,上面的答案仍然有效。今天我遇到了同样的问题,我的 Spring Boot 应用程序没有在 运行 外部 Tomcat 服务器上注册到 Consul。尽管可以根据上面 post 中提到的所有信息提出一个可行的解决方案,但我已在此处提供了所有信息,在一个 post.

我确实必须更改 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();
        }
    }
}

与他的 post 评论中的 Brian Peterson's solution, the method setPort() is no longer available. This was already mentioned by Sagar Veeram 相反。

正如spencergibb所说,这可以通过在application.properties文件中设置spring.cloud.consul.discovery.port=${server.port}来解决:

server.port=8080
spring.cloud.consul.discovery.port=${server.port}

请注意,使用独立 Tomcat 服务器时需要 server.port 属性 有点奇怪。