Рубрики
Uncategorized

Проектирование reзов API Framework

Как принцип, ответственный за проект промежуточного программного обеспечения на Знориуме, я пишу, чтобы поделиться … Помечено с Go, DevOps.

Как принцип, ответственный за проектирование промежуточного программного обеспечения на Зериум Я пишу, чтобы поделиться некоторыми из вариантов, которые мы сделали, и как они поддержали. Промежуточное программное обеспечение в этом контексте означает бизнес-логику, которая находится между постоянным хранением и веб-интерфейсом пользователя.

Цели

Вот некоторые из целей дизайна ZERRIUGE промежуточного программного обеспечения:

  • Сухой (не повторяешься) — Ограничьте количество кода котлового пластин, скопированного из одного API к другому
  • Обеспечить быстрый оборот для тестирования и развертывания
  • Язык, который имеет широкую поддержку и широко развернут в аналогичных приложениях

Технологии

Рано мы сделали несколько выборов ключевой технологии, которая оказалась в основном успешной:

  • Базы данных SQL, Postgres для управления пользователем/сеансом, Vertica для аналитики
  • Перейти на промежуточное программное обеспечение
  • Контейнеры для развертывания

Базы данных SQL

Работав с базами данных No-SQL, так и SQL в прошлом, ясно, что обещание масштабирования и надежности NO-SQL не родилось. Подавляющее большинство операций базы данных являются только для чтения, и использование SQL позволяет нажать кэш данных, необходимых для создания сложных корреляций в соответствии с программным обеспечением базы данных, который оптимизирован для задачи. Надежность SQL также была адресована либо в кластерных реализациях серверов, либо размещенных службах с репликацией.

Идти

Исходя из C/C ++, я неоднократно впечатлен. Скорость исполнения позволяет вводить сложные преобразования данных без значительных накладных расходов, а скорость компиляции отображает тестовый цикл, близкий к интерактивному. И объем и разнообразие библиотек поддержки открытых источников впечатляют; Больше на этом позже.

Контейнеры

Создание промежуточного программного обеспечения сервера в контейнер позволяет проводить его в простых платформе независимых конфигурациями Docker-Compose, а также полным стеком Kubernetes постановки и производства и производства. Например, наши инженеры пользовательского интерфейса могут развернуть контейнер на их MacBooks, используя Docker.

Шаблоны

Мы использовали шаблоны эффективно для двух областей промежуточного программного обеспечения:

  • API для выполнения CRUD (создать, чтение, обновление, удаление) на общих таблицах базы данных
  • Интерполирующие аргументы в сложные SQL-запросы

Грубый с Go-Raml

Я искал API Framework, которая позволила мне уменьшить количество повторных спецификаций. Raml and Go-Raml (github.com/jumpscale/go-raml) соответствуют законопроекту. Хотя не так зрелый как Swagger/OAS, RAML предоставляет больше выражений на типов, которые могут быть переданы между API. И, потому что Go-Raml написан в Go и Open-Source, я смог исправить ошибки и написать свои собственные расширения. Вот образец типа RAML:

  Vote:
    properties:
      id:
        type: string
        generated: true
      createTime:
        type: datetime
        required: false
      createUserId:
        type: string
        generated: true
      modifyTime:
        type: datetime
        required: false
      modifyUserId:
        type: string
        generated: true
      name:
        type: string
        pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
        db: "rid"
      thumb:
        enum: [ up, down ]
      desiredPriority:
        enum: [ high, med, none ]

Рамки будут проверять входы и переводить теги с JSON Case Case в SQL Snake-Case с переопределением «DB» выше для имени. С помощью этого типа я могу описать различные HTTP-методы, которые действуют на него. Ниже приведен http, который создает или обновляет голос по имени. Ответы документируют возможные значения возврата.

/vote:
  dataSource: "odbc/t_votes"
  put:
    securedBy: [ Token ]
    description: Create or update a vote
    body:
      application/json:
        type: Vote
    responses:
      200:
        body:
          application/json:
            type: Vote
      201:
        body:
          application/json:
            type: Vote
      400:
        body:
          application/json:
            type: Meta
      500:
        body:
          application/json:
            type: Meta

Приведенный выше текст переведен GO-RAML и нашими шаблонами в код GO, который обслуживает запрос. У нас есть шаблоны для следующих HTTP-операций:

| Method | URL Pattern | Description |
| --- | --- | ---|
| GET | {object} | Get all objects |
| GET | {object}/{id} | Get object by ID |
| POST | {object} | Create object |
| PUT | {object} | Create/update object by name |
| PUT | {object}/{id} | Create/update object by ID |
| PATCH | {object}/{id} | Update fields in object by ID |
| DELETE | {object}/{id} | Delete object by ID |
| POST | {object}/{action} | Custom request/response API |

У нас также есть обратные вызовы, встроенные в сгенерированный код для решения предварительной обработки, позволяя нам адаптировать эту модель к широкому разнообразию типов объектов. Около половины наших API обрабатываются с вышеуказанными операциями и обратными вызовами CRUD, а другая половина обрабатывается с пользовательскими действиями, последняя картина HTTP выше.

SQL шаблоны

Другое использование шаблонов GO в наших рамках включает добавление параметров к сложным запросам. Ниже приведен пример шаблона SQL:

{{ define "prefix" }}
select m.abfmt_str from {{.schema}}.t_metadata_namespaces as m
inner join {{.schema}}.t_etable as e on e.namespace = m.namespace
where e.etname in ({{ csv .etypeList }})
order by pid desc
{{ end }}

Форматирование массива String Po Go в список SQL выполнена с функцией шаблона ( https://golang.org/pkg/text/template/#template.funcs):

        "csv": func(in []string) string {
            out := ""
            for _, v := range in {
                if out != "" {
                    out += ","
                }
                out += "'" + v + "'"
            }
            return out
        },

Эта конструкция обеспечивает разделение опасений между кодом GO, который предоставляет параметры часто сложным SQL, который извлекает данные.

Выводы

Для рассмотрения наших целей сверху:

  • RAML и GO-RAML, вместе с функциями фильтра до и после обработки генерируют около половины нашего API-кода
  • Развертывание контейнера и быстрые времена компиляции обеспечивают быстрые и гибкие циклы Dev/Test
  • Go И это коллекция библиотек открытых источников, охватывает соответствующую функциональность и наслаждаться широкой поддержкой

Но больше всего, это помогло компанию, которую я работаю ( Zebrium ), чтобы строить и развернуть версии программного обеспечения быстро и с высоким качеством.

Опубликовано от имени автора: Алан Джонс @ Зериум

Оригинал: «https://dev.to/gdcohen/designing-a-restful-api-framework-3jn1»