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

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

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

Поскольку я не могу использовать Eureka Client в компонентах 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.

С instanceId:

{
  "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: в документации конечной точки REST Eureka упоминается "v2" в URL. Тем не менее, это не работает в моем случае. Регистрация (которая работает для меня) не использует "v2", как описано выше. Если бы кто-то мог это подтвердить, это тоже было бы полезно. Похоже, материала на этот счет недостаточно.

1 ответ

Решение

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

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

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

Вот как это задокументировано на странице операций Eureka REST, но очень мало ясности относительно того, что <instanceId> должен был быть. Согласно документации, <instanceId> это имя хоста, на котором работает клиент Eureka. Это не сработало (IP-адрес или имя хоста). Я пытался передать то же значение, что и GET URL дал мне (например, 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.

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