Hero Image

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 &copy; 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

micro_frontend_01.webp

Other Related Posts:

KREDS Intro

KREDS Intro

KREDS (prossimamente spiegherò l’origine del nome) è un ecosistema nato per impratichirmi nell’arte del coding in GO e per realizzare il mio grande side project, il mio secondo cervello che mi aiuti ad automatizzare tutta la mia vita togliendomi il peso delle attività ripetitive e di scouting mattu...

30th Dec 2023
Logical volume

Logical volume

Dopo aver visto Volume Group e Physical Volume oggi andiamo prendere dimestichezza con i Logical Volume

Comandi Base

lvs

Mostra l'output compresso dei Logical Volume disponibili nel sistema da cui si vede
lvs

Se volessimo invece vedere le informazioni piu' dettagliate dovremmo dare il c...

30th Nov 2022