Skip to content

Payel-git-ol/azure

Repository files navigation

Azure Framework

Сверхбыстрый HTTP-фреймворк на Go с использованием ultrahttp движка.

Особенности

  • 🚀 0 аллокаций в горячем пути
  • ♻️ sync.Pool для переиспользования контекстов
  • Zero-copy операции с памятью
  • 🔥 Собственный TCP стек - не использует net/http
  • 📦 Keep-Alive поддержка из коробки
  • 🎯 Radix tree роутер для быстрого поиска маршрутов

Установка

go get github.com/golang/azure

Быстрый старт

package main

import (
	"github.com/Payel-git-ol/azure"
)

type User struct {
	Name  string `json:"name"`
	Email string `json:"email"`
	Age   int    `json:"age"`
}

func main() {
	a := azure.Defoult

	// GET маршрут с JSON ответом
	a.Get("/", func(c *azure.Context) {
		c.Json(azure.M{
			"message": "Hello World!",
			"status":  "ok",
		})
	})

	// POST с BindJSON
	a.Post("/user", func(c *azure.Context) {
		var user User
		
		// Быстрый парсинг JSON
		if err := c.BindJSON(&user); err != nil {
			c.SetStatus(400, "Bad Request")
			c.Json(azure.M{"error": err.Error()})
			return
		}
		
		// Отправляем со статусом 201
		c.JsonStatus(azure.StatusCreated, azure.M{"user": user})
	})

	// 404 Not Found
	a.Get("/not-found", func(c *azure.Context) {
		c.JsonStatus(azure.StatusNotFound, azure.M{
			"error": "Not found",
		})
	})

	// HTML страница
	a.Get("/page", func(c *azure.Context) {
		c.Html(`<!DOCTYPE html>
<html>
<head><title>My Page</title></head>
<body><h1>Hello World!</h1></body>
</html>`)
	})

	// HTML со статусом
	a.Get("/error-page", func(c *azure.Context) {
		c.HtmlStatus(500, `<!DOCTYPE html>
<html><body><h1>Server Error</h1></body></html>`)
	})

	// Запуск сервера
	a.Run(":8080")
}

API

Основные методы

Метод Описание
Get(path, handler) Регистрация GET маршрута
Post(path, handler) Регистрация POST маршрута
Put(path, handler) Регистрация PUT маршрута
Delete(path, handler) Регистрация DELETE маршрута
Patch(path, handler) Регистрация PATCH маршрута
Run(port) Запуск сервера
Use(middleware) Добавить middleware
Group(prefix) Создать группу маршрутов

Контекст

Метод Описание
c.Json(data) Отправить JSON ответ (200 OK)
c.JsonStatus(code, data) Отправить JSON со статусом
c.Html(html) Отправить HTML ответ
c.HtmlStatus(code, html) Отправить HTML со статусом
c.Send(bytes) Отправить байты
c.SetStatus(code, text) Установить HTTP статус
c.BindJSON(&struct) Парсить JSON из тела
c.GetBody() Получить тело запроса
c.GetHeader(key) Получить заголовок
c.SetHeader(key, value) Установить заголовок
c.SetCookie(name, value) Установить cookie
c.GetCookie(name) Получить cookie
c.GetQueryParam(key) Получить query параметр
c.Param(key) Получить параметр пути

Статусы

azure.StatusOK           // 200
azure.StatusCreated      // 201
azure.StatusNoContent    // 204
azure.StatusBadRequest   // 400
azure.StatusNotFound     // 404
azure.StatusInternalServerError // 500

HTTP Клиент

// GET запрос (возвращает []byte)
resp, err := azure.Get("https://api.example.com/users")

// GET запрос (возвращает string)
resp, err := azure.GetString("https://api.example.com/users")

// POST запрос с JSON (возвращает []byte)
resp, err := azure.Post("https://api.example.com/users", azure.M{
    "name":  "John",
    "email": "john@example.com",
})

// POST запрос с JSON (возвращает string)
resp, err := azure.PostString("https://api.example.com/users", azure.M{
    "name": "John",
})

// Кастомный запрос (возвращает []byte)
resp, err := azure.Do("PUT", "https://api.example.com/users/1", 
    []byte(`{"name":"Jane"}`),
    map[string]string{
        "Authorization": "Bearer token123",
        "Content-Type":  "application/json",
    })

// Кастомный запрос (возвращает string)
resp, err := azure.DoString("PUT", "https://api.example.com/users/1", 
    []byte(`{"name":"Jane"}`), nil)

// Свой клиент
client := azure.NewHTTPClient(10 * time.Second)
resp, err := client.GetString("https://api.example.com/data")

Middleware

// Logger
a.Use(azure.Logger())

// Recovery от паник
a.Use(azure.Recovery())

// Metrics (сбор метрик Prometheus)
azure.UseMetrics(a)

// Свой middleware
a.Use(func(c *azure.Context, next ultrahttp.RouteHandler) {
	// Логика до
	next(c.ultra)
	// Логика после
})

Метрики

Для включения сбора метрик добавь:

a := azure.Defoult
azure.UseMetrics(a)  // Включает сбор метрик

// Метрики доступны по /metrics
a.Run(":8080")

Пример вывода метрик:

curl http://localhost:8080/metrics

Программный доступ к метрикам:

stats := azure.GetMetrics()
fmt.Printf("Requests: %d\n", stats["requests"])
fmt.Printf("Errors: %d\n", stats["errors"])
fmt.Printf("Avg duration: %.2f ms\n", stats["avg_duration_ms"])

Группы маршрутов

api := a.Group("/api")

api.Get("/v1/status", func(c *azure.Context) {
	c.Json(azure.M{"status": "ok"})
})

api.Post("/v1/data", func(c *azure.Context) {
	c.SetStatus(201, "Created")
	c.Json(azure.M{"message": "Data received"})
})

Бенчмарки

Тест Azure Gin Fiber FastHTTP
GET / 121ms 176ms 101ms 112ms
POST /echo 1KB 110ms 🏆 142ms 129ms 144ms
GET /user/:id 155ms 🏆 178ms 194ms 223ms

Azure быстрее Gin на 28-74% и сравним с Fiber/FastHTTP!

Структура проекта

azure/
├── azure.go          # Ядро фреймворка
├── context.go        # Контекст запроса
├── group.go          # Группы маршрутов
├── types.go          # Типы (M map)
└── ultrahttp/        # HTTP движок
    ├── server.go     # TCP сервер
    ├── router.go     # Radix tree роутер
    ├── context.go    # Контекст ultrahttp
    └── adapter.go    # Адаптеры

Лицензия

MIT

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages