Разработка индивидуальных решений на языке Go. Cms на golang
- КиберЧайная «Qunafia»
Язык программирования Go (Golang). Fragmenta - веб-фреймворк на Golang.
Июль 2016
Fragmenta - это нечто среднее между веб-фреймворком и системой управления контентом. Она написана на языке программирования Golang.
Так же есть интерсный вариант с генератором статичных сайтов Hugo (http://gohugo.io/), но в силу некоторых бизнес-процессов сейчас мне нужна CMS и CMF для создания динамических сайтов для своих проектов. А движок статичных сайтов на Go рассмотрю сильно позже.
Вот как позиционируют себя Fragmenta:
Fragmenta is a CMS and web framework for go, designed to help you build custom applications quickly and easily.
***
Поискав в Интернете CMS и CMF (что более предпочтительнее) написанные на Golang-е нашёл Fragmenta. Исходя из скудной информации об авторах, разработчиком является английская компания Mechanism Design Ltd.
Сам я ранее не пользовался этой системой, поэтому буду ставить её и создам сайт на ней в “прямом эфире”.
[Для того чтобы развернуть Fragmenta у себя на компьютере нужно подготовить окружение, что мы уже сделали в предыдущих статьях: ]{style=“line-height: 1.42857; background-color: initial;“}
Язык программирования Go (Golang). Изучение, настройка окружения, создание приложений. Старт. и Язык программирования Go (Golang). Настройка окружения. Oбъектно-реляционная система баз данных PostgreSQL.
Сейчас Fragmenta полноценно работает с СУБД Postgresql (поэтому мы её и установили), но обещают также поддержку Mysql.
Приступим. Заходим на сайт Fragmenta и видим там два варианта: для разработчиков и дизайнеров. Т.е. что нас больше интересует: веб-фреймворк (CMF) или система управления контентом (CMS). Понятно, что CMS является производной от CMF.
Так как мы тут а-ля разработчики + нас интересует сам язык Golang, то выбираем: http://fragmenta.eu/develop
Устанавливаем “fragmenta comand line tool”:
go get github.com/fragmenta/fragmentaубедиться, что все ок можно заглянув в папку:
cd /home/AppDevOps/GoWork/bin && lsМы увидим две программы: “hello” и “fragmenta”. Первую программку мы скомпилировали, когда разворачивали окружение для Golang.
Теперь сгенерирую CMS-ку для сайта моего нового проекта “AppDevOps.com”:
fragmenta new cms $GOPATH/src/github.com/kunafin/appdevops.comРазумеется тебе нужно это сделать для своего тестового или реального проекта. Я привык сразу все делать в живую, поэтому у меня будет проект реальный (хоть и в самом начале своего пути).
[Для первого раза можно позволить Fragmenta сделать все по предустановленным настройкам, но если захочешь поменять параметры по БД и тому что в них создается при старте - нужно править файл:]{style=“line-height: 1.42857; background-color: initial;“}
nano $GOPATH/src/github.com/kunafin/appdevops.com/secrets/fragmenta.json[и два файла отвечающие за создание БД и таблицы, они лежат в папке:]{style=“line-height: 18.5714px;“}
cd $GOPATH/src/github.com/kunafin/appdevops.com/db/migrate && ls[Итак, мы должны находиться в папке:]{style=“line-height: 18.5714px;“}
cd /home/AppDevOps/GoWork/src/github.com/kunafin/appdevops.comСоздаём БД с таблицами по умолчанию. Здесь есть один нюанс. Надо или своему штатному пользователю сделать доступ к Postgresql или, как поступил я, залогиниться в терминале под суперпользователем Postgresql-а “postgres” и выполнить операцию:
В ходе процесса пару раз нужно будет ввести пароль пользователя postgres.
Далее можно снова перелогиниться на штатного пользоватлея и запустить приложение:
fragmentaВсё! Теперь можно перейти к работе с проектом в браузере: http://localhost:3000/
kunafin.ru
Golang подходит ли для создания сайтов? — Toster.ru
Golang используют для создания сайтов да. Только дорогих сайтов. Скажем есть у меня проектик - хозяин ввалил в него уже стоимость Ленд Круизера свежего и все продолжает платить и платить. Вы - не тот человек, которого будут для этого нанимать. А в дешевой нише вы не сможете конкурировать по цене с ПХПистами.1. Как обстоят дела с производительностью в сравнении с php смотрел benchmark go выигрывает у php в 2 раза по скорости(возможно мне стоит и дальше сайты создавать на php)Одни из самых высоконагруженных сайтов в мире сделаны с PHP - Facebook, примеру.Или Vkontakte
Формально Go быстрее. Если ваш сервер и клиент разделяет только 10 метров.Но в мире веба очень большие задержки - это связь между сервером и браузером, там совсем другие расстояния и другой порядок задержек. А это от языка программирования не зависит.
На их фоне, если вы нормально запрограммировали сайт - не должно тормозить ни на PHP ни на Go.
2. Влияет ли как-то golang на seo оптимизацию-выдачу(если для frontend не админ панели взять angularjs то сайт не будет весь индексироваться)Вам с таким уровнем понимая рано что-то решать.Делайте то, что старшие скажут.
3. Какую выбрать связку для сервера возможно имеется nginx или apache в поддержке для golang (или у go имеется свой сервер и как он в сравнении с остальными)Это не связано с языком. Это связано с администрирование, проектированием, архитектурой системы, но не языка.
4. Поддерживает ли golang mysql и какая скоростьДа.Скорость работы с СУБД ограничена, как правило, самой этой СУБД - это узкое место всегда.От языка программирования, использующего ту или иную СУБД - зависит слабо.
5. Возможно имеются хорошие фреймворки написанные на golang для создания именно сайтовRevel, Beego.me, gin и еще десяток.Только они не нужны.Все что нужно уже входит в стандартную библиотеку Golang.Для облегчения работы стоит глянуть на фреймворки - Gorilla, Martini....
toster.ru
Создание веб-приложения на Go в 2017 году / Хабр
Пару недель назад я начал разрабатывать еще одно веб-приложение, только уже на Go. Будучи, в основном, бэкэнд-разработчиком, я не часто писал веб-приложения целиком, поэтому каждый такой случай больше походил на вызов. В такие моменты хотелось, чтобы кто-нибудь написал руководство по веб-разработке для людей, у которых нет возможности целыми днями вникать в тонкости отличного дизайна, но которым просто нужно создать работающий, функциональный сайт без лишней суеты.
Я решил воспользоваться этой возможностью и сделать такое руководство, в котором начать с нуля веб-приложение так, как это должно быть сделано в 2017 году (в моем понимании). Я провел много часов, докапываясь до тех вещей, которых раньше обычно избегал, просто для того, чтобы хотя бы раз за много лет я мог с уверенностью заявить, что у меня есть свой взгляд и опыт в этом вопросе, и получить для себя работающий рецепт, который, возможно, пригодится не только мне.
Статья начинает короткую серию, освещающаю то, что я узнал в процессе. Этот первый пост представляет собой общее введение, описывающее текущее положение дел, проблемы и то, почему я считаю Go хорошим выбором. Последующие статьи будут более детальными и содержать больше кода. Мне любопытно, насколько мой опыт коррелирует с вашим; может быть я в чем-то ошибаюсь, так что не стесняйтесь комментировать.
Если вас интересует только код, он тут.
Введение
Раньше моих базовых знаний HTML, CSS и JavaScript было достаточно для моих скромных нужд в сайтостроении. Большинство приложений, которые я когда-либо создавал, были сделаны с помощью mod_python, напрямую используя механизм публикации обработчиков (прим.пер.: пример можно посмотреть тут). Забавно, что будучи ранним последователем Python, я также немало поработал с Rails. В течение последних нескольких лет я сосредоточился на инфраструкте (больших) данных, которая вовсе не является веб-разработкой, хотя необходимость в веб-интерфейсах тут — не редкость. Фактически, приложение, которым я сейчас занимаюсь, является приложением для работы с данными, но оно не опенсорсное и то, что оно делает, не имеет значения для данной статьи. В общем, это должно прояснить, с какой стороны я на все это смотрю.
Python и Ruby
Еще год назад я бы рекомендовал Python или Ruby в качестве среды веб-приложения. Может быть есть и другие подобные языки, но с моей точки зрения, в мире доминируют Python и Ruby.
Большую часть времени главной задачей веб-приложения было конструирование веб-страниц с помощью компоновки конечного HTML на стороне сервера. Как Python, так и Ruby очень хорошо подходят для извлечения данных из БД и превращению их в кучу HTML-кода с помощью шаблонов. Существует множество фреймворков/инструментов на выбор, например, Rails, Django, Sinatra, Flask и т.д. и т.п.
И хотя эти языки имеют определенные существенные ограничения, такие как GIL, легкость, с которой они решают проблему генерации HTML, намного ценнее компромиссов, на которые приходится идти.
GIL
GIL (Global Interpreter Lock) залуживает отдельного упоминания. Безусловно, это самое большое ограничение любого решения на Python или Ruby, но это очень скользкая тема, люди чаще предпочитают делать вид, что проблемы нет. А если уж речь об этом зашла, эмоции обычно бьют через край, в сообществах Ruby и Python идут бесконечные обсуждения на тему GIL.
Для тех, кто незнаком с этой проблемой — GIL позволяет выполнятся только одной вещи за раз. Когда вы создаете потоки и они ”выглядят” как параллельно выполняющиеся, на самом деле интерпретатор все еще выполняет инструкции последовательно. Это означает, что один процесс может использовать только один CPU.
Существуют альтернативные реализации, например, основанные на JVM, но они нечасто применяются. Я точно не знаю почему, возможно они не полностью совместимы или, вероятно, не поддерживают корректно C-расширения, и у них при этом все еще может быть GIL. Не уверен, но насколько я могу судить, обычно все-таки используется реализация на C. Чтобы сделать интерпретатор без GIL, придется его полностью переписать, а это уже может изменить поведение языка (в моем наивном понимании), и поэтому мне кажется, что GIL останется.
Веб-приложения любого значительного масштаба обязательно требуют возможность обслуживания запросов параллельно, используя возможности каждого имеющегося у машины CPU. Пока единственным возможным решением остается запуск нескольких экземпляров приложения как отдельных процессов.
Обычно это делается с помощью дополнительного ПО, такого как Unicorn/Gunicorn, при этом каждый процесс слушает свой собственный порт и запускается позади какого-то балансировщика соединения, типа Nginx и/или Haproxy. Альтернативно это может быть сделано через Apache и его модули (такие как mod_python или mod_wsgi), в любом случае это сложно. Такие приложения обычно полагаюся на сервер базы данных в качестве арбитра для любых, чувствительных к конкурентности, задач. При реализации кэширования, чтобы не хранить множество копий одного и того же на одном и том же сервере, требуется хранилище с разделяемой памятью, типа Memcached или Redis, а обычно оба. Также такие приложения не могут делать фоновую обработку, для этого существует отдельный набор инструментов, такой как Resque. И потом все эти компоненты требуют мониторинга, чтобы быть уверенным, что все это работает. Логи должны быть консолидированными, и для них есть свои дополнительные инструменты. Учитывая неизбежную сложность этой настройки, также требуется наличие менеджера конфигурации, такого как Chef или Puppet. И тем не менее, эти наборы, как правило, не способны поддерживать большое количество долговременных соединений — проблема известная как C10K.
В итоге простое веб-приложение с базой данных требует целую кучу составных частей, прежде чем оно сможет обслуживать страницу «Hello World!». И почти все это из-за GIL.
Появление одностраничных приложений
Все дальше и дальше в прошлое уходит генерация HTML на сервере. Последняя (и правильная) тенденция заключается в построении пользовательского интерфейса и рендеринге полностью на стороне клиента, с помощью JavaScript. Приложения, чей пользовательский интерфейс полностью управляется JS, иногда называют одностраничным приложением и, на мой взгляд, за ними будущее, нравится нам это или нет. В таких приложениях сервер только обслуживает данные, обычно в виде JSON, не создавая HTML-кода. В этом случае та огромная сложность, введенная в первую очередь для возможности использования популярного скриптового языка [для создания веб-прилолжения], оказывается ненужной. Особенно учитывая, что Python или Ruby приносят мало выгоды, когда весь вывод — это JSON.
Взгляд на Golang
Go постепенно подрывает устоявшийся мир веб-приложений. Он нативно поддерживает параллельное выполнение, что устраняет потребность почти во всех компонентах, обычно используемых для работы с ограничениями GIL.
Программы на Go представляют собой бинарники, которые нативно запускаются, так что не требуется ничего языкоспецифического устанавливать на сервер. Исчезает проблема обеспечения правильной версии среды исполнения, требуемой приложением; отдельной среды исполнения нет — она встроена в бинарник. Программы на Go могут легко и элегантно запускать задачи в фоне, поэтому нет нужды в инструментах типа Resque. Эти программы запускаются как единственный процесс, так что кэширование становится тривиальным, а значит, Memcached или Redis не нужны. Go может управлять неограниченным количеством параллельных соединений, нивелируя надобность в фронтэндной защите, такой как Nginx.
С Go высокая многослойная башня из Python, Ruby, Bundler, Virtualenv, Unicorn, WSGI, Resque, Memcached, Redis, и т.д., и т.п. уменьшается до всего лишь одного бинарника. Единственный сторонний компонент, который обычно все еще нужен, — это база данных (я бы посоветовал PostgreSQL). Тут важно отметить, что все эти инструменты по прежнему можно использовать, но с Go можно обойтись и без них.
Время запуска такой Go-программы будет, скорее всего, на порядок превосходить любое приложение на Python/Ruby, потребует меньше памяти и строк кода.
Хорошо, а есть популярный фреймворк?
Краткий ответ таков: фреймворк является необязательным и не рекомендуется. Существует множество проектов, претендующих на роль отличного фреймворка, но я считаю, что лучше обойтись без них. Это не только мое личное мнение, я нахожу это мнение довольно распространенным в сообществе Go.
Надо понимать, зачем вообще были созданы фреймворки. В мире Python/Ruby так случилось потому, что эти языки не были изначально спроектированы для обслуживания веб-страниц, и для решения этой задачи необходимо было множество внешних компонентов. То же самое можно сказать и про Java, который, как и Python, и Ruby, стары как веб, каким мы его знаем, или даже немного старше.
Насколько я помню, ранние версии Python "из коробки" не предоставляли ничего для работы с базой данных, не было шаблонов, поддержка HTTP была запутанной, работа с сетью — нетривиальной, даже шифрование тогда было незаконным и в общем, много чего еще отсутствовало. Фреймворк обеспечивал все эти необходимые кусочки и устанавливал характерные для языка правила разработки для всех распространенных вариантов веб-приложений.
Go, с другой стороны, создавался людьми, которые уже имели опыт и разбирались в веб-разработке. Он включает в себя практически все необходимое. Один-два внешних пакета могут понадобиться для решения некоторых конкретных задач, типа OAuth, но ни в коем случае эта пара пакетов не является "фреймворком".
Если все вышеприведенное касаемо фреймворков звучит не достаточно убедительно, полезно рассмотреть кривую обучения для фреймворков и риски. Мне понадобилось около двух лет, чтобы наладить отношения с Rails. Фреймворки могут стать заброшенными и устаревшими, а переносить приложение на новый фреймворк тяжело, а иногда и невозможно. Учитывая, как быстро все меняется в информационных технологиях, фреймворк уж точно не следует выбирать легкомысленно.
Я хотел бы особо выделить инструменты и фреймворки, которые пытаются имитировать идиомы, общие для Python, Ruby или сред JavaScript. Все, что выглядит, или ощущается, или претендует на роль «Rails for Go», включая такие техники, как инъекции, динамическая публикация методов и т.п., которые сильно зависят от рефлексии, не вписывается в идеологию Go, поэтому лучше от такого держаться подальше.
Несомненно, фреймворки делают некоторые вещи проще, особенно в типичном мире CRUD-приложений для бизнеса, где приложения имеют множество страниц с большим количеством полей, манипулируют данными в сложных и постоянно меняющихся схемах баз данных. Не уверен, что в такой среде Go — хороший выбор, особенно если производительность и масштабируемость не в приоритете.
Другая проблема, общая для фреймворков, это то, что они абстрагируют низкоуровневые механизмы от разработчика так, что со временем они становятся настолько загадочными, что буквально невозможно понять, что у них там на самом деле происходит. То, что начинается с лексического псевдонима для одной строки JavaScript становится слоем в слоях транспайлеров, минимайзеров, поверх хелперов, скрытых где-то в подзависимостях. Однажды что-то ломается, и невозможно понять, где искать проблему. Приятно, когда точно знаешь, что происходит, и Go в этом очень хорош.
Как насчет базы данных и ORM?
Аналогично фреймворкам, ORM'ы в Go не сильно распространены. Для начала, Go не поддерживает объекты — то, что обозначено O в аббревиатуре ORM.
Я знаю, если вместо того, чтобы пользоваться удобным User.find(:all).filter..., которое обеспечивается чем-то вроде ActiveRecord, писать SQL вручную — это нечто неслыханное в некоторых сообществах, но я все-таки думаю, что такое отношение должно измениться. SQL — прекрасный язык. Иметь дело с SQL напрямую — это не так уж сложно, а взамен мы получаем больше свободы и возможностей. Пожалуй, самой утомительной частью такой прямой работы является копирование данных из курсора базы данных в структуры, но здесь очень пригодится проект sqlx.
Заключение
На мой взгляд, статья достаточно подробно описывает текущую ситуацию на стороне сервера. Я думаю, клиентскую часть лучше выделить в отдельный пост, поэтому на сегодня — все. Подводя итог, мы строим приложение примерно со следующими требованиями:
- Минимальная зависимость от сторонних пакетов.
- Без веб-фреймворка.
- PostgreSQL в качестве БД.
- Одностраничное приложение.
Продолжение
habr.com
Foxima — создание сайтов на Golang, разработка и поддержка сайтов на Golang.
В каких случаях необходимо индивидуальное решение?
Безусловно, современные CMS (1C-Битрикс, WordPress, Kirby и прочие) предлагают широкие возможности по созданию корпоративных сайтов, блогов, интернет-магазинов, лендингов и прочих сайтов, которые мы встречаем в повседневной жизни. Однако на этих системах достаточно сложно создать что-то выходящее за рамки готовых решений – чаще всего для реализации нестандартного функционала придется модифицировать ядро системы. К сожалению, это негативно сказывается на стабильности ее работы и может привести к непредвиденным ошибкам. Кроме того, после обновления CMS весь нестандартный код будет удален и понадобятся дополнительные затраты времени на то, чтобы вновь модифицировать готовый продукт под особенности конкретного проекта. Поэтому для сложных и нестандартных проектов мы рекомендуем разрабатывать индивидуальное решение.
Каковы преимущества индивидуального решения?
-
Ориентация на конкретные задачи.
Разработчики готовых CMS пытаются «объять необъятное» и стараются создать универсальный продукт под наибольшее количество целей. Индивидуальное решение разрабатывается с учетом специфики вашего проекта и не будет содержать лишних модулей. -
Удобство использования.
Мы разрабатываем функционал сайта с учетом специфики вашего бизнеса и ваших пожеланий – интерфейс будет прост, интуитивен и позволит наполнять и редактировать ваш сайт максимально быстро и удобно. -
Гибкость.
По вашему запросу мы можем быстро оснастить ваш сайт новым нестандартным функционалом – интегрировать API сторонних систем, настроить сбор информации с интересующих вас ресурсов, подключить системы шифрования данных и многое другое. Поскольку вся система находится под нашим контролем, мы можем гарантировать стабильность и надежность работы функционала даже после установки обновлений. -
Экономия ресурсов.
Качественно написанный, оптимизированный и протестированный код позволяет сделать систему менее требовательной к ресурсам хостинга – следовательно, вы сэкономите деньги на аренде серверов.
О языке Go
Большинство индивидуальных решений мы разрабатываем на языке Go (также его часто называют Golang). Это относительно новый язык программирования (ему около 7 лет), разработка которого ведется компанией Google. Несмотря на свою молодость, Go уверенно завоевывает популярность среди веб-разработчиков благодаря своей простоте, гибкости и богатству возможностей. Кроме того, язык постоянно совершенствуется и обретает новые преимущества. В пользу Go также говорит сильное сообщество его поклонников, благодаря чему язык дополняется массой сторонних библиотек.
Создавать веб-приложения на Go сложнее, чем на других языках (к примеру, PHP или JavaScript на платформе Node.js). Почему же мы делаем выбор именно в его пользу? Все дело в уникальных преимуществах этого языка.
Каковы основные преимущества Go?
-
Компилируемость.
В отличие от того же PHP, Go – компилируемый язык программирования. Благодаря этому весь проект может состоять всего лишь из одного запускаемого файла – очень удобно для быстрого запуска. Кроме того, необходимость компиляции позволяет выявить многие ошибки еще до запуска проекта, тогда как в PHP пришлось бы исправлять их уже во время работы. -
Скорость работы.
Еще одно преимущество, следующее из компилируемости. Программы на Golang выполняются в десятки раз быстрее, чем на интерпретируемых языках, и при этом потребляют значительно меньше памяти. -
Параллелизм.
Golang отлично справляется с параллельными вычислениями благодаря так называемым рутинам. Это позволяет при минимальных ресурсах сервера создавать системы, выдерживающие сотни и даже тысячи запросов в секунду.
Конечно, Go не идеален. Как в любом другом языке программирования, в нем есть удачные и неудачные решения. Пожалуй, главная проблема Golang на сегодня – малое количество программистов, использующих его, поэтому смена команды разработчиков проекта на Go – достаточно сложная задача. Однако это не недостаток языка, а скорее проблема роста, которая исчезнет сама по себе с развитием сообщества. В остальном же преимущества Go столь велики, что мы однозначно рекомендуем этот язык в качестве основного решения для создания индивидуальных проектов.
foxima.org
Микросервис на Golang / Хабр
Среди беспорядка найдите простоту; среди раздора найдите гармонию; в трудности найдите возможность... (С) Альберт ЭйнштейнСтатей о микросервисах, их достоинствах и недостатках в последнее время написано немало. Однако как-то редко кто пишет об имплементации микросервисной архитектуры, и прежде всего, именно об микросервисе, как о кирпичике, из которой и строится потом здание такого приложения. Я попытался восполнить этот пробел, и поделиться своим опытом в разработке http-микросервиса, вылившемся в конечном счёте в небольшую библиотеку под не оставляющим места для сомнений названием Microservice. Код написан на прекрасно подходящем для микросервисов, простом и удобном языке программирования Golang. В последнее время мне довелось поработать над созданием микросервисов на языке Golang. Это был интересный опыт. Однако во многом получается (по крайней мере у меня), что каждый раз новый микросервис создаётся заново и с нуля. Конечно, можно использовать предыдущие наработки, но в таком подходе нет некоей системности, и мне захотелось сделать инструмент, который бы несколько упорядочил такую работу (искренне на это надеюсь). Не сомневаюсь, это не единственная идея в разработке микросервисов, но если вы ими интересуетесь, возможно, вам будет интересно прочитать данную статью.
Что такое микросервис, я думаю, во избежание холивара, тут не стоит говорить. Также и о достоинствах и недостатках промолчим. Отмечу лишь, что они есть, и именно благодаря наличию оных микросервисная архитектура востребована.
Архитектура микросервиса (тут и дальше речь о http микросервисе) в моей библиотеке включает в себя хэндлер, тюнер (конфигуратор), демонстрационный middleware. Работает всё очень просто: в приложении загружается конфигурация с учётом файла конфигурации, окружения и командной строки. Под нужные роуты формируется из middleware и хэндлера обработчик. Далее запускается сервер и по запросу приложение отрабатывает нужные очереди. По сути, это подходит и может быть использовано как прототип обычного http приложения, но пожалуй, для такого приложения я бы использовал немного другую архитектуру.
Тюнер
Важным моментом для микросервиса является загрузка конфигурации. Я постарался сделать этот функционал максимально гибким. По умолчанию конфигурация загружается из указанного файла (`config.toml`). Адрес файла конфигурации можно изменить из командной строки, например так: вашсервис -confile config.toml Таким образом можно создать несколько разных конфигурационных файла и запускать микросервис с одной из конфигураций по выбору.Поскольку в конфигурировании микросервиса задействован не только файл, но и переменные окружения и параметры командной строки, то уточню порядок и приоритетность конфигурирования. Самым низким приоритетом обладает конфигурация из файла. Если в операционной системе настроены переменные окружения, то они имеют более высокий приоритет, чем переменные из конфигурационного файла. Параметры командной строки имеют самый важный приоритет. Для изменения параметра в командной строке нужно указывать его название в виде названии раздела и названия параметра (с прописной буквы!). Вот пример изменения порта — вашсервис -Main/Port 85
Ещё немного о конфигурировании: помимо варианта с закидыванием конфигурации в заранее заготовленную структуру, вполне можно было бы использовать вариант импорта данных в обычный map, и потом спокойно использовать значения по ключу. У этого способа есть несомненное достоинство — не нужно добавляя данные в конфигурационный файл дублировать это в конфигурационной структуре. Т.е. всё проще и быстрее. Минусом же будет то, что ошибки неправильного указания ключа переносятся с этапа компиляции на этап выполнения, и кроме того, тут IDE уже не станет нам делать подсказки, что кстати, само по себе очень хорошо в плане защиты от опечаток и как следствие — ошибок.
Middleware
Чтобы не засорять пространство хэндлеров, в микросервисе предусмотрено использование сервисного функционала в стиле middleware (однако не совсем в классическом понимании гоферного миддлваре). К каждому такому сервису предъявляются минимальные требования: он должен принимать в качестве аргумента функцию, принимающую http.ResponseWriter, *http.Request и возвращать такую же функцию. В дистрибутиве продемонстрирован пример с подключением метрики для фиксации времени обработки запроса (duration).В зависимости от того, какие задачи решаются микросервисом и в каком окружении он это делает, почти наверняка вам потребуются и другие сервисы, например валидация. Рассмотрите для них возможность подключения к хэндлеру в качестве middleware. И обратите внимание, что демонстрационная метрика вынесена в отдельный подкаталог, чтобы подчеркнуть дистанцию между микросервисом и используемыми в нём middleware.
Handler
В дистрибутиве handler содержит в себе совсем мало кода. Однако именно его методы и являются теми хэндлерами, которые обработают поступивший запрос, всё остальное по сути обвес микросервиса. Если это так, то почему бы не сделать просто кучу автономных функций, которые и будет вызывать роутер? На это есть причина: благодаря объединению посредством структуры хэндлеры-методы теперь смогут иметь доступ (если потребуется) к полям структуры (общему контексту приложения). На самом деле очень удобно для каждого публичного метода (читай — обработчика) создать отдельный файл, например handle_hello_word.go, что впрочем не мешает организовать всё каким угодно другим образом.Создание нового хэндлера
Для этого нужно просто создать новый публичный метод в handler, который на вход принимает http.ResponseWriter, *http.Request. Посмотрите созданный для демонстрации метод HelloWorld.Perfomance
Для общего понимания того, что скорость работы микросервиса при использовании предложенной архитектуры будет достаточно высокой, приведу результаты бенчмарка, полученные мной на моём компьютере:- BenchmarkMain-2 10000000 195 ns/op
- BenchmarkMainParallel-2 10000000 107 ns/op
Зависимости
Любую из перечисленных библиотек можно заменить или дополнить, в данном случае они скорее призваны показать, в какую сторону развивать свой микросервис. Возможно, вам также полезно будет подключить логстеш и инфлюкс.Заключение
Библиотека Microservice не претендует на лавры единственно верного решения, но при случае, надеюсь, сможет помочь вам сформировать архитектуру собственного http-микросервиса, став прототипом будущего приложения.Ссылки
UPD
С учётом комментариев немного изменил библиотечку, удалив хранилище и подправив метод организации мидлваре (без очередей), что кстати, даже немного ускорило работу приложения в бенче.habr.com
Создание реальных приложений | React Js, Golang и RethinkDB
Практическое руководство, которое учит вас ReactJs, Golang и RethinkDB. Оптимально шагающий, без излишеств. Вы научитесь быстро! Вы хотите как можно быстрее изучить React? Вы интересуетесь Golang? Вам интересно как писать быстрые высококонкурентные серверы? Заинтересованы в создании реальных приложений? Если вы ответили «ДА», то этот курс для вас!
React
Reactjs - это потрясающая библиотека Javascript, созданная и поддерживаемая Facebook. Дизайнеры React подвергли сомнению отраслевые «лучшие практики» и разработали уникальную библиотеку, очень быструю и очень продуктивную, а также приятно работать. Reactjs делает приложения для JavaScript интересными.
Golang
Golang - это потрясающий новый язык программирования, созданный и поддерживаемый Google. Golang - это современный язык, который прост в освоении и прост в использовании. Golang особенно хорошо подходит для высококонкурентных приложений, таких как приложения реального времени, из-за того, что это первая поддержка языка для сопрограмм (goroutines). Приложения, созданные в Go, работают быстро и работают на всех основных платформах (Mac / Windows / Linux).
RethinkDB
RethinkDB - единственная база данных, которая ориентирована на функции реального времени. Использование RethinkDB позволяет создавать легко масштабируемые приложения реального времени. RethinkDB предлагает богатый набор функций, и с ним приятно работать.
«Но меня интересуют только React или Golang или RethinkDB ...»
Каждая из этих тем может стоять одна, поскольку это собственный курс. Просто подумайте о бонусном содержании!
Важны ли приложения реального времени?
Разработчикам программного обеспечения нужно будет знать, как создавать веб-приложения в реальном времени в ближайшем будущем. Это следующая эволюция в веб-приложениях, ведь приложения / функции Realtime уже создаются в таких компаниях, как Twitter, Facebook и Google.
Я не буду тратить ваше время, вы узнаете, что вам нужно знать как можно быстрее
Во время этого курса вы будете создавать Slack Clone.
coursehunters.net