Есть ли символический элемент для ссылки на сервер конфигурации Spring-Cloud?

Проект, над которым я работаю, использует сервер Spring Cloud Config для обработки обновления / обновления свойств.

Один вопрос, который неоднократно возникал, - как ссылаться на простой текст с сервера конфигурации.

Я знаю, что сервер поддерживает подачу простого текста. Я пытаюсь понять, что если у меня есть ссылка /foo/default/master/logj42.xml.

Как бы я сослался на это "агностически" так, что если бы я поставил:

{configserver}/foo/default/master/log4j2.xml in the config file

Ссылка {configserver} будет расширена.

Кроме того, при использовании "обнаружения", если я вставляю ссылку на "ресурс", как описано выше, механизм по умолчанию будет пытаться использовать java.net.URLConnection для загрузки содержимого. Я не думаю, что это разрешит хост 'discovery'.

Заранее спасибо.

2 ответа

Решение

Я нашел способ сделать это, который является минимально инвазивным, но "пробивает завесу" того места, где фактически находится сервер конфигурации.

На основной класс приложения, аннотация @EnableDiscoveryClient должен быть добавлен.

Я создал аспект для добавления источника свойства с ключом, который указывает фактический URI сервера, обрабатывающего запрос:

@Component
@Aspect
public class ResolverAspect {
    @Autowired
    private DiscoveryClient discoveryClient;

    @Pointcut("execution(org.springframework.cloud.config.environment.Environment org.springframework.cloud.config.server.environment.EnvironmentController.*(..))
    private void environmentControllerResolve();

    @Around("environmentControllerResolve()")
    public Object environmentControllerResolveServer(final ProceedingJoinPoint pjp) throws Throwable {
        final Environment pjpReturn = (Environment)pjp.proceed();
        final ServiceInstance localSErviceInstance = discoveryClient.getLocalServiceInstance();
        final PropertySource instancePropertySource =
            new PropertySource("cloud-instance", Collections.singletonMap("configserver.instance.uri", localServiceInstance.getUri().toString()));
        pjpReturn.addFirst(instancePropertySource);
        return pjpReturn;
    }
}

Делая это, я выставляю ключ configserver.instance.uri на который затем можно ссылаться из значения свойства и интерполировать / разрешать на клиенте.

Это имеет некоторые последствия в отношении предоставления фактического сервера конфигурации, но для разрешения ресурсов, которые не обязательно используют клиент обнаружения, это можно использовать.

Это также может быть решено с помощью настройки конфигурации начальной загрузки без аспектов путем создания источника настраиваемого свойства и установки URI-адреса configserver после определения местоположения из обнаружения. У меня была похожая проблема, больше подробностей в этом сообщении stackru

Другие вопросы по тегам