Intro Microservice with GO
Negli ultimi anni, i microservizi sono diventati un modo popolare per progettare sistemi software grazie alla loro scalabilità e flessibilità.
Scrivere questi servizi in Go con Docker può renderli ancora più potenti poiche' in maniera facile e' possibile per gli sviluppatori impacchettare, distribuire e gestire i propri microservizi con il minimo sforzo.
Ho scelto Go per la scrittura di microservizi per via della sua popolarita' crescente e della sintassi semplice e all'ampio supporto di librerie interne ed esterne che ne permettono la sua estensione e apertura a nuove funzionalita'.
In questa serie di articoli mettero' giu' gli appunti presi seguendo l'ottimo corso su Udemy Working with microservices in go di Trevor Sawler, che ci aiuteranno ad esplorare le basi della scrittura di microservizi in Go utilizzando Docker.
L'idea e' quella di fare un po' di laboratorio e test quindi ad ora lo scenario finale che ho in mente e' questo:
- Frontend (basilare per testare le routes dei microservizi)
- Broker (che fa da orchestratore delle chiamate)
- Authenticator (microservizio per l'autenticazione)
- GPRC (test di gprc sotto go)
Come prima cosa andiamo a installare Docker seguendo le istruzioni del sito principale e prepariamoci un ambiente di lavoro dentro Visual Studio Code.
Come prima cosa andiamo a crearci uno scheletro per il nostro frontend che poi mano a mano andremo a popolare con le funzioni di test per i vari microservizi.
Il frontend per il laboratorio sara' molto scarno ed utilizzera' "gin" per la parte di routing e servizio rete e fara' il rendering di file con sintassi Go Template
Quindi creiamo la cartella frontend, inizializziamola e creiamo i primi files:
mkdir web
go mod init web
Ora andiamo a creare, come nostra prassi, la cartella cmd e dentro il nostro main.go
mkdir cmd
touch cmd/main.go
Ora andiamo a creare la cartella per i nostri controller
mkdir -p cmd/controller
touch cmd/controller/homepage.go
Andiamo a prepararci anche le cartelle per la parte statica e per i templates, le viste e le componenti della nostra pagina
mkdir -p templates/{homepage,views,layouts}
mkdir -p static/{css,img,vendor}
mkdir -p static/vendor/{bootstrap,fontawesome,jquery}
Creiamo il nostro template per la pagina, l'ordine di rendering e'
flowchart LR
Layout --> View --> Component
Dove Layout e' la cartella che contiene le pagine di cui andremo a fare il rendering, la nostra in questo caso e' /templates/layouts/index.html
{{ define "views/index.html"}}
<!--index.html-->
<!--Load header-->
{{ template "layouts/header.html" .}}
<!--Load Components-->
{{ template "homepage/master_header.html" .}}
{{ template "homepage/homepage_scripts.html" .}}
<!--Load footer-->
{{ template "layouts/footer.html" .}}
{{ end }}
Nella View sono contenute le strutture comuni a piu' pagine, nel nostro caso:
templates/views/header.html
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>Docker Microservice LAB</title>
<!-- Bootstrap core CSS -->
<link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<!-- Custom fonts for this template -->
<link href="vendor/fontawesome/css/all.min.css" rel="stylesheet">
</head>
<body>
<title>{{ .title }}</title>
{{ end }}
templates/views/footer.html
{{ define "layouts/footer.html"}}
<!-- Footer -->
<div class="container">
<div class="row">
<div class="col text-center">
<hr>
<small class="text-muted">Copyright © Stanzinofree.net</small>
</div>
</div>
</div>
<!-- Bootstrap core JavaScript -->
<script src="vendor/jquery/jquery.min.js"></script>
<script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="vendor/fontawesome/js/all.min.js"></script>
</body>
</html>
{{ end }}
In Components invece andremo a caricare le componenti delle nostre pagine, nel nostro caso
templates/homepage/master_header.go
{{ define "homepage/master_header.html" }}
<div class="container">
<div class="row">
<div class="col">
<h1 class="mt-5">Test microservices</h1>
<hr>
<div id="output" class="mt-5" style="outline: 1px solid silver; padding: 2em;">
<span class="text-muted">Qui andra' l'output</span>
</div>
</div>
</div>
<div class="row">
<div class="col">
<h4 class="mt-5">Inviati</h4>
<div class="mt-1" style="outline: 1px solid silver; padding: 2em;">
<pre id="payload"><span class="text-muted">Dati inviati</span></pre>
</div>
</div>
<div class="col">
<h4 class="mt-5">Ricevuti</h4>
<div class="mt-1" style="outline: 1px solid silver; padding: 2em;">
<pre id="received"><span class="text-muted">Dati ricevuti</span></pre>
</div>
</div>
</div>
</div>
{{ end }}
Nelle cartelle vendor andremo a caricare i relativi file delle librerie usate: Bootstrap, FontAwesome e Jquery nel repository ci sara' tutto quanto.
Andiamo quindi a vedere il nostro file cmd/controller/homepage.go che contiene il nostro controller
package controller
import (
"net/http"
"github.com/gin-gonic/gin"
)
// Definiamo la rotta principale che a / associa index
func Router(r *gin.Engine) {
r.GET("/", index)
}
// Definiamo index come render di views/index.html
func index(c *gin.Context) {
c.HTML(
http.StatusOK,
"views/index.html",
gin.H{
"title": "Docker Microservice LAB",
},
)
}
Ora andiamo a vedere il codice del file cmd/main.go che importera' il controller sopra
package main
import (
"github.com/gin-gonic/gin"
"log"
"web/cmd/controller"
)
func main() {
// Inizializiamo Gin
r := gin.New()
r.Use(gin.Logger())
r.Use(gin.Recovery())
// Definiamo le rotte statiche vendor e favicon (il nostro splendido Capibara XD)
r.Static("/vendor", "./static/vendor")
r.StaticFile("/favicon.ico", "./static/img/favicon.ico")
// Andiamo a definire la cartella templates in tutte le sue parti
r.LoadHTMLGlob("templates/**/*")
// Configuriamo il routing utilizzando il controller importato
controller.Router(r)
log.Println("Server started")
r.Run() // Avvia il server sulla porta standard di gin 8080
}
Il Repo del laboratorio e' qui su Bitbucket
E qui possiamo vedere il sito online con il comando
go run cmd/main.go