Как принцип, ответственный за проектирование промежуточного программного обеспечения на Зериум Я пишу, чтобы поделиться некоторыми из вариантов, которые мы сделали, и как они поддержали. Промежуточное программное обеспечение в этом контексте означает бизнес-логику, которая находится между постоянным хранением и веб-интерфейсом пользователя.
Цели
Вот некоторые из целей дизайна 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»