Конфигурация gRPC для .NET
Примечание.
Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 9 этой статьи.
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущем выпуске см . версию .NET 9 этой статьи.
Внимание
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В текущем выпуске см . версию .NET 9 этой статьи.
Параметры настройки служб
Службы gRPC настраиваются в AddGrpc
Startup.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 |
нет | Коллекция перехватчиков, которые выполняются с каждым вызовом 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.
Дополнительные сведения о различных серверах и их параметрах конфигурации см. в следующих статьях:
- Kestrel веб-сервер в ASP.NET Core
- реализация веб-сервера HTTP.sys в ASP.NET Core
- Размещение ASP.NET Core в Windows со службами IIS
Настройка параметров клиента
Конфигурация клиента 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.
Дополнительные сведения о различных обработчиках и их параметрах конфигурации см. в следующих статьях:
Дополнительные ресурсы
ASP.NET Core