Конфигурация gRPC для .NET

Параметры настройки служб

Службы gRPC настраиваются в AddGrpcStartup.cs. Параметры конфигурации находятся в пакете Grpc.AspNetCore.Server.

В следующей таблице описаны параметры настройки служб gRPC.

Параметр Значение по умолчанию Description
MaxSendMessageSize null Максимальный размер сообщения в байтах, которое может быть отправлено с сервера. Попытка отправить сообщение, превышающее заданный максимальный размер сообщения, приведет к исключению. Если задано значение null, то размер сообщения не ограничен.
MaxReceiveMessageSize 4 МБ Максимальный размер сообщения в байтах, которое может быть получено сервером. Если сервер получает сообщение, размер которого превышает это ограничение, вызывается исключение. Увеличение этого значения позволяет серверу принимать сообщения большего размера, однако это может негативно сказаться на потреблении памяти. Если задано значение null, то размер сообщения не ограничен.
EnableDetailedErrors false Если параметру присвоено значение true, при возникновении исключения в методе службы клиентам возвращаются подробные сообщения об исключениях. Значение по умолчанию — false. Установка для параметра EnableDetailedErrors значения true может привести к утечке конфиденциальной информации.
CompressionProviders gzip Коллекция поставщиков сжатия, используемая для сжатия и распаковки сообщений. Можно создать настраиваемые поставщики сжатия и добавить их в коллекцию. Настроенные по умолчанию поставщики поддерживают сжатие gzip.
ResponseCompressionAlgorithm null Алгоритм сжатия, используемый для сжатия сообщений, отправляемых с сервера. Алгоритм должен соответствовать поставщику сжатия в CompressionProviders. Чтобы алгоритм выполнял сжатие ответа, клиент должен указать, что он поддерживает алгоритм, отправив его в заголовке grpc-accept-encoding.
ResponseCompressionLevel null Уровень сжатия, используемый для сжатия сообщений, отправляемых с сервера.
Interceptors None Коллекция перехватчиков, которые выполняются с каждым вызовом gRPC. Перехватчики выполняются в том порядке, в котором они зарегистрированы. Глобально настроенные перехватчики выполняются до того, как будут выполнены перехватчики, настроенные для одной службы.

По умолчанию перехватчики имеют время существования, соответствующее запросу. Вызов конструктора перехватчика и разрешение параметров выполняется с помощью внедрения зависимостей (DI). Тип перехватчика можно также зарегистрировать с помощью внедрения зависимостей, чтобы переопределить способ его создания и время существования.

Перехватчики предоставляют аналогичные функциональные возможности по сравнению с ПО промежуточного слоя ASP.NET Core. Дополнительные сведения см. в разделе ПО промежуточного слоя и перехватчики gRPC.
IgnoreUnknownServices false Если задано значение true, вызовы неизвестных служб и методов не возвращают состояние UNIMPLEMENTED (Не реализовано), а запрос передается следующему зарегистрированному ПО промежуточного слоя в ASP.NET Core.

Параметры можно настроить для всех служб, предоставив делегаты параметров для вызова AddGrpc в Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.EnableDetailedErrors = true;
        options.MaxReceiveMessageSize = 2 * 1024 * 1024; // 2 MB
        options.MaxSendMessageSize = 5 * 1024 * 1024; // 5 MB
    });
}

Параметры одной службы переопределяют глобальные параметры, предоставленные в AddGrpc, и могут быть настроены с помощью AddServiceOptions<TService>:

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc().AddServiceOptions<MyService>(options =>
    {
        options.MaxReceiveMessageSize = 2 * 1024 * 1024; // 2 MB
        options.MaxSendMessageSize = 5 * 1024 * 1024; // 5 MB
    });
}

По умолчанию перехватчики службы имеют время существования, соответствующее запросу. Регистрация типа перехватчика с помощью внедрения зависимостей переопределяет способ создания перехватчика и его время существования.

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.Interceptors.Add<LoggingInterceptor>();
    });
    services.AddSingleton<LoggingInterceptor>();
}

Параметры сервера ASP.NET Core

Grpc.AspNetCore.Server размещается на веб-сервере ASP.NET Core. Существует несколько вариантов серверов ASP.NET Core, включая Kestrel, IIS и HTTP.sys. Каждый сервер предлагает дополнительные варианты обслуживания HTTP-запросов.

Сервер, используемый приложением ASP.NET Core, настраивается в коде запуска приложения. Сервер, используемый по умолчанию, — Kestrel.

Дополнительные сведения о различных серверах и их параметрах конфигурации см. в следующих статьях:

Настройка параметров клиента

Конфигурация клиента gRPC задается в GrpcChannelOptions. Параметры конфигурации находятся в пакете Grpc.Net.Client.

В следующей таблице описаны параметры настройки каналов gRPC.

Параметр Значение по умолчанию Description
HttpHandler Новый экземпляр HttpMessageHandler, используемый для выполнения вызовов gRPC. Клиент может быть настроен на использование настраиваемого обработчика HttpClientHandler или добавление дополнительных обработчиков в конвейер HTTP для вызовов gRPC. Если обработчик HttpMessageHandler не указан, создается новый экземпляр HttpClientHandler для канала с автоматической очисткой.
HttpClient null HttpClient, используемый для выполнения вызовов gRPC. Этот параметр является альтернативой HttpHandler.
DisposeHttpClient false Если задано значение true и указано значение параметра HttpMessageHandler или HttpClient, то HttpHandler или HttpClient, соответственно, очищаются при очистке GrpcChannel.
LoggerFactory null LoggerFactory, используемый клиентом для записи в журнал сведений о вызовах gRPC. Экземпляр LoggerFactory можно разрешить из внедрения зависимостей или создать с помощью LoggerFactory.Create. Примеры настройки ведения журнала см. в статье Ведение журнала и диагностика в gRPC на платформе .NET.
MaxSendMessageSize null Максимальный размер сообщения в байтах, которое может быть отправлено из клиента. Попытка отправить сообщение, превышающее заданный максимальный размер сообщения, приведет к исключению. Если задано значение null, то размер сообщения не ограничен.
MaxReceiveMessageSize 4 МБ Максимальный размер сообщения в байтах, которое может быть получено клиентом. Если клиент получает сообщение, размер которого превышает это ограничение, вызывается исключение. Увеличение этого значения позволяет клиенту принимать сообщения большего размера, однако это может негативно сказаться на потреблении памяти. Если задано значение null, то размер сообщения не ограничен.
Credentials null Экземпляр класса ChannelCredentials. Учетные данные используются для добавления метаданных проверки подлинности в вызовы gRPC.
CompressionProviders gzip Коллекция поставщиков сжатия, используемая для сжатия и распаковки сообщений. Можно создать настраиваемые поставщики сжатия и добавить их в коллекцию. Настроенные по умолчанию поставщики поддерживают сжатие gzip.
ThrowOperationCanceledOnCancellation false Если задано значение true, клиенты создают исключение OperationCanceledException при отмене вызова или наступлении его крайнего срока.
UnsafeUseInsecureChannelCallCredentials false Если задано значение true, CallCredentials применяются к вызовам gRPC от небезопасного канала. Отправка заголовков проверки подлинности через небезопасное подключение негативно влияет на безопасность и не должна выполняться в рабочих средах.
MaxRetryAttempts 5 Максимальное количество повторных попыток. Это значение ограничивает любые значения повторных попыток и шестнадцатеричной попытки, указанные в конфигурации службы. Установка этого значения не включает повторные попытки. Повторные попытки можно разрешить в конфигурации службы с помощью параметра ServiceConfig. При присвоении значения null удаляется максимальное количество повторных попыток. Дополнительные сведения о повторных попытках см. в статье Обработка временных сбоев с повторными попытками gRPC.
MaxRetryBufferSize 16 МБ Максимальный размер буфера в байтах, который можно использовать для хранения отправленных сообщений при повторных попытках или хеджированных вызовах. Если ограничение для буфера будет превышено, попытки повтора больше не будут предприниматься и все хеджированные вызовы, кроме одного, будут отменены. Это ограничение применяется ко всем вызовам, совершаемым через канал. При присвоении значения null удаляется максимальное ограничение для размера буфера повторной попытки.
MaxRetryBufferPerCallSize 1 МБ Максимальный размер буфера в байтах, который можно использовать для хранения отправленных сообщений при повторных попытках или хеджированных вызовах. Если ограничение для буфера будет превышено, попытки повтора больше не будут предприниматься и все хеджированные вызовы, кроме одного, будут отменены. Это ограничение применяется к одному вызову. При присвоении значения null удаляется максимальное ограничение для размера буфера при каждом вызове.
ServiceConfig null Конфигурация службы для канала gRPC. Конфигурация службы может использоваться для настройки повторных попыток gRPC.

Следующий код:

  • Задается максимальный размер сообщения для отправки и получения в канале.
  • Создается клиент.
static async Task Main(string[] args)
{
    var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
    {
        MaxReceiveMessageSize = 5 * 1024 * 1024, // 5 MB
        MaxSendMessageSize = 2 * 1024 * 1024 // 2 MB
    });
    var client = new Greeter.GreeterClient(channel);

    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
}

Обратите внимание, что перехватчики клиента не настраиваются с помощью GrpcChannelOptions. Вместо этого они настраиваются с помощью метода расширения Intercept и канала. Этот метод расширения относится к пространству имен Grpc.Core.Interceptors.

static async Task Main(string[] args)
{
    var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var callInvoker = channel.Intercept(new LoggingInterceptor());
    var client = new Greeter.GreeterClient(callInvoker);

    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
}

Параметры обработчика System.Net

Grpc.Net.Client использует транспорт HTTP, производный от HttpMessageHandler, для выполнения HTTP-запросов. Каждый обработчик предлагает дополнительные варианты выполнения HTTP-запросов.

Обработчик настраивается в канале и может быть переопределен с помощью параметра GrpcChannelOptions.HttpHandler. По умолчанию используется SocketsHttpHandler .NET Core 3 и .NET 5 или более поздних версий. Для клиентских приложений gRPC на платформе .NET Framework необходимо настроить WinHttpHandler.

Дополнительные сведения о различных обработчиках и их параметрах конфигурации см. в следующих статьях:

Дополнительные ресурсы