Я уже давно использую Go в продакшене, и мне нравится, насколько он быстр и надежен. Golang особенно привлекателен из-за его меньших размеров сборки, параллелизма, обеспечиваемого go-подпрограммами, и возможности запускать сборки непосредственно на машине.

Поскольку стандартные пакеты работают очень быстро, вы можете создать готовый к работе микросервис без использования каких-либо сторонних библиотек или фреймворков. Это не означает, что в Go нет фреймворков, обеспечивающих большую гибкость или скорость, они просто не так популярны.

обычно советуют придерживаться стандартных библиотек. По иронии судьбы, первые результаты поиска Google по запросу «фреймворки golang» объясняют, почему их не следует использовать.

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

Все тесты выполняются в конфигурации, указанной ниже. Хотя обычное время тестирования составляет всего 1 секунду, я провел все тесты в течение 10 секунд, чтобы убедиться, что каждый цикл тестирования был согласован.

  • Процессор - Intel Core i7 с тактовой частотой 2,7 ГГц
  • Оперативная память - 16 ГБ - 16 ГБ 2133 МГц LPDDR3
  • Время жима 10 с вместо стандартной 1 с
  • пройти тест -bench =. -benchtime = 10 с

Маршрутизация

Стандартный сервер http Go поставляется с хорошим маршрутизатором, который может считывать параметры запроса, но не имеет именованных параметров, таких как,

/students/:studentID/grades/:gradeID

Любая служба REST с вложенными ресурсами, подобными приведенным выше, уже должна была бы проанализировать их с помощью внешней библиотеки маршрутизации. Gin, Echo, Beego, Gorilla Mux и Goji - это лишь некоторые из хорошо известных брендов (согласно их подписке на Github).
Некоторые из них представляют собой полноценные фреймворки промежуточного программного обеспечения с возможностями маршрутизации, в то время как другие просто библиотеки маршрутизации.

Эти библиотеки были протестированы для одного именованного параметра, и результаты показаны ниже. У Gin самый быстрый роутер, на втором месте Echo.

Сериализация и десериализация JSON

После того, как запрос API попадает через маршрутизатор и передается контроллеру или обработчику, следующим шагом является декодирование запроса JSON или кодирование при возврате ответа.

В Go есть действительно хороший encoding пакет, который поддерживает несколько форматов, таких как json, XML, csv, но беглый взгляд на альтернативы покажет вам множество библиотек. Я сравнил Jsoniter, EasyJson со стандартным пакетом encoding/json, и ниже приведены результаты.

Ниже приведен результат для кодирования, и, как показывают результаты, разница в производительности незначительна.

Но для декодирования JSON jsoniter работает в 5 раз быстрее, чем стандартный пакет кодирования.

Теперь, если ваш запрос декодирован, следующим шагом может быть применение вашей бизнес-логики и, возможно, выполнение некоторых операций с базой данных.

ORM или нет?

Большинство популярных языков зависят от фреймворков для создания микросервисов, взаимодействующих с базами данных. В мире Java довольно популярны Hibernate, Active Record для Rails и Django ORM. ORM (объектно-реляционное сопоставление) иногда помогает лучше обрабатывать транзакции, отношения между таблицами и помогает избежать написания сложного SQL для простых соединений.

Но в Go снова есть действительно хорошая database стандартная библиотека, которая действительно упрощает подключение к реляционной базе данных, а также делает это довольно быстро. Но одна проблема связана с запросами. Когда вы запрашиваете несколько строк, вам придется вручную сопоставить каждое поле в строке, а затем назначить их struct. Это работает, но вскоре становится беспорядочным и заставляет писать много кода. sqlx - это библиотека, которая позволяет сканировать всю строку в вашу структурную переменную.

Хотя sqlx сокращает типичное количество строк, которые вы пишете для построения CRUD, вы все равно пишете повторяющийся код много раз. Использование ORM может помочь уменьшить его и сосредоточиться на вашей бизнес-логике.

Я проверил database, database + sqlx, gorm , go-pg на предмет запросов, и ниже приведены результаты. Удивительно, но go-pg ORM работает быстрее, чем стандартный пакет или даже sqlx. GORM, в то время как очень известный в экосистеме, относительно медленный.

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

Предостережения

Хотя некоторые улучшения скорости вполне заметны, само по себе это не должно быть причиной отхода от стандартных библиотек. Следует учитывать такие вещи, как легкость тестирования кода, долгосрочное обслуживание библиотеки с открытым исходным кодом, кривая обучения команды.

Несмотря на все это, я думаю, что что-то вроде echo + jsoniter + go-pg вместе со всеми замечательными функциями стандартной библиотеки Go было бы самым быстрым способом создать свой микросервис и избежать избыточного кода.

Не стесняйтесь делиться своими мыслями и опытом относительно библиотек Go.

Создайте бесплатную учетную запись, чтобы разблокировать свой индивидуальный опыт чтения.

Это оно…

Присоединяйтесь к FAUN: Веб-сайт 💻 | Подкаст 🎙️ | Twitter 🐦 | Facebook 👥 | Instagram 📷 | Группа Facebook 🗣️ | Группа Linkedin 💬 | Slack 📱 | Cloud Native Новости 📰 | Еще .

Если этот пост был полезен, нажмите несколько раз кнопку хлопка 👏 ниже, чтобы выразить поддержку автору 👇