Autor de la imagen: yocool

YARP (Yet Another Reverse Proxy) es una herramienta de código abierto diseñada para aplicaciones .NET que actúa como un intermediario, redirigiendo las solicitudes de los usuarios a varios servicios en el servidor según reglas y criterios específicos.

Su uso es muy importante en arquitecturas de microservicios, ya que proporciona un punto centralizado para la gestión, el enrutamiento y el equilibrio de las solicitudes entre los diferentes servicios.

Aquí hay una explicación más sencilla de las funciones principales de YARP:

  • Redirige las solicitudes entrantes a distintos servicios en el servidor basándose en la ruta de la URL, encabezados u otros atributos.
  • Distribuye la carga de trabajo de manera uniforme entre las instancias de los servicios, y admite diferentes estrategias para hacerlo.
  • Se integra sin problemas con el middleware de ASP.NET Core, permitiendo personalizar el manejo de las solicitudes y respuestas.
  • Asegura que el tráfico solo se envíe a instancias de servicios que estén funcionando correctamente.
  • Mantiene las sesiones de los usuarios con servicios específicos cuando es necesario.

YARP ayuda a manejar eficientemente el tráfico de red en aplicaciones complejas, asegurando que las solicitudes de los usuarios lleguen al servicio adecuado de una manera eficiente y confiable, y facilitando la escalabilidad y la disponibilidad de los servicios en la web.

Configurar YARP en tu aplicación .NET Core

Paso 1: Crea una aplicación web .NET Core

dotnet new web -n yarpTest
cd yarpTest
dotnet add package Microsoft.ReverseProxy

Paso 2: Implementa un controller

sing Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
    private readonly ITestService _TestService;    
    public TestController(ITestService testService) {
      _TestService = testService;
    }
    
    [HttpGet("{id}")]
    public IActionResult GetIntValue (int id)
    {
        // Your Code
        return Ok();
    }    
}

Paso 3: Configurar YARP

public void ConfigureServices(IServiceCollection services)
{    
    services.AddReverseProxy()
            .LoadFromConfig(Configuration.GetSection("ReverseProxy"));
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapReverseProxy();
    });
}

En appsettings.json debemos definir:

"ReverseProxy": {
  "Routes": [    
    {
      "RouteId": "external-get-test",
      "ClusterId": "external-test-service",
      "Match": {
        "Path": "/external-api/test/{id}",
        "Methods": [ "GET" ]
      }
    }
  ],
  "Clusters": {
    "external-test-service": {
      "Destinations": {
        "external-test-service/destination1": {
          "Address": "https://externaltestservice.com/"
        }
      }
    }
  }
}

El proxy inverso YARP está configurado para dirigir las solicitudes que coincidan con el patrón establecido hacia el servicio de backend ExternalTestService.

Cuando YARP recibe una solicitud que coincide con la ruta y el método especificados en las rutas (por ejemplo, GET /external-api/test/{id}), identifica que esta solicitud debe ser gestionada por el servicio externo (external-test-service).

Posteriormente, YARP redirige la solicitud al destino definido en el clúster de external-test-service. En este caso, sería https://externaltestservice.com/.

Las solicitudes que no coincidan con las rutas definidas en la configuración de YARP serán gestionadas internamente por tu aplicación, posiblemente por controladores como TestController y servicios como TestService.

En este escenario, TestService sería parte de la lógica de la aplicación, interactuando directamente con los controladores, mientras que ExternalTestService es una entidad separada, con la que se interactúa a través del enrutamiento de YARP.

Os resumo cómo se usamos con YARP los Route Params, Query Params y el Request Body al reenviar a servicios externos configurados en YARP:

/external-api/test/{id}

YARP extrae el {id} de la URL y lo reenvía como parte de la URL de la solicitud al servicio externo. Si tu ruta es /external-api/test/123, el 123 se pasa como el {id} al servicio externo.

/external-api/test/{id}?example=true

Ningun cambio, se conservan y reenvían tal como están.

Headers

Por defecto, la mayoría de los encabezados HTTP se reenvían al servicio externo. Pero puedes configurar YARP para agregar, eliminar o transformar encabezados según tus necesidades.

Body

En un POST, por ejemplo, el cuerpo de la solicitud se reenvía al servicio externo. Si el cliente envía un JSON o XML, ese contenido se envía tal cual al servicio externo.

Yarp permite modificar las solicitudes antes de reenviarlas para adaptarse a necesidades específicas.

Es posible cambiar encabezados, parámetros y otros elementos de la solicitud, así como personalizar el enrutamiento para dirigir las solicitudes de forma dinámica a diferentes destinos o manejarlas con lógica adicional. Esto se hace a través de su configuración, que es muy flexible y puede ser ajustada según lo que requiera cada situación particular.

"Routes": [
  {
    "RouteId": "external-get-test",
    "ClusterId": "external-test-service",
    "Match": {
      "Path": "/external-api/test/{id}",
      "Methods": [ "GET" ]
    },
    "Transforms": [
      {
        "RequestHeader": "X-MyNew-Header",
        "Set": "MyNewValue"
      }
    ]
  }
]

El ejemplo anterior cre a una nueva cabecera X-MyNew-Header con el valor MyNewValue a la solicitud antes de reenviarla al servicio ExternalTestService.

Escenarios para el uso de YARP:

  • Arquitectura de Microservicios
  • Load Balancing
  • API Gateway
  • Transformaciones de solicitudes y muchos más.
La fortaleza de YARP reside en su perfecta simbiosis con el ecosistema de .NET, donde explota la infraestructura ya establecida por ASP.NET y .NET para crear un conjunto de herramientas altamente versátil.
YARP es como una navaja suiza para los que trabajan con .NET y necesitamos montar un proxy reverso a medida y sin complicaciones. Básicamente, se acopla de maravilla con todo lo que ya conocemos de .NET.
Microsoft se ha sacado de la manga con YARP una herramienta que no es solo potente y estable, sino que también es como un camaleón que se adapta fácilmente a cómo trabajamos hoy en día.