0 RU:Client:HTTP
Vasiliy Tolstov edited this page 2021-11-18 02:44:22 +03:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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

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

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