Как я могу изменить фиктивный URL-адрес клиента в соответствии с файлом свойств? - PullRequest
2 голосов
/ 06 августа 2020

У меня есть клиент Feign, который отправляет запрос по заданному URL-адресу

@FeignClient(
        name = "feign-client-name",
        url = "${feign.client.url}",
        configuration = FeignClientConfiguration.class)
public interface SomeFeignClient {

    @GetMapping(SOME_GEP_MAPPING_PATH)
    Entity getEntity(String id);
}
feign:
  client:
    url: https://url-to-service.com
    token: secret_token
    internal-url: https://url-to-internal-service.com
    internal: on
   
@RequiredArgsConstructor
public class FeignClientConfiguration {

    private final FeignProperties properties;

    @Bean
    public RequestInterceptor requestInterceptor() {
        return template -> {
            template.header(HttpHeaders.AUTHORIZATION, "Token " + properties.getToken());
            template.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
            template.header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
        };
    }
}

Как я могу изменить URL-адрес для имитации клиента, зависящего от свойства internal?
Я хочу он работает следующим образом: если свойство internal имеет значение on имитировать, что клиент должен использовать internal-url значение и url значение в другом случае

UPD:
Возможное решение - использовать профили Spring .

Ответы [ 2 ]

0 голосов
/ 14 августа 2020

Я нашел решение без профилей Spring.
Основная идея этой души - использовать аннотацию @ConditionalOnProperty, которая предотвращает создание bean-компонентов в зависимости от конкретного свойства. В этом случае

Во-первых, нам нужно создать новый интерфейс с именем, например, SomeFeignClient

public interface SomeFeignClient {
   Entity getEntity(String id);
}

Во-вторых, создать 2 клиента Feign, которые расширят наш интерфейс и пометят их с помощью @ConditionalOnProperty аннотации

@ConditionalOnProperty(prefix="feign.client", name="internal", havingValue="true")
@FeignClient(...your configurations here...)
public interface SomeFeignClientFirst extends SomeFeignClient {
   @Override
   Entity getEntity(String id);
}

@ConditionalOnProperty(prefix="feign.client", name="internal", havingValue="false")
@FeignClient(...your configurations here...)
public interface SomeFeignClientSecond extends SomeFeignClient {
   @Override
   Entity getEntity(String id);
}

Если вы хотите добавить перехватчик запросов для некоторых из этих фальшивых клиентов, не забудьте пометить их, используя @ConditionalOnBean аннотацию

@RequiredArgsConstructor
public class FeignClientConfiguration {

    private final FeignProperties properties;
    
    @ConditionalOnBean(SomeFeignClientFirst.class)
    @Bean
    public RequestInterceptor requestInterceptor() {
       return template -> {
           template.header(HttpHeaders.AUTHORIZATION, "Token " + properties.getToken());
           template.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
           template.header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
       };
}
0 голосов
/ 06 августа 2020
  1. Для всех видов свойств, связанных с окружающей средой, используйте профили Spring. Как и для DEV env, у вас будут свойства dev Speci c, аналогично для prod env, test env et c. Дополнительная информация: Использование профилей Spring

  2. Когда вы используете Feign Client и у вас есть сервер Eureka, попробуйте выполнить обнаружение сервиса через Eureka. Передайте имя службы только для Feign Client, которого вы ищете. Если ваш микросервис зарегистрирован в Eureka, он найдет оттуда, что нет необходимости в жестко заданных URL-адресах. Spring Cloud интегрирует Ribbon и Eureka для предоставления HTTP-клиента с балансировкой нагрузки при использовании Feign. Больше информации: Spring-Cloud-OpenFeign

...