express.lua – создание веб приложений на Lua
🌕 express.lua это самый детализированный порт оригинального express.js, написанный на Lua. Пока кто-то не докажет обратного.
По сути, lua-express
это минималистичный web фреймворк с почти полной совместимостью API с express.js
, позволяющий создавать веб приложения на чистом Lua.
- express.js
- express.lua
const express = require("express")
const app = express()
app.get("/", function(req, res) {
res.send("Hello World")
})
app.listen(3000)
local express = require("express")
local app = express()
app:get("/", function(req, res)
res:send("Hello World")
end)
app:listen(3000)
Изначально идея создания этого порта появилась из-за желания отделить API одного сервиса с монолитного PHP приложения в отдельный микросервис, чтобы при атаках его было проще масштабировать.
Сейчас цель достигнута – express.lua работает в продакшене, API сервиса переписан и прямо сейчас успешно обрабатывает запросы, причем также асинхронно работая с mysql и redis (покликайте) без каких-либо крупных зависимостей, используя только copas и luasocket для асинхронности и связи с базами данных соответственно. Раньше такого в "чистом" Lua еще никто не делал. Решений просто не существовало.
Немного бекстейджа
На первую рабочую версию lua-express ушло несколько недель, несмотря на небольшую базу кода. Дело в том, что express.js построен на базе nodejs, но у Lua полноценного И МИНИМАЛИСТИЧНОГО nodejs (по сути, встроенного веб сервера) просто не существовало.
Второй глобальной проблемой являлось то, что Lua привыкли рассматривать, как что-то, где асинхронности не существует, что означало бы, что один медленный запрос остановил бы все последующие. Поэтому перед созданием порта пришлось очень плотно изучить как делать штуки в lua "асинхронными". В кавычках, потому что Lua все же однопоточный ЯП, поэтому вместо настоящей асинхронности мы имеем крутой хак с сокетами и корутинами. Думаю, что на самом деле в JS все устроено так же, только Lua показал себя более производительным в бенчмарках на одинаковых задачах*.
* к сожалению, не в вопросах работы с сокетами
🤔 В итоге, что мы сейчас имеем?
Действительно полноценный express.js прямо в Lua, который работает, работает хорошо, работает на более простом (имхо), но производительном Lua, он не требует никаких openresty зависимостей, легко встраивается в любое готовое приложение (например, в телеграм боты, написанные на lua)
🌈 Преимущества:
- Не требует больших зависимостей. Например, lapis требует целый openresty.
- За основу взят express.js, который известен по всему миру своей простотой, гибкостью и производительностью.
- Для тех, кто работал с express.js будет очень легко понять и перейти на express.lua – API почти на 100% идентичен.
- Все входящие запросы можно обрабатывать асинхронно (non-blocking), использая copas. Это тысячи запросов в секунду.
- Легко встраивать в скрипты и приложения любой сложности. lua-express легенький и из "сложного" требует только luasocket.
- Прошел проверку боем. Используется в реальном приложении и приносит счастье.