No description
  • Go 99.6%
  • Dockerfile 0.4%
Find a file
2023-08-09 20:22:20 +03:00
.vscode Шаблон стека для отладки 2023-08-09 20:22:20 +03:00
database Шаблон стека для отладки 2023-08-09 20:22:20 +03:00
lib Release compress and decompress static 2022-11-02 20:51:38 +03:00
rest Release load static content after start server 2022-11-22 20:57:58 +03:00
server Обнуление данных если передача через s3 2023-04-04 09:02:49 +03:00
.dockerignore Шаблон стека для отладки 2023-08-09 20:22:20 +03:00
.drone.yml Fix CI/CD 2023-03-23 18:54:00 +03:00
.gitignore Шаблон стека для отладки 2023-08-09 20:22:20 +03:00
debug-stack.yml Шаблон стека для отладки 2023-08-09 20:22:20 +03:00
docker-compose.yml Add routing with parameters in path URI 2022-10-26 18:13:59 +03:00
Dockerfile Шаблон стека для отладки 2023-08-09 20:22:20 +03:00
Dockerfile.amd64 Шаблон стека для отладки 2023-08-09 20:22:20 +03:00
Dockerfile.arm64 Шаблон стека для отладки 2023-08-09 20:22:20 +03:00
go.mod Update Dockerfile image 2023-03-31 08:22:07 +03:00
go.sum Fix payload for s3uri 2023-03-28 16:10:23 +03:00
main.go Add logger 2022-12-03 11:50:02 +03:00
path_test.go Add logger 2022-12-03 11:50:02 +03:00
README.md Update maxRequestBodySize 2023-03-30 20:10:05 +03:00

Сборка

Подготовка пакетов

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-хранилище и передается уже сквозная ссылка.