#akka #akka-http #lagom
#akka #akka-http #lagom
Вопрос:
Я новичок в микросервисах и фреймворке Lagom, в сервисном API, где мы делаем сервисные вызовы, я не понимаю разницы namedcall
, pathcall
и restcall
. где и когда мы должны использовать что?
например, в этих вызовах:
ServiceCall<NotUsed, Cargo, Done> register();
restCall(Method.POST, "/api/registration", register()
ServiceCall<NotUsed, NotUsed, Source<Cargo, ?>> getLiveRegistrations();
pathCall("/api/registration/live", getLiveRegistrations())
ServiceCall<User, NotUsed> createUser();
namedCall("/api/users", this::createUser)
Ответ №1:
Документация Lagom довольно хорошо описывает это:
- Названный
Самый простой тип идентификатора — это имя, и по умолчанию это имя устанавливается таким же, как имя метода в интерфейсе, который его реализует. Пользовательское имя также можно указать, передав его методу namedCall:
default Descriptor descriptor() {
return named("hello").withCalls(
namedCall("hello", this::sayHello)
);
}
В этом случае мы назвали его hello вместо sayHello по умолчанию. При реализации с использованием REST это будет означать, что у этого вызова будет путь /hello .
- Путь
Второй тип идентификатора — это идентификатор, основанный на пути. Это использует путь URI и строку запроса для маршрутизации вызовов, и из него могут быть дополнительно извлечены параметры динамического пути. Их можно настроить с помощью метода pathCall.
Параметры динамического пути извлекаются из пути путем объявления динамических частей в пути. Перед ними ставится двоеточие, например, путь /order/:id имеет динамическую часть, называемую id . Lagom извлечет этот параметр из пути и передаст его методу вызова службы.
ServiceCall<NotUsed, Order> getOrder(long id);
default Descriptor descriptor() {
return named("orders").withCalls(
pathCall("/order/:id", this::getOrder)
);
}
Конечно, можно извлечь несколько параметров, они будут переданы вашему методу вызова службы в том порядке, в котором они извлекаются из URL:
- Вызов Rest
Конечным типом идентификатора является идентификатор REST. Идентификаторы REST предназначены для использования при создании семантических REST API. Для их идентификации они используют как путь, так и идентификатор на основе пути, и метод запроса. Их можно настроить с помощью метода restCall:
ServiceCall<Item, NotUsed> addItem(long orderId);
ServiceCall<NotUsed, Item> getItem(long orderId, String itemId);
ServiceCall<NotUsed, NotUsed> deleteItem(long orderId, String itemId);
default Descriptor descriptor() {
return named("orders").withCalls(
restCall(Method.POST, "/order/:orderId/item", this::addItem),
restCall(Method.GET, "/order/:orderId/item/:itemId", this::getItem),
restCall(Method.DELETE, "/order/:orderId/item/:itemId", this::deleteItem)
);
}