Implementare un API Gateway con .NET e YARP - UGIdotNET
Questo sito si serve dei cookie per fornire servizi. Utilizzando questo sito acconsenti all'utilizzo dei cookie. Ulteriori informazioni Ok

Implementare un API Gateway con .NET e YARP

di pubblicato il 14/01/2025

Microsoft  Open Source 

In questo articolo vedremo cosa è YARP, un reverso proxy open source sviluppato da Microsoft, e come usarlo per implementare un API Gateway

Differenze tra un API Gateway e un Reverse Proxy

Un API Gateway e un Reverse Proxy sono componenti simili ma con scopi diversi. Si può dire che gli API Gateway sono dei Reverse Proxy ma che non tutti i Reverse Proxy possono essere considerati degli API Gateway.

Un Reverse Proxy agisce come un intermediario tra i client e i server. I client inviano le loro richieste al Reverse Proxy, che, a sua volta, le inoltra ai server di backend appropriati all'interno della rete.

Un Reverse Proxy è generalmente usato per i seguenti scopi:

  • Maggiore sicurezza → nasconde i dettagli dei server interni nella rete evitando di esporli direttamente su Internet; può filtrare le richieste in ingresso e prevenire gli attacchi DDoS.
  • Bilanciamento del carico
  • Caching
  • Terminazione SSL → semplifica la gestione dei certificati SSL centralizzandola in un unico punto; migliora le prestazioni riducendo il carico di lavoro legato all'elaborazione crittografica su ciascun server backend.

Reverse Proxy

Un'API Gateway è una particolare forma di Reverse Proxy, progettata specificamente per la gestione delle API. Agisce da unico punto di accesso per i client, facilitando la comunicazione con i diversi server di backend. Inoltre, l'API Gateway offre funzionalità aggiuntive come l'autenticazione, il monitoraggio delle performance, la gestione del traffico, l'orchestrazione delle richieste e la trasformazione dei dati, contribuendo così a semplificare e ottimizzare l'interazione tra i client e i servizi di backend.

Le caratteristiche principali di un API Gateway sono:

  • Routing e gestione delle richieste → può ad esempio orchestrare le chiamate a più servizi backend, aggregando le risposte in un'unica risposta per il client.
  • Trasformazione delle richieste e delle risposte
  • Autenticazione ed autorizzazione
  • Rate limiting
  • Monitoraggio

API Gateway

In sintesi, un Reverse Proxy si concentra principalmente sulla gestione delle richieste e sul bilanciamento del carico, un'API gateway invece, offre funzionalità più avanzate specifiche per le API, In molte architetture moderne, entrambi possono essere utilizzati insieme per ottimizzare le prestazioni e la gestione delle API.

Come usare YARP per implementare un API Gateway

YARP (Yet Another Reverse Proxy) è un progetto open source sviluppato da Microsoft. Si tratta di una libreria che consente di implementare un Reverse Proxy in modo semplice e fluido, integrandosi perfettamente nell'ecosistema .NET. Grazie a YARP, gli sviluppatori possono gestire il traffico delle loro applicazioni in modo efficace, sfruttando le potenzialità offerte da .NET.

Gli esempi proposti di seguito si concentrano sulla creazione e configurazione dell'API Gateway, assumendo che i due microservizi di destinazione siano già stati implementati nella seguente configurazione:

  • Un microservizio che gestisce le anagrafiche dei clienti e che risponde all'indirizzo http://localhost:5100
  • Un microservizio che gestisce le anagrafiche dei fornitori e che risponde all'indirizzo http://localhost:5200

L'esempio completo è pubblicato all'indirizzo https://github.com/santoni1981/LearningYarp.

Ambiente di lavoro iniziale

Per iniziare, è fondamentale creare un progetto che servirà come API Gateway. A tale scopo, è possibile utilizzare il comando riportato di seguito oppure, in alternativa, per coloro che preferiscono un approccio più visivo, è anche possibile utilizzare Visual Studio o Rider.

dotnet new web -n MyYarpGateway

Installare e configurare YARP

Dopo aver creato il progetto, il passo successivo è quello di installare YARP. Può essere fatto utilizzando la CLI offerta da .NET con il seguente comando:

dotnet add package Yarp.ReverseProxy --version 2.2.0

Ora che l'ambiente di lavoro è pronto bisogna registrare il servizio di YARP come una qualsiasi applicazione ASP.NET Core.

var builder = WebApplication.CreateBuilder(args);

// Aggiunge il servizio del ReverseProxy alla Dependency Injection.
builder.Services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));

var app = builder.Build();

// Mappa le rotte del Reverse Proxy.
app.MapReverseProxy();
app.Run();

Successivamente bisogna configurare YARP affinchè sia in grado di intercettare ed instradare le richieste ricevute ai microservizi. Per farlo, YARP utilizza due concetti:

  • Routes → indica come intercettare le richieste in ingresso e, nel caso, quali trasformazioni attuare
  • Clusters → specifica le informazioni dei microservizi di destinazione

YARP offre la flessibilità di essere configurato sia tramite codice, consentendo agli sviluppatori di personalizzare le impostazioni in modo dinamico, sia attraverso il file di configurazione appsettings.json, che consente una gestione più semplice. In quest'ultimo caso, è necessario aprire il file appsettings.json e aggiungere la sezione ReverseProxy come mostrato di seguito.

{
    ...
    "ReverseProxy": {
        "Routes": {
            "customer-route": {
                "ClusterId": "customer-cluster",
                "Match": {
                    "Path": "/api/customers/{**catch-all}"
                },
                "Transforms": [{
                    "PathPattern": "{**catch-all}"
                }]
            },
            "supplier-route": {
                "ClusterId": "supplier-cluster",
                "Match": {
                    "Path": "/api/suppliers/{**catch-all}"
                },
                "Transforms": [{
                    "PathPattern": "{**catch-all}"
                }]
            }
        },
        "Clusters": {
            "customer-cluster": {
                "Destinations": {
                    "customer-cluster/destination1": {
                        "Address": "http://localhost:5100"
                    }
                }
            },
            "supplier-cluster": {
                "Destinations": {
                    "supplier-cluster/destination1": {
                        "Address": "http://localhost:5200"
                    }
                }
            }
        }
    }
    ...
}

In questo esempio, l'API Gateway intercetta le richieste verso /api/customers/list /api/suppliers/list, inoltrandole ai microservizi di backend, applicando prima una modifica per rimuovere parte del percorso dall'indirizzo iniziale.

Avviando il progetto e navigando con il browser all'indirizzo http://localhost:5000/api/customers/list o http://localhost:5000/api/suppliers/list si ottiene la risposta dai microservizi per mezzo dell'API Gateway.

E' anche possibile definire più routes, per esempio si può gestire un'azione predefinita nel caso in cui l'utente effettua una chiamata all'indirizzo /api/customers, si può configurare un comportamento di default per questa richiesta. Per implementare questa funzionalità, è sufficiente definire una nuova route nel file di configurazione e applicare una trasformazione aggiuntiva all'indirizzo, garantendo così che le richieste vengano elaborate correttamente.

{
    ...
        "Routes": {
            "customer-default-route": {
                "ClusterId": "customer-cluster",
                "Match": {
                    "Path": "/api/customers",
                    "Methods": [ "GET" ]
                }
            },

            "customer-route": {
                ...
            },
            "supplier-default-route": {
                "ClusterId": "supplier-cluster",
                "Match": {
                    "Path": "/api/suppliers",
                    "Methods": [ "GET" ]
                }
            },

            "supplier-route": {
                ...
            }
        },
    ...
}

Conclusioni

In questo articolo à stato introdotto YARP (Yet Another Reverse Proxy), uno strumento open-source di Microsoft progettato per semplificare la creazione di reverse proxy e API Gateway. Con la sua architettura modulare e le potenti funzionalità, YARP è sicuramente un'opzione da considerare per chi desidera costruire un API Gateway robusto e performante.

Riferimenti

  • https://microsoft.github.io/reverse-proxy/index.html