39 lines
No EOL
2.2 KiB
Markdown
39 lines
No EOL
2.2 KiB
Markdown
## jsonrpc
|
||
|
||
Главная идея [RPC](https://en.wikipedia.org/wiki/Remote_procedure_call) (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). |