2020-04-16 16:14:56 +00:00
|
|
|
|
## jsonrpc
|
2020-04-16 10:27:30 +00:00
|
|
|
|
|
2020-04-16 16:14:56 +00:00
|
|
|
|
Главная идея [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).
|