## jsonrpc Главная идея [RPC](https://en.wikipedia.org/wiki/Remote_procedure_call) (remove procedure call) заключается в том, чтобы вызов удаленных процедур (например, работающих на другой машине) был очень похожим на вызов функций внутри программы. Вся механика удаленных вызовов прячется от пользователя. Для чего это нужно? Например, для облегчения организации распределенных вычислений. Реализация RPC включает в себя два компонента: сетевой протокол для обмена в режиме клиент-сервер и язык сериализации объектов. В данной задаче нужно реализовать RPC, используя http в качестве транспорта и json для сериализации запросов/ответов. ### Клиентская часть ``` Call(ctx context.Context, endpoint string, method string, req, rsp interface{}) error ``` `Call` делает http запрос на заданную ручку (endpoint+method), передавая в body сериализованный запрос и возвращает десериализованный ответ через аргумент. Логической частью запроса занимается сервер. Для пользователя работа с `Call` выглядит практически также, как работа с обычной функцией: ``` method(req, &resp) error ``` ### Серверная часть ``` MakeHandler(service interface{}) http.Handler ``` RPC сервис - это структура, на которой определено несколько RPC методов. RPC метод - это функция с сигнатурой вида: ``` Method(ctx context.Context, req *Request) (*Response, error) ``` `MakeHandler` создаёт http.Handler, предоставляющий http ручки для всех RPC методов сервиса (http endpoint = method name).