shad-go/jsonrpc
2021-04-08 23:20:21 +03:00
..
jsonrpc.go Add jsonrpc 2020-04-16 17:20:03 +03:00
jsonrpc_test.go Add jsonrpc 2020-04-16 17:20:03 +03:00
README.md fix jsonrpc/README.md 2021-04-08 23:20:21 +03:00

jsonrpc

Главная идея RPC (remote 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).