Простой метод поддержки и развития кода с помощью контрактов схемы.

Прежде чем мы начнем, для тех сверхлюдей, которые могут конвертировать код в блог / документацию, вот ссылка на репозиторий Github.

@skimmable (Проблема)

  1. Если вы когда-либо использовали API или службу Pub / Sub, то вы бы потратили свое время на копание в документации схемы (модели данных) автора.
  2. Если вы считаете, что чтение документации занимает много времени, то пробовали ли вы когда-нибудь обновить версию API, чтобы получить одну функцию, и в итоге изменили множество моделей?

Несмотря на то, что спецификации Open API помогают сэкономить время, нам все равно приходится создавать объекты на нашем предпочтительном языке, придерживаясь спецификаций схемы.

Некоторые службы, такие как Confluent’s Schema Registry, решают указанные выше проблемы, сохраняя схему в облаке и десериализуя ее при использовании библиотек.

Это достигается за счет того, что некоторые механизмы сериализации данных, такие как Protobuf, Avro, Apache Thrift и т. Д., Обеспечивают генерацию кода на основе схемы для многих языков.

Но что, если мы хотим создать собственный простой реестр схем?

@skimmable (Мыслительный процесс)

Давайте уменьшим масштаб и посмотрим на картину в целом.

Отказ от ответственности: с этого момента аналогии могут достигать своего пика, недетерминированно

# В мире, где только документация, нам давали только ингредиенты [схему], и мы сами делали пищу [код].

# Некоторые механизмы сериализации дали нам машины [генераторы кода] для преобразования ингредиентов [схемы] в пищу [код]

# Теперь мы постараемся предоставить услугу на вынос, а также предоставим возможность выбора между нашими вариантами.

Другими словами, мы должны

  1. Сгенерируйте код из схемы с помощью генераторов кода и каким-то образом сделайте его доступным для разработчиков для использования на вынос.
  2. Поддерживайте разные версии сгенерированного кода в синхронизации с изменением схемы и позволяйте потребителям выбирать нужную версию.

Когда мы слышим слова «версия» и «код», Git выглядывает из стека нашего мозга. Итак, если разработчики схемы хранят схемы в GIT, это решит нашу проблему управления версиями.

Ох .. Погодите .. Это почти обо всем позаботится. Мы не только решили проблему управления версиями, но и нашли место, которое доступно любому разработчику, который хочет использовать API.

Итак, теперь у нас есть место для хранения ингредиентов [схемы], у нас также есть машина [генераторы кода], но нам нужен кто-то, чтобы получить ингредиенты [схему], поместить их в машину [генераторы кода] и поместите их на подходящую полку [внутри git] для получения

@ Представление (SchemaCodeMan)

Расширенный как Schema Code Manager (в настоящее время прототип) - это действие Github, которое генерирует код для определенной схемы. Приведенный ниже GIF помогает визуализировать связь, которую я пытался установить между схемой, сгенерированным кодом и Git.

Нажмите здесь, чтобы увидеть неодушевленное изображение

@important (Поток)

  1. Разработчики схемы обновляют свою схему в определенной ветке и сообщают об этом schemacodeman.
  2. Schemacodeman (являющийся действием GitHub) генерирует код для обновленной схемы для каждого языка в отдельной ветке.
  3. При эволюции схемы код развивается независимо в соответствующих языковых ветвях.

@ schema-consumer (Как мы используем код?)

  1. Потребители службы могут клонировать специфичную для языка ветвь кода в виде подмодуля в свое хранилище. Одно из основных преимуществ наличия языковых веток
  2. Обновление / понижение версии эквивалентно проверке подмодуля для указанного фиксации / тега.

@ schema-creators (Как настроить этот поток?)

Добавьте что-то вроде приведенного ниже в свое действие Github. Сделанный!

uses: naveenanto22/schemacodeman@v1
  with:
    languages: 'js,csharp,python'          
    schema_files: '*.proto,contract/*.proto'

Дополнительные параметры и описания: naveenanto22 / schemacodeman

@skippable (Что происходит внутри?)

  1. Schemacodeman генерирует код на основе собственного генератора кода или генератора кода по умолчанию для каждого языка.
  2. Сиротская ветвь кода создается для каждого языка и содержит только сгенерированный код.
  3. Каждый тег в ветви схемы отражается в ветви кода, чтобы указать версии и предварительные выпуски на уровне кода.

@TheEnd (надеюсь, случайного плагиата нет)

Вы все еще читаете? Я рад! Вот снова ссылка на Github Repo!