
Задание (часть 1)
Очень частым явлением является использование RPC технологии в различных приложениях. Например, известный многим gRPC, который позволяет иметь несколько JVM с распределенной сборкой мусора в рамках одного приложения
В любом RPC нужно учитывать транспортный уровень, а также протокол сериализации данных, например, в gRPC используется protobuf. В этом домашнем задании вам предлагается, используя механизмы рефлексии Go, разработать свой RPC на основе http, используя JSON в качестве протокола сериализации
Архитектура
ServerStubProvider
Имеет единственный метод:
CreateObjectStub(serverObject any) http.HandlerFunc
создает абстракцию Stub, являющуюся связующим звеном между транспортным уровнем и методами сервера
serverObject - структура, в которой определены нужные RPC методы
RmiClient
Имеет единственный метод:
Invoke(ctx context.Context, url *url.URL, method string, body []any, res any) error
делает запрос на указанный адрес, передавая в body сериализованный запрос (список аргументов), после чего возвращает ответ через аргумент
Вызов
Invokeвнешне ни чем не отличается от вызова обычной функции, что и является преимуществом RPC
Особенности реализации
Различные примеры использования можно посмотреть в тестах
Необходимо подумать над функциями, которые принимают context
Нужно поддержать работу с variadic функциями
Следует обратить внимание на функции, которые принимают/возвращают указатели различной вложенности
Следует обратить внимание на паники при работе с пакетом reflect
