PART 2: CONFIGURARE UN’APPLICAZIONE – HOW TO

“L’unico fascino del passato è che è passato”.

– Oscar Wilde

L’ispirazione per arrivare ad una soluzione è la gestione della configurazione di SpringBoot, e si basa su alcuni semplici prerequisiti che un’applicazione moderna dovrebbe avere:

  • PREREQUISITO 1. Deve essere resiliente

    Se la configurazione non è presente o incompleta, l’applicazione deve comunque avviarsi con dei valori di default arbitrari ma sensati.

  • PREREQUISITO 2. Deve poter essere configurata velocemente

    In base all’infrastruttura di installazione deve essere configurabile nel modo più semplice e veloce possibile.

  • PREREQUISITO 3. Deve potersi adattare a varie infrastrutture di installazione

    La stessa applicazione deve poter essere installata su un server, in docker, in cloud (AWS, Azure…), lanciata direttamente come eseguibile.

  • PREREQUISITO 4. Deve poter essere scalato su più nodi

    Per garantire facilmente una serie di parametri comuni a tutti e alcuni specifici per i singoli nodi.

A questo punto la domanda da porsi è: “quale tra tutti i sistemi visti precedentemente è il migliore per garantire i vincoli che ci si pone?”
La risposta, sebbene in contrasto con il principio KISS, di cui abbiamo già parlato e che nel nostro campo si rivela quasi sempre essenziale, è semplice: tutti i sistemi visti sono adatti, ma usati assieme.

Prendiamo un esempio pratico: la nostra applicazione deve generare dei file in una cartella, quindi necessita di una impostazione per decidere il percorso di questa cartella di salvataggio.

A questo punto il parametro viene letto dall’applicazione in queste posizioni e in quest’ordine:

  • Una variabile scolpita nel codice con un default

    prerequisito 1

  • Un valore in un file di configurazione (magari con vari formati), cercando il file all’interno dell’applicazione stessa, poi in una serie di cartelle predeterminate (cartella corrente, cartella di sistema, cartella utente…) o nel classpath dell’application server

    prerequisito 1, 2 e 3

  • Database

    soprattutto prerequisito 2

  • Variabili d’ambiente (nominati secondo uno standard in modo che sia facile farli corrispondere ai valori nel file di configurazioni)

    prerequisito 3

  • Parametri da riga di comandi (con la stessa convenzione per la nomenclatura)

    prerequisito 3

Le varie fonti da cui proviene la configurazione sovrascrivono la precedente (se non c’è il parametro da riga di comando uso la variabile d’ambiente, poi il file di configurazione e così via),in modo che chi lancia o installa l’applicazione possa scegliere il metodo più adatto alla necessità immediata.
Ecco come viene garantito il prerequisito 4.

Un esempio pratico:
Un’applicazione che in sviluppo viene lanciata da un IDE, quindi prende le configurazioni da un file di configurazione (stiamo comunque ricompilando il sorgente ogni volta, quindi non è un particolare problema), mentre poi in test è lanciata in un container docker che passa i parametri da riga di comando per poter essere rilanciato in più istanze, senza dover ricreare un binario ogni volta, e in produzione è installata in AWS, dove prende i parametri da variabili d’ambiente.

Può sembrare uno sforzo eccessivo solamente per alcuni parametri di configurazione, ma la libertà e la flessibilità che permettono al sistema finale sono impagabili ed esistono sempre più librerie che aiutano a gestire il tutto in modo semi-automatico.