14.04.20223 min

Witold KnapekGolang DeveloperTransition Technologies PSC S.A.

Budowa mikroserwisów w Go przy pomocy pakietu Gin

Poznaj zalety Go z pakietem Gin, który oferuje wszystkie funkcjonalności potrzebne do budowania nowoczesnego REST-owego mikroserwisu.

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:

<p>Loading...</p>