diff --git a/jsonrpc/README.md b/jsonrpc/README.md index 459e72e..ea7f06b 100644 --- a/jsonrpc/README.md +++ b/jsonrpc/README.md @@ -1,2 +1,39 @@ -# jsonrpc +## 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). \ No newline at end of file