Есть ли символический элемент для ссылки на сервер конфигурации 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