- Go 99.6%
- Dockerfile 0.4%
| .vscode | ||
| database | ||
| lib | ||
| rest | ||
| server | ||
| .dockerignore | ||
| .drone.yml | ||
| .gitignore | ||
| debug-stack.yml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| Dockerfile.amd64 | ||
| Dockerfile.arm64 | ||
| go.mod | ||
| go.sum | ||
| main.go | ||
| path_test.go | ||
| README.md | ||
Сборка
Подготовка пакетов
apt install protobuf-compiler
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
protoc --go_out=. ./protobuf/*
go get
Подготовка файлов
protoc --go_out=. ./protobuf/*
Функции
Добавление роутинга для функции
Обслуживающая функция - setRoute
Формат запроса:
{
"<domain>": {
"<method>"{
"<path>": "<module_name.function_name>"
}
}
}
Формат ответа:
{
"<domain>": {
"<method>": {
"<path>": true|false
}
}
}
Получение информации о роуте для функции
Обслуживающая функция - getRoute
Формат запроса:
{
"<domain>": {
"<method>": "<path>"
}
}
Формат ответа:
{
"<domain>": {
"<method>"{
"<path>": "<function_name>"
}
}
}
Добавление роутинга для статичного файла
Обслуживающая функция - setRouteStatic
Формат запроса:
{
"<domain>": {
"<path>": {
"contentType": "<content type>",
"content": base64"<content>"
}
}
}
Формат ответа:
{
"<domain>": {
"<path>": true|false
}
}
Поучение статичного файла для роутинга
Обслуживающая функция - getRouteStatic
Формат запроса:
{
"<domain>": ["<path>"]
}
Формат ответа:
{
"<domain>": {
"<path>": {
"contentType": "<content type>",
"content": base64"<content>"
}
}
}
Добавление роутинга для проксирования (revers-proxy)
Обслуживающая функция - setRouteProxy
Формат запроса:
{
"<domain>": {
"<path>": "<full url>"
}
}
Формат ответа:
{
"<domain>": {
"<path>": true|false
}
}
Получение правила для проксирования (reverse-proxy)
Обслуживающая функция - getRouteProxy
Формат запроса:
{
"<domain>": ["<path>"]
}
Формат ответа:
{
"<domain>": {
"<path>": "<full url>"
}
}
Удаление роута
Данная функция удаляет роут полностью не зависимо от того установлена ли функция(и) (GET, POST, PUT и т.д.), правило проксирования, статичного контента и т.д.
Обслуживающая функция - removeRoute
Формат запроса:
{
"<domain>": ["<path>"]
}
Формат ответа:
{
"<domain>": {
"<path>": true|false
}
}
Content-Encoding
Сревер должен поддерживать следующие алгоритмы сжатия статичного и динамичного контента:
- gzip
- deflate
- br (brotli)
- uncompressed (несжатый)
Статичный контент
Статичные файлы заранее подготавливаются. При получения данных сжатие происходит во все возможные варианты с максимальной степенью компрессии и сохраняются в памяти с установленным лимитом хранения (TTL). По истечению времени файлы сбрасываются на диск и там храняться. В случае запроса отсутствующего файла (с определенным алгоритмом сжатия) файл загружается с диска в память и снова устанавливается TTL.
Ко всему прочему TTL обновляется каждый раз при запросе к файлу.
Динамический контент
Динамические данные (из вызванных функций, проксирования и т.д.) не кэшируются (даже дляя GET-запросов). Такие данные сжимаются "на лету" любым из доступных алгоритмов (либо отправляются в несжатом виде). Степень компрессии устанавливается в соответствии с быстродействием системы (вибирается пользователем).
Если данные уже получены в сжатом виде (проксированный запрос, редирективный запрос (перезапрос)), то данные не пересжимаются и отдаются потоком как есть.
Проверка валидности Access-токена (jwt)
Данная функция может устанавливать параметр если нужно проверить присутствия пользователя на уровне web-шлюза без массового запроса из других функций и модулей системы.
Обслуживающая функция - setVerifyAccess
Формат запроса:
{
"<domain>": ["<path>"]
}
Формат ответа:
{
"domain": {
"<path>": true|false
}
}
Обслуживающая функция - removeVerifyAccess
Формат запроса:
{
"<domain>": ["<path>"]
}
Формат ответа:
{
"domain": {
"<path>": true|false
}
}
Выполнение перезапроса в зависимости от ответа
В случае, если в заголовке ответа установлен параметр Direct-Response, то необходимо выполнить http-запрос по указанному значению с типом запроса GET и, не разрывая соединения с клиентом, вернуть ответ с данными.
В редирективный запрос заголовок Content-Type (собственно как и все остальные заголовки) передаются напрямую, которые были остановлены клиентом при запросе.
Переменные окружения
NATS_ADDR
Адрес сервера Nats. По умолчанию nats://localhost:4222
WEB_PORT
WEB-порт. По умолчанию 3000
QUEUE_LOG
Имя очереди отправки логов. По умолчанию не задано
Параметры в базе настроек
gateway.http.maxRequestBodySize
Максимальный размер запроса. По умолчанию 4194304 байт (4 мегабайта)
Принцип работы
При запросе парсятся заголовки и параметры. Каждый параметр и заголовок раскладываются по своим значениям в header.
Рабочая нагрузка
Если при запросе POST, PUT и так далее, размер данных превышает 1МБ, то такие данные запроса записываются в S3-хранилище и передается сквозная ссылка в запросе.
Если это MultipartForm и в ней присутсвтуют файл(ы), то файлы, превышающие размер 64КБ по отдельности записываются в S3-хранилище и передается уже сквозная ссылка.