Skip to content

RU:Client:HTTP

Vasiliy Tolstov edited this page Nov 17, 2021 · 1 revision

Хттп клиент микро позволяет делать запросы не только к микро сервисам, но и обычным хттп серверам посредством рест апи. Самыми большими плюсами использования хттп клиента микро в том, что не нужно выходить за рамки экосистемы микро. Все врапперы метрик, трейсинга, логов и тп продолжат работать с микро клиентом как и раньше. При этом остается полная гибкость, так как посредством опций можно передать уже подготовленный клиент в конструктор. Также не нужно вручную заниматься маршалингом и анмаршалингом запросов и ответов, так как все это делается посредством кодека микро. Стоит отметить что присутствует мапинг ошибок из прото аннотаций.

Для того, чтобы облегчить работу с запросами и обработку ошибок, микро прото генератор дополняет сгенерированный код необходимыми опциями и параметрами на основе прото аннотаций методов. Также благодаря анализу пути для запроса хттп клиент микро умеет мапить элементы структуры запроса в урл путь. При этом поддерживается практически полностью правила аннотаций апи от гугл.

В случае использования трейсинга ендпоинт будет выглядеть по имени метода, в указанном ниже примере в метриках и тресинге при выполнении запроса 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

Clone this wiki locally