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

SongButler - одно из приложений After Hours Solutions - фактически, на момент написания, единственное приложение (если вы еще не пробовали его, сейчас хорошее время для этого (https://songbutler.app ). Позвольте мне начать с того, что прямо сейчас скажу вам, что и целевая страница, и приложение обходятся нам в 0,00 доллара, но это не было исходной идеей.

Когда я только начал этот проект, у меня была цель: изучить Go. Я так и сделал. Но, ограничив мою цель этим, мы не особо задумывались о развертывании - мы решили, что просто развернем его на дешевом виртуальном сервере и покончим с этим. Ошибка новичка, а? Итак, проект был завершен примерно за неделю, и у нас был старый большой двоичный файл Go, почти без внешних библиотек и стандартный пакет net / http, обслуживающий все запросы. Я был этому рад! Но потом мне пришлось его развернуть, и тогда появилась (поздняя) идея бессерверной архитектуры.

Это не может быть так сложно, правда?

Бессерверная версия, даже если об этом запоздалая мысль, должна быть легкой (ну, я так думал). Мне просто нужно развернуть этот двоичный файл как AWS Lambda или что-то в этом роде и хорошо выспаться. (Неа.)

Прежде всего, у вас нет концепции веб-сервера, работающего и принимающего запросы, поэтому очистите все, что, как вы думаете, вы знаете об обработке HTTP-запросов и тому подобном. Бессерверная система состоит из функции (или ряда функций в проекте), которая принимает входные данные и что-то выдает (по крайней мере, обычно). О, и да, конечно, эта функция работает на сервере, так что отличная работа с именем serverless, кто бы ни подумал об этом. Это больше похоже на неуправляемый, поскольку единственное отличие состоит в том, что вам не нужно фактически управлять сервером. Но, сказав это, вы спросите, как я должен обрабатывать запросы? Что ж ... что-то делает это за тебя.

Будучи новичком в бессерверной среде, я выбрал то, что все используют (и больше подходит для Google…) - Amazon Web Services или AWS, как все это называют. Бессерверная функция в мире AWS называется лямбда-функцией, и на самом деле это не так уж важно. А лямбда-функция может запускаться в ответ на сигнал от чего-то, и это что-то может быть шлюзом, который в основном направляет HTTP-запросы. Идеально.

Вид.

У меня уже было отличное приложение со встроенной маршрутизацией. Это не совсем подходит для бессерверной модели. К счастью, я нашел небольшую красивую библиотеку, которую можно было использовать вместо библиотеки go net / http.

Вот точка входа в приложение раньше:

func main() {
	cfg := cmd.Init()

	http.HandleFunc("/slack/help", web.SlackSlashHelpHandler)
	(...)
	http.HandleFunc("/slack/webhook", web.SlackEventHandler)

	if err := http.ListenAndServe(fmt.Sprintf(":%d", cfg.Port), nil); err != nil {
		panic(err)
	}
}

А вот после:

func main() {
	cmd.Init()

	http.HandleFunc("/slack/help", web.SlackSlashHelpHandler)
	(...)
	http.HandleFunc("/slack/webhook", web.SlackEventHandler)

	gateway.ListenAndServe("", nil)
}

Не слишком разные, правда? И… это в основном работает. Проблема в том, что у нас все еще есть один двоичный файл, обслуживающий все. Конечно, он бессерверный, но я хотел, чтобы каждая конечная точка была разделена на отдельный двоичный файл. Думаю, мне следовало подумать об этом раньше, а? Вы не сможете добиться успеха, если не спланируете вещи соответствующим образом.

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

Есть некоторые вещи, о которых я не говорил в этом посте (например, как сгруппировать все в AWS, создание шлюза API и т. Д.), Но это немного выходит за рамки. Плюс в том, что бессерверные, на мой взгляд, хороший выбор для приложений, которые не выполняют много работы и не должны работать (обрабатывать данные) все время, только через регулярные промежутки времени или в ответ. на мероприятие. Соедините это с щедрым уровнем бесплатного пользования AWS, и вы получите бесплатный и надежный (в большинстве случаев) хостинг!