YARP Docsv2.3
Documentação/Implantação/Delegação do HTTP.sys

Delegação do HTTP.sys

A delegação do HTTP.sys é um recurso em nível de kernel adicionado a versões mais recentes do Windows que

Introdução

A delegação do HTTP.sys é um recurso em nível de kernel adicionado a versões mais recentes do Windows que permite transferir uma solicitação da fila do HTTP.sys do processo receptor para a fila do HTTP.sys de um processo de destino, com pouquíssima sobrecarga ou latência adicional. Para que essa delegação funcione, o processo receptor só tem permissão para ler os cabeçalhos da solicitação. Se a leitura do corpo já tiver começado ou uma resposta já tiver sido iniciada, a tentativa de delegar a solicitação falhará. Após a delegação, a resposta não fica visível para o proxy, o que limita a funcionalidade dos componentes de afinidade de sessão e verificações de integridade passivas, bem como alguns dos algoritmos de balanceamento de carga. Internamente, o YARP utiliza o IHttpSysRequestDelegationFeature do ASP.NET Core

Requisitos

A delegação do HTTP.sys requer:

O servidor HTTP.sys do ASP.NET Core Windows Server 2019 ou Windows 10 (build 1809) ou mais recente.

Padrões

A delegação do HTTP.sys não será usada a menos que seja adicionada ao pipeline do proxy e habilitada na configuração do destino.

Configuração

A delegação do HTTP.sys pode ser habilitada por destino adicionando os metadados HttpSysDelegationQueue ao destino. O valor desses metadados deve ser o nome da fila do HTTP.sys de destino. O Address do destino é usado para especificar o prefixo de URL da fila do HTTP.sys.

JSON{
   "ReverseProxy": {
      "Routes": {
         "route1" : {
             "ClusterId": "cluster1",
             "Match": {
                "Path": "{**catch-all}"
                      }
                   }
      },
      "Clusters": {
                   "cluster1": {
                      "Destinations": {
                         "cluster1/destination1": {
                            "Address": "http://*:80/",
                            "Metadata": {
                               "HttpSysDelegationQueue": "TargetHttpSysQueueName"
                            }
                         }
                      }
                   }
      }
   }
}
In host configuration, configure the host to use the HTTP.sys server:
    C#
   webBuilder.UseHttpSys();
In application configuration, use the MapReverseProxy overload that allows you to customize
the pipeline and add HTTP.sys delegation by calling UseHttpSysDelegation :
C#   app.MapReverseProxy(proxyPipeline =>
   {
          // Add the three middleware YARP adds by default plus the HTTP.sys
          // delegation middleware
          proxyPipeline.UseSessionAffinity(); // No affect on delegation destinations
          proxyPipeline.UseLoadBalancing();
          proxyPipeline.UsePassiveHealthChecks();
          proxyPipeline.UseHttpSysDelegation();
   });

Tempo de vida da fila de delegação

Quando o YARP é configurado para usar delegação em um destino, é criado um identificador (handle) para a fila do HTTP.sys especificada. Esse identificador é mantido ativo enquanto existirem destinos que façam referência a ele. A limpeza desses identificadores é feita durante o GC, portanto é possível que essa limpeza seja adiada caso o identificador acabe na Gen2. Isso pode causar problemas para alguns receptores durante a reinicialização do processo, pois, se eles tentarem criar a fila na inicialização, a operação falhará porque ela ainda existe, já que o YARP

ainda mantém um identificador para ela. Os receptores precisam ser inteligentes o suficiente para se anexar a ela

em vez disso e reconfigurar corretamente a fila. O servidor HTTP.sys do ASP.NET Core tem esse problema. Para mais informações, consulte Http.sys

server should support setting up URL groups when attaching to an existing queue

(dotnet/aspnetcore #40359) .

O YARP expõe uma forma de redefinir seu identificador para a fila. Isso permite que os consumidores escrevam lógica personalizada para determinar quando o identificador da fila deve ser limpo.

Exemplo:

C#var delegator = app.Services.GetRequiredService<IHttpSysDelegator>();
delegator.ResetQueue("TargetHttpSysQueueName", "http://*:80");
 Note: The author created this article with assistance from AI. Learn more
Adaptado do Microsoft Learn , licenciado sob CC BY 4.0 .