Il servizio di bilanciamento e distribuzione del traffico tra applicazioni è gestito dal servizio Ellastic Load Balancing e mette a disposizione quattro tipi di bilanciamento:
- Application Load Balancer: il tipo più usato perchè è il bilancamento viene eseguito a livelli 7 cioè a livello di protocollo HTTP o di altro tipo applicativo
- Network Load Balancer: il tipo di bilanciamento a livello 4 cioè usando il protocollo TPC o UDP
- Gateway Load Balancer: il tipo di bilanciamento a livello 3 cioè usando il solo protocollo IP
- Classic Load Balancer: il tipo originale di AWS, considerato deprecato in quanto sostituito con i precedenti
In fase di creazione di un bilanciatore si devono selezionare i parametri
- il tipo (application, network oppure gateway)
- esposizione internet, nel caso venga abilitata sarà creata un nome con il quale è possibile accedervi da internet
- VPN, subnet e AZ, infatti è possibile posizionare il bilanciatore nelle subnet private ma con la precedente regola avere un entry-point pubblico
- security group per regolare il traffico in ingresso ed in uscita
- l’eventuale AutoScaling group e il “target group” se presenti
Il servizio è molto usato sia per creare degli entry-point pubblici a risorse private ed è studiato proprio per integratsi con il servizio di AutoScaling e creare un unico enpoint per tutte le istanze appartenenti ad un gruppo creato con il servizio di AutoScaling e poi gestite come “target group” dal servizio.
Il bilanciatore crea una “specie” di Firewall e proxy con i quale è possibile regolare alcune regole di rete tra cui il protocollo SSL/TLS, regole di redirect anche se è sempre consigliato usare un WAF come strumento per le regole di traffico di rete. I costi del servizio variano dal tipo e dalla region di appartenenza, per esempio l’Application in Irlanda costa 0,0252 USD per ora, bisogna comunque sempre monitorare i costi, le varie tariffe sono disponibili nella pagina ufficiale.
Attvare SASS in un progetto React è molto più semplice di quanto si possa sembrare, è come se avessero pensato tutta la libreia in modo che possa funzionare perfettamente con SASS.
Prima di tutto bisogna installare la libreria nel progetto
npm i sass
Dopo di che basta creare un file con estensione “scss”, in questo file si può giocare a piacimento, per esempio definire una variabile base e poi usarla nel file
$primaryColor: white;
...
.sidebar-brand-icon {
color: $primaryColor;
}
A questo punto basta andare nel file index.html ed importare il modulo
import './index.scss';
Ovviamente questo è un esempio che semplifica molto l’uso di SASS nelle librerie javascript, infatti è possibile poi integrarsi con altre librerie installate come Ionic come spiegato in un futuro articolo.
Il servizio di Autoscaling delle EC2 di AWS permette di monitorare il numero di istanze applicative regolando automaticamente l’aumento o la diminuzione in base a dei criteri prefissati. Il caso d’uso più diffuso e usato è la creazione di una immagine AMI e poi l’avvio di più istanze EC2, il numero di istanze viene regolato da una regola di scalabilità in base alla CPU o altre metriche.
In fase di creazione da console si deve selezionare:
- il nome che permetterà di identificare il gruppo anche nella vista EC2: le istanze appartanenti ad un gruppo ottengono il tag di quel gruppo
- la regola di “launch configuration” con la quale si gestire la regola di creazione delle istanze
- la VPC e le AZ associate se sono disponibili subnet
- il load balancer associato a questo gruppo per permettere l’accesso e il bilanciamento, è possibile non selezionare nulla
- la verifica di “health check”, cioè la regola che verifica il corretto funzionamento delle istanze, in quanto eventuali istanze con problemi vengono distrutte e vengono sostituite
- le dimensioni del gruppo con l’impostazione del numero minimo, massimo e il desiderato
- eventuali notifiche in caso di modifica del gruppo tramite il servizio SNS
Da notare che in fase di creazione non vengono richieste alcune proprietà importanti che devono essere impostate nel “launch configuration”, per esempio
- la immagine AMI ufficiale o una AMI gestita e creata dall’utente nello store
- il tipo di istanze in quanto all’interno di gruppo tutte le istanze devono avere la stessa dimensione
- la chiave “key pair” gestita da KMS per permette la connessione remota
- il security group che verrà assegnato ad ogni istanza (da notare che senza regole specifiche le istanze non potranno comunicare tra di loro)
Nel dettaglio di un gruppo è possibile gestire
- gli eventi passati del gruppo con uno storico dettagliato
- le regole di scalabilità automatica
- gestione delle singole istanze con i dettagli
- la procedura di refresh di tutte le istanze
La documentazione ufficiale è molto dettagliata visto che questo è uno dei servizi più usati. Il servizio è gratuito ma bisogna sempre ricordare che tutte le istanze EC2 sottostanti sono ovviamente a pagamento quindi bisogna sempre prestare attenzione.
Partendo da un requisito molto semplice come “un servizio che esegua la divisione di due numeri”, si può pensare di eseguire questa mini analisi: prevedere la creazione di una metodo statico in Java che esegue la divisione di due numeri reali, il ritorno deve essere reale, per numeri reali si intende il tipo Double di java, bisogna prevedere anche il caso particolare: se il divisore è zero bisogna lanciare una exception java.
Da questa analisi si può pensare di scrivere due test: un primo metodo per verificare la divisione corretta, un secondo metodo per verificare che venga “lanciata” una exeption java in caso di dividendo zero. Ogni metodo deve avete la annotation Test e nel codice di esempio si descrivono i tre componenti Arrange, Act e Assert.
@Test
public void dividiNormale(){
//1) Arrange: la definizione di tutti i dati di partenza
Double dividendo=new Double(5.0);
Double divisore=new Double(2.0);
Double resultAtteso=new Double(2.5);
//2) Act: la chiamata alla operazione da testare
Double result=App.dividi(dividendo, divisore);
//3) Assert: la risposta del passo 2 VS quanto definito nel punto 1
assertEquals(resultAtteso,result);
}
@Test
public void dividiPerZero(){
//1) Arrange: la definizione di tutti i dati di partenza
Double dividendo=new Double(5.0);
Double divisore=new Double(0);
//2) Act: la chiamata alla operazione da testare
try{
App.dividi(dividendo, divisore);
//3) Assert: la risposta del passo 2 VS quanto definito nel punto 1
assertTrue( false ); //errore senza exception
}catch (ArithmeticException e){
assertTrue( true ); //ok se ArithmeticException
}catch (Exception e){
assertTrue( false ); //errore se altre exception
}
}
Questo esempio è fatto con la versione 1.7 di Java e 4.13 della libreria di junit e può essere trovata al repository:
https://github.com/alnao/JavaSpringBootExample/tree/master/ExampleMicro18TDDJunit4