Динамическое имя хоста в @AuthorizedFeignClient

В системе микросервисов у меня есть интерфейс с аннотацией @AuthorizedFeignClient(name="send-email", url="http://localhost:8080/utils/api/email"), в среде разработки он работает правильно, однако в среде Docker мне нужен параметр url, чтобы вместо имени контейнера Docker было localhost для работы в среде Docker.

Я попытался добавить в application-prod.yml конфигурацию:

containers-host:
    gateway: jhipster-gateway

А в аннотации я поставил так:

     @AuthorizedFeignClient(name="send-email", url="http://${containers-host.gateway}:8080/utils/api/email")

Однако при попытке сгенерировать .war он терпит неудачу:

org.springframework.beans.factory.BeanDefinitionStoreException: недопустимое определение bean-компонента с именем 'com.sistema.service.util.EmailClient', определенным в null: не удалось разрешить заполнитель 'container-host.gateway' в значении "http: // $ { контейнеры-host.gateway}: 8080 / utils / api / email "; вложенное исключение - java.lang.IllegalArgumentException: не удалось разрешить заполнитель 'container-host.gateway' в значении "http: // $ {container-host.gateway}: 8080 / utils / api / email" 2018-11-08 11 : 25: 22.101 ОШИБКА 64 --- [основная] osboot.SpringApplication: Не удалось запустить приложение

org.springframework.beans.factory.BeanDefinitionStoreException: недопустимое определение bean-компонента с именем 'com.sistema.service.util.EmailClient', определенным в null: не удалось разрешить заполнитель 'container-host.gateway' в значении "http: // $ { контейнеры-host.gateway}: 8080 / utils / api / email "; вложенное исключение - java.lang.IllegalArgumentException: не удалось разрешить заполнитель 'container-host.gateway' в значении "http: // $ {container-host.gateway}: 8080 / utils / api / email"

Как я могу установить имя хоста службы в соответствии с конфигурацией среды, в которой она работает?

Мой код, который терпит неудачу, выглядит так:

@AuthorizedFeignClient(name="send-email", url="http://${containers-host.gateway}:8080/utils/api/email")
public interface EmailClient {

    @PostMapping("/send-email")
    void sendEmail(String mail);
}

person user2831852    schedule 08.11.2018    source источник
comment
вы пробовали использовать имя службы?   -  person malyy    schedule 08.11.2018
comment
Это не может быть имя службы, это должен быть адрес шлюза, поэтому в среде разработки используется localhost, а в Docker используется имя контейнера, поскольку это HTTP-запрос, поэтому я хочу увидеть более динамичный способ установки хоста в аннотации.   -  person user2831852    schedule 08.11.2018
comment
Как и @malyy, я также думаю, что вы должны использовать имя службы в URL-адресе, без имени хоста или порта, поэтому у нас есть реестр служб, который используется имитирующим клиентом. Не могли бы вы объяснить, почему это должен быть адрес шлюза?   -  person Gaël Marziou    schedule 08.11.2018
comment
Я имел в виду - имя сервиса из файла docker-compose.   -  person malyy    schedule 09.11.2018
comment
Если я укажу имя службы докеров, она будет работать только в докере, а не в среде разработки (на компьютерах разработчиков нет докеров), поэтому я хочу увидеть, имеет ли она динамическую форму, которая соответствует среде приложения. .   -  person user2831852    schedule 09.11.2018


Ответы (1)


Чтобы установить значение, введенное в application-dev.yml или application-prod.yml, необходимо создать класс конфигурации с аннотацией @ConfigurationProperties.

В файле .yml:

microservices:
    gateway: http://environment-host:8080

Создайте файл конфигурации следующим образом:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;


@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "microservices", ignoreUnknownFields = false)
public class MicroservicesConectionProperties {

    private String gateway = "";

    public String getGateway() {
        return gateway;
    }

    public void setGateway(String gateway) {
        this.gateway = gateway;
    } 
}

И сделайте @AuthorizedFeignClient следующим образом:

@AuthorizedFeignClient(name="send-email", url="${microservices.gateway}/utils/api/email")
person user2831852    schedule 14.11.2018