Использование Eureka в качестве реестра с использованием REST API

Мы используем Eureka с нашими приложениями Spring Boot уже несколько месяцев. Мы включили поиск служб между приложениями с помощью аннотаций @DiscoveryClient. Регистрация, продление аренды и отмена регистрации работают, как и ожидалось.

Недавно мы столкнулись со сценарием, в котором у нас есть компонент приложения, отличный от Java (написанный на C++), который предоставляет 3 конечные точки службы REST, которые будут использовать многие из наших Java-приложений Spring Boot. Мы пытаемся выяснить, может ли компонент C++ использовать REST API-интерфейсы сервера Eureka для регистрации при появлении, чтобы Java-приложения Spring Boot могли выполнять обычный поиск через Eureka для связи с компонентом C++.

Поскольку я не могу использовать клиент Eureka в компонентах C++ (очевидно), я начал тестировать прямые REST API (как описано здесь) с помощью Postman. Регистрация прошла без проблем, отправив полезную нагрузку JSON методом POST на http://eurekaserver:8761/eureka/apps/FOO-APP (с instanceId = 1111 и hostName = foo-app). Я могу запросить http://eurekaserver:8761/eureka/apps и увидеть FOO-APP в списке как ожидал.

Однако, когда я пытаюсь отменить операцию с помощью метода DELETE для http://eurekaserver:8761/eureka/apps/FOO-APP/1111 или http://eurekaserver:8761/eureka/apps/FOO-APP/foo-app, я получаю ошибку 404.

С идентификатором экземпляра:

{
  "timestamp": 1447479397996,
  "status": 404,
  "error": "Not Found",
  "message": "Not Found",
  "path": "/eureka/apps/FOO-APP/1111"
}

ИЛИ (тот же результат для hostName):

{
  "timestamp": 1447479397996,
  "status": 404,
  "error": "Not Found",
  "message": "Not Found",
  "path": "/eureka/apps/FOO-APP/foo-app"
}

Я пробовал разные комбинации, но у меня не получается. У меня такое чувство, что я упускаю что-то очевидное - может быть, что-то маленькое. Любая помощь в этом будет оценена по достоинству.

PS: в документации по конечной точке Eureka REST в URL-адресе упоминается «v2». Однако в моем случае это не работает. Регистрация (которая работает для меня) не использует «v2», как описано выше. Если бы кто-то мог подтвердить это, это также было бы полезно. Просто не хватает материалов на эту тему.


person Bloodysock    schedule 14.11.2015    source источник
comment
Рассматривали ли вы вместо этого использование коляски? Он занимается регистрацией, а также действует как обратный прокси-сервер, если ваше приложение C++ хочет подключиться к другим развернутым службам. Вашему приложению нужно только показать свое состояние работоспособности в предопределенном формате.   -  person Ákos Ratku    schedule 15.11.2015
comment
Это вариант. Но я пытаюсь добиться этого, вызывая прямые конечные точки REST. На мой взгляд, вызовы cURL должны работать. Но они этого не делают.   -  person Bloodysock    schedule 15.11.2015
comment
spring-cloud не включал версию v2. Вероятно, вы используете неправильный instanceId. Какую версию весеннего облака вы используете? Вы устанавливаете instanceId где-нибудь в приложениях?   -  person spencergibb    schedule 16.11.2015
comment
URL-адреса, которые я пытаюсь использовать с помощью Postman или cURL, не содержат v2. Я использую Eureka с Spring Cloud Starter Angle.SR3. Я регистрируюсь, используя URL-адрес POST, а не через Java (чтобы попробовать URL-адреса Eureka REST через cURL). Все, что мне нужно, это конечная точка REST, которая работает для операции DELETE или отмены.   -  person Bloodysock    schedule 16.11.2015


Ответы (1)


Наконец, я понял, как можно вызвать операцию cancel, используя URL-адреса REST сервера Eureka. Это работает для сервера Spring Cloud Eureka, но также должно работать и для сервера Netflix Eureka.

Шаблон URL для операции cancel выглядит следующим образом:

DELETE http://eureka_host:eureka_port/eureka/apps/<appName>/<instanceId>

Вот как это задокументировано на странице Операции Eureka REST, но есть очень мало ясности относительно того, что должно было быть <instanceId>. Согласно документации, <instanceId> — это имя хоста хоста, на котором работает клиент Eureka. Это не сработало (IP-адрес или имя хоста). Я попытался передать то же значение, которое дал мне URL-адрес GET (например, 192.168.55.55) или localhost. Это тоже не сработало. Я также попытался передать значение instanceId из вывода GET (которое будет таким же, как значение свойства eureka.instance.metadataMap.instanceId). Это тоже не сработало. Мне буквально пришлось попробовать разные комбинации, чтобы выяснить это. <instanceId> — это объединение имени хоста и идентификатора экземпляра, разделенных :. Например, 192.168.55.55:foo-app-some-random-str.

Вот пример вывода операции GET со списком активных экземпляров, зарегистрированных в Eureka:

<instance>
  <hostName>192.168.55.55</hostName>
  <app>FOO-APP</app>
  ...
  <metadata>
    <instanceId>foo-app-f4ea7b06fc03a05a06900713f7526a5d</instanceId>
  </metadata>
  ...
</instance>

В этом случае команда cancel cURL будет выглядеть так:

$ curl -X "DELETE" http://eureka_host:eureka_port/eureka/apps/FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d

Это приведет к отмене регистрации экземпляра, как и ожидалось.

При этом должен признаться, что не обращал особого внимания на журналы сервера Eureka. Когда вы регистрируете клиент Eureka, журнал распечатывает полное имя экземпляра (FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d), которое я мог использовать в качестве своего предположения.

Надеюсь, кто-нибудь исправит это в документации Eureka.

person Bloodysock    schedule 16.12.2015
comment
Большое спасибо @Bloodysock - person manikanta nvsr; 21.04.2021