Spring Cloud Kubernetes получает URL с пользовательским spring.servlet.context-path - PullRequest
1 голос
/ 18 марта 2020

В настоящее время мы используем Spring Boot Admin для мониторинга наших микросервисов в кластере OpenShift.
Приложение Spring Boot Admin получает информацию об услугах из OpenShift Service Discovery, используя spring-cloud-starter-kubernetes зависимость ,

Все было хорошо, пока мы не развернули приложение с пользовательским server.servlet.context-path .

Например, наш микросервис имеет server.servlet.context- путь = / словарь . Однако Spring Boot Admin получает следующую информацию из открытия OpenShift:

{
    "registration": {
        "name": "dictionary-service",
        "managementUrl": "http://10.130.1.169:8080/actuator",
        "healthUrl": "http://10.130.1.169:8080/actuator/health",
        "serviceUrl": "http://10.130.1.169:8080/",
        "source": "discovery",
        "metadata": {
            "app": "dictionary-service",
            ...
        }
    }
}

Итак, Spring Boot Admin ожидает, что привод работает на "http://10.130.1.169:8080/actuator", но на самом деле он работает на "http://10.130.1.169:8080/dictionary/actuator"

Как мы можем настроить managementUrl и healthUrl , чтобы наш сервер Spring Boot Admin мог использовать правильный URL-адрес для мониторинга этой службы?

1 Ответ

1 голос
/ 19 марта 2020

ОК, так что я наконец-то решил это. Может быть, это будет полезно для кого-то.

"регистрация" объект из вопроса генерируется в самом Spring Boot Admin. Это надежность интерфейса ServiceInstanceConverter . По умолчанию используется реализация DefaultServiceInstanceConverter (подробнее об этом можно прочитать здесь ).

Существует несколько ключей метаданных, которые можно использовать для изменения managementUrl и healthUrl (по умолчанию используются "/ привод" и "/ привод / здоровье" соответственно).

Сначала я подумал, что мы можем использовать ключ метаданных * management.context-path для добавления нашего server.servlet.context-path , но, к сожалению, вы не можете используйте символ «/» в значении метаданных («словарь / привод» недопустим), поэтому в моем случае этого было недостаточно.

Вместо этого мы решили расширить DefaultServiceInstanceConverter и переопределить convert и getManagementPath методы:

@Component
public class OpenShiftServiceInstanceConverter extends DefaultServiceInstanceConverter {

    private static final String MANAGEMENT_CONTEXT_PATH = "/actuator";
    private static final String MANAGEMENT_PREFIX = "management.prefix";

    @Override
    public Registration convert(ServiceInstance instance) {
        return Registration.create(instance.getServiceId(), getHealthUrl(instance).toString())
                .managementUrl(getManagementUrl(instance).toString()).serviceUrl(getServiceUrl(instance).toString())
                .metadata(getMetadata(instance)).build();
    }

    @Override
    protected String getManagementPath(ServiceInstance instance) {
        String managementPath = instance.getMetadata().get(MANAGEMENT_PREFIX);
        if (!isEmpty(managementPath)) {
            return managementPath + MANAGEMENT_CONTEXT_PATH;
        }
        return MANAGEMENT_CONTEXT_PATH;
    }
}

Таким образом, мы можем просто включить server.servlet.context-path в качестве метаданных management.prefix введите шаблон службы:

kind: Template
apiVersion: v1
metadata:
  name: dictionary-service
annotations:
  description: Template for Dictionary Service 1.0.0
labels:
  app: dictionary-service
  management.prefix: dictionary
...

И теперь он работает как шарм.

...