-
Notifications
You must be signed in to change notification settings - Fork 5
RU:Client:HTTP
Хттп клиент микро позволяет делать запросы не только к микро сервисам, но и обычным хттп серверам посредством рест апи. Самыми большими плюсами использования хттп клиента микро в том, что не нужно выходить за рамки экосистемы микро. Все врапперы метрик, трейсинга, логов и тп продолжат работать с микро клиентом как и раньше. При этом остается полная гибкость, так как посредством опций можно передать уже подготовленный клиент в конструктор. Также не нужно вручную заниматься маршалингом и анмаршалингом запросов и ответов, так как все это делается посредством кодека микро. Стоит отметить что присутствует мапинг ошибок из прото аннотаций.
Для того, чтобы облегчить работу с запросами и обработку ошибок, микро прото генератор дополняет сгенерированный код необходимыми опциями и параметрами на основе прото аннотаций методов. Также благодаря анализу пути для запроса хттп клиент микро умеет мапить элементы структуры запроса в урл путь. При этом поддерживается практически полностью правила аннотаций апи от гугл.
В случае использования трейсинга ендпоинт будет выглядеть по имени метода, в указанном ниже примере в метриках и тресинге при выполнении запроса LookupUser будет фигурировать имя сервиса + точка + имя метода. Github.LookupUser тем самым позволяя делать красивые метрики и трейс спаны без использования хттп роутеров и встроенных функций.
На текущий момент работа хттп клиента микро проверялась в случае простых структур и прото сообщений. Имя поля в строке запроса должно совпадать с именем поля структуры. Вложенные структуры пока не поддерживаются.
Пример псевдо апи гитхаба в виде прото описания
syntax = "proto3";
package github;
option go_package = "github.com//unistack-org/micro-tests/client/http/proto;pb";
import "api/annotations.proto";
import "openapiv2/annotations.proto";
service Github {
rpc LookupUser(LookupUserReq) returns (LookupUserRsp) {
option (micro.openapiv2.openapiv2_operation) = {
operation_id: "LookupUser";
responses: {
key: "default";
value: {
description: "Error response";
schema: { json_schema: { ref: ".github.Error"; } }
}
}
};
option (micro.api.http) = { get: "/users/{username}"; };
};
};
message LookupUserReq {
string username = 1;
};
message LookupUserRsp {
string name = 1;
};
message Error {
string message = 1;
};
Таким образом, вызывая в микро функцию LookupUser с параметром LookupUserReq{Username: “vtolstov”} мы сформируем гет запрос по адресу /users/vtolstov и заполним структуру ответа. Если передать несуществующего пользователя, то функция вернет ошибку типа Error