Начнем с gin.
Установка:
go get -u github.com/gin-gonic/gin
Документацию по API можно найти на godoc.org
Gin позиционирует себя как самый быстрый веб-фреймворк, который можно использовать для построения веб-приложений
и сервисов. В нем реализована нестандартная маршрутизация, которая отсутсвует в станданртной библиотеке net/http.
Схема, по которой происходит обработка запроса в gin, выглядит следующим образом
Первым делом мы парсим запрос и проверяем, есть ли данный путь в таблице маршрутов, и если есть, то вызывает для него обработчик.
Далее, чтобы не быть голословным, мы рассмотри конкретное веб-приложение, которое можно забрать отсюда:
gin app
Оно представляет из себя менеджер статей и имеет следующий функционал:
заводит пользователей, позволяет им создавать статьи, выводит список статей, а также отдельную статью.
Каждая статья к тому же доступна в любом из трех форматов - HTML, JSON, XML.
На примере этого приложения рассмотрим, как реализованы маршрутизация, рендер и аутентификация.
Маршрутизация используется для обработки запросов, приходящих на определенный урл.
В gin используется быстрый маршрутизатор, который легко настраивается.
Для маршрутизации можно использовать шаблоны и разбивать урлы по группам.
Главная страница, как обычно, обслуживается из корня.
Пользовательские страницы будут обслуживаться (get, post) с префиксом u:
/u/login
/u/logout
/u/register
Урлы, обслуживающие запросы для статей, будут с префиксом article:
/article/create
/article/view/:article_id
Обработка запроса в go может быть реализована в различные моменты его жизни, как в начале, так и в конце,
например для аутентификации или валидации. В этом приложении работа со статьями разрешена только авторизованным
пользователям.
Веб-страницы используют html шаблоны. Здесь есть отдельные шаблоны для хидера, футера, меню, авторизации и т.д.
Поддерживается вложенность шаблонов.
Основной шаблон - index.html - выглядит следующим образом:
В следующем примере разберем, как в связке с nginx сделать балансировку нагрузки между
двумя экземплярами приложения, написанного на echo.
Сначала нужно настроить конфигурацию nginx:
upstream localhost {
server localhost:8081;
server localhost:8082;
}
server {
listen 8080;
server_name localhost;
access_log /var/log/nginx/localhost.access.log combined;
location / {
proxy_pass http://localhost;
}
}
Перезапускаем nginx и убеждаемся, что все работает:
service nginx restart
Запускаем два экземпляра нашего приложения (код ниже):
go run server.go server1 :8081
go run server.go server2 :8082
Если мы откроем адрес https://localhost:8080, то увидим либо- либо:
Hello from upstream server server1
Код приложения - для простоты забиваем шаблон прямо сюда:
package main
import (
"fmt"
"net/http"
"os"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
)
var index = `
< !DOCTYPE html>
< html lang="en">
< head>
< meta charset="UTF-8">
< meta name="viewport" content="width=device-width, initial-scale=1.0">
< meta http-equiv="X-UA-Compatible" content="ie=edge">
< title>Upstream Server< /title>
< style>
h1, p {
font-weight: 300;
}
< /style>
< /head>
< body>
< p>
Hello from upstream server %s
< /p>
< /body>
< /html>
`
func main() {
name := os.Args[1]
port := os.Args[2]
e := echo.New()
e.Use(middleware.Recover())
e.Use(middleware.Logger())
e.GET("/", func(c echo.Context) error {
return c.HTML(http.StatusOK, fmt.Sprintf(index, name))
})
e.Logger.Fatal(e.Start(port))
}