Использование 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.