Skip navigation
    Домашнее задание №3
    Домашнее задание №3

    Задание (часть 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


    Дополнительные материалы