Budowa mikroserwisów w Go przy pomocy pakietu Gin
Kiedyś programiści tworzyli aplikacje w chmurze w oparciu o architekturę monolityczną. Architektura ta osadza całą logikę aplikacji w jednym procesie oraz zakłada uruchomienie jej na jednym serwerze. Podejście to tworzy wyzwania związane ze skalowaniem i utrzymaniem dla backendu nowoczesnych aplikacji sieci webowych.
Obecnie większość programistów stosuje architekturę mikroserwisów, aby uniknąć powyższych problemów. Jednym ze sposobów, w jaki możemy zastosować mikroserwisy jest użycie Go, szybkiego, ogólnego i przyjaznego języka programowania.
W tym przykładzie użyję pakietu Gin, który oferuje wszystkie funkcjonalności potrzebne do budowania nowoczesnego REST-owego mikroserwisu. W tym przykładzie wyjaśnię jak budować mikroserwis w Go używając frameworku Gin.
Wyróżnione cechy Gin
Gin jest w pełni funkcjonalnym, wydajnym webowym frameworkiem HTTP dla ekosystemu Go. Staje się coraz bardziej popularny w środowisku programistów go ze względu na swoją funkcjonalność.
Wydajność
Gin przychodzi z bardzo szybką i lekką biblioteką outingu HTTP (patrz benchmark).
Gin wykorzystuje lekką bibliotekę HTTPRouter multipleksującą, która wykorzystuje szybkie algorytmy routingu opartym na drzewie Radix.
Elastyczne, rozszerzalne i przyjazne dla programistów API
System Gin middleware pozwala na dowolne rozszerzanie frameworku. Pozwala też dostosować instancje serwera HTTP na własne potrzeby. Gin jest dostarczany z wydajnym API z funkcjami takimi jak grupowanie tras, bindowanie struktur, wbudowane validatory itp.
Inne wbudowane funkcjonalności
- XML/JSON/YAML/ProtoBuf rendering,
- zarządzanie błędami i logami,
- walidacja JSON,
- Pliki statyczne.
Gin vs inne popularne pakiety
Gin oferuje konkurencyjną szybką implementację outingu HTTP. Gin jest szybszy niż inne popularne biblioteki outingu i frameworki webowe. Jest cały czas utrzymywany przez środowisko open source, jest dobrze przetestowany.
Można by użyć wbudowanego pakietu Go net/http do do budowania mikro serwisów, ale nie oferuje on sparametryzowanego outingu. Można użyć Gorilla Mux jako biblioteki outingu, ale nie jest to w pełni funkcjonalny framerork taki jak Gin. Gorilla Mux nie oferuje renderowania danych, bindowania i walidacji JSON.
Gin oferuje gotowy middlware dla CROS, timeout, caching, autentykacja i zarządzanie sesjami.
Początki z Gin
Stwórzmy prosty mikro serwis. Pierwszym krokiem będzie ustawienie środowiska.
Potrzebny będzie Go w wersji nie niższej niż 13 do pobrania ze strony.
Teraz musimy stworzyć strukturę projektu.
mkdir service
cd service
go mod init service
Potem pobieramy Gin
go get -u github.com/gin-gonic/gin
Budujemy mikro serwis
Tworzymy plik main
touch main.go
Wklejamy zawartość
1 package main
2 import (
3 "runtime"
4 "github.com/gin-gonic/gin"
5 )
6 func main() {
7 router := gin.Default()
8 router.GET("/hello", func(c *gin.Context) {
9 c.JSON(200, gin.H{
10 "message": "Hello World!",
11 })
12 })
13
14 router.GET("/os", func(c *gin.Context) {
15 c.String(200, time.Now().Format(time.RFC850))
16 })
17 router.Run(":5000")
18 }
Powyższy kod definiuje dwa endpointy HTTP GET :
- /hello
- /time
Endpoint /hello zwraca komunikat jak nie trudno się domyślić "Hello World" w formacie JSON.
Endpoint /time zwraca czas systemu operacyjnego w formacie zdefiniowanym w RFC850.
Po zdefiniowaniu endpointów oraz handlerów musimy utuchomić serwer HTTP za pomocą funkcji Run(). Teraz przyszła kolej na umuchomienie naszego serwisu komendą:
go run main.go
Jeśli operacje się udała powinniśmy zobaczyć komunikat:
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /hello --> main.main.func1 (3 handlers)
[GIN-debug] GET /os --> main.main.func2 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :5000
Testowanie
W przeglądarce wpisujemy:
http://localhost:5000/hello
otrzymamy:
po wpisaniu w przeglądarkę
http://localhost:5000/time
otrzymujemy: