Почему Spring Cloud Consul не работает с автономным котом?

Консул Spring Cloud работает должным образом при запуске кода внутри весенней загрузки со встроенным tomcat.

Это не работает, когда мы развертываем код на автономном коте. Похоже, есть ConsulAutoServiceRegistrationListener, который запускает регистрацию службы консула на WebServerInitializedEvent. Это событие запускается только тогда, когда мы запускаем код внутри весенней загрузки со встроенным tomcat.

На https://github.com/spring-cloud/spring-cloud-consul/issues/302, но ни один из них больше не работает с последней версией Greenwich.RC2.

Какими еще способами мы можем запустить регистрацию службы на автономном коте?

Дайте мне знать, если вам нужна дополнительная информация.


person s7vr    schedule 11.01.2019    source источник
comment
Когда я говорю название, я собирался искать проблему, которую вы упомянули. Что происходит с Greenwich.RC2?   -  person spencergibb    schedule 11.01.2019
comment
@spencergibb Спасибо за ответ. например, в Greenwich.RC2 больше нет метода setPort в ConsulAutoServiceRegistration, который мы использовали для установки порта, как указано в решении здесь github.com/spring-cloud/spring-cloud-consul/issues/. Он был заменен на setPortIfNeeded, но он защищен пакетом. Дайте мне знать, если вам нужна дополнительная информация.   -  person s7vr    schedule 11.01.2019
comment
Также в качестве побочного вопроса, в чем причина инициализации автоматической регистрации консула при весенней загрузке WebServerInitializedEvent вместо весеннего события ContextRefreshedEvent.   -  person s7vr    schedule 11.01.2019
comment
порт недоступен до WebServerInitializedEvent при использовании случайного порта.   -  person spencergibb    schedule 12.01.2019
comment
Я думаю, вы можете установить spring.cloud.consul.discovery.port=${server.port} и не нуждаться в методе setPort().   -  person spencergibb    schedule 12.01.2019
comment
Спасибо. Это сработало. Пожалуйста, не стесняйтесь добавлять в качестве ответа.   -  person s7vr    schedule 12.01.2019


Ответы (2)


Я думаю, вы можете установить spring.cloud.consul.discovery.port=${server.port} и не нуждаться в методе setPort().

person spencergibb    schedule 12.01.2019

Это всего лишь последующий пост, ответ выше все еще в силе. Сегодня у меня была та же проблема: мое приложение Spring Boot не зарегистрировалось в Consul во время работы на внешнем сервере Tomcat. Хотя можно найти рабочее решение на основе всей информации, упомянутой в постах выше, я предоставил всю информацию здесь, в одном посте.

Мне пришлось изменить одну вещь в коде решения использовалась аннотация @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();
        }
    }
}

В отличие от решения Брайана Петерсона, метод setPort() больше недоступен. Об этом уже упоминал Сагар Вирам в комментариях к своему сообщению.

Как сказал spencergibb, это решается установкой spring.cloud.consul.discovery.port=${server.port} в файле application.properties:

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

Обратите внимание, что наличие свойства server.port при использовании автономного сервера Tomcat является немного странным.

person bravdwal    schedule 15.07.2020