2

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

当我们在独立的 tomcat 上部署代码时它不起作用。似乎有一个ConsulAutoServiceRegistrationListenerWebServerInitializedEvent. 只有当我们在带有嵌入式 tomcat 的 spring boot 中运行代码时才会触发此事件。

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

我们可以在独立的 tomcat 上启动服务注册的其他方法是什么?

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

4

2 回答 2

1

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

于 2019-01-12T03:03:58.343 回答
0

这只是一个后续帖子,上面的答案仍然有效。今天我遇到了同样的问题,我的 Spring Boot 应用程序在外部 Tomcat 服务器上运行时没有将自己注册到 Consul。尽管可以根据上述帖子中提到的所有信息提出一个可行的解决方案,但我在一篇帖子中提供了所有信息。

我确实必须在解决方案代码中更改一件事,即使用了注释@AutoConfigurationAfter(...)。我不得不把它改成@AutoConfigureAfter(...)


解决方案

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 的解决方案相反,该方法setPort()不再可用。Sagar Veeram在他的帖子的评论中已经提到了这一点。

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

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

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

于 2020-07-15T11:55:48.533 回答