ASP.NET Core: gRPC cho cấu hình .NET
Trong bài viết này
Định cấu hình tùy chọn dịch vụ
Các dịch vụ gRPC được định cấu hình AddGrpc
bằng Startup.cs
. hoặc Program.cs. Tùy chọn cấu hình có trong gói Grpc.AspNetCore.Server.
Bảng sau mô tả các tùy chọn để định cấu hình dịch vụ gRPC:
Lựa chọn | Giá trị mặc định | Mô tả |
---|---|---|
MaxSendMessageSize |
null |
Kích thước tin nhắn (message) tối đa tính bằng byte có thể được gửi từ máy chủ. Cố gắng gửi tin nhắn vượt quá kích thước tối đa được cấu hình sẽ dẫn đến một ngoại lệ. Khi được đặt thành null , kích thước tin nhắn là không giới hạn. |
MaxReceiveMessageSize |
4MB | Kích thước tin nhắn tối đa tính bằng byte mà máy chủ có thể nhận được. Nếu máy chủ nhận được tin nhắn vượt quá giới hạn này, nó sẽ đưa ra một ngoại lệ. Việc tăng giá trị này cho phép máy chủ nhận được các tin nhắn lớn hơn nhưng có thể tác động tiêu cực đến mức tiêu thụ bộ nhớ. Khi được đặt thành null , kích thước tin nhắn là không giới hạn. |
EnableDetailedErrors |
false |
Nếu được đặt thành true , các tin nhắn ngoại lệ chi tiết sẽ được trả về cho máy khách khi một ngoại lệ được đưa vào một phương thức dịch vụ. Mặc định là false . Cài đặt EnableDetailedErrors thành true có thể rò rỉ thông tin nhạy cảm. |
CompressionProviders |
gzip | Tập hợp các nhà cung cấp tính năng nén được sử dụng để nén và giải nén tin nhắn. Các nhà cung cấp nén tùy chỉnh có thể được tạo và thêm vào collection. Các nhà cung cấp được cấu hình mặc định hỗ trợ nén gzip. |
ResponseCompressionAlgorithm |
null |
Thuật toán nén được sử dụng để nén các tin nhắn được gửi từ máy chủ. Thuật toán phải khớp với nhà cung cấp dịch vụ nén trong CompressionProviders . Để thuật toán nén phản hồi, máy khách phải cho biết nó hỗ trợ thuật toán bằng cách gửi nó trong header grpc-accept-encoding. |
ResponseCompressionLevel |
null |
Mức nén được sử dụng để nén các tin nhắn được gửi từ máy chủ. |
Interceptors |
None | Một tập hợp các thiết bị chặn được chạy với mỗi lệnh gọi gRPC. Các thiết bị chặn được chạy theo thứ tự chúng được đăng ký. Các thiết bị chặn được định cấu hình chung được chạy trước các thiết bị chặn được định cấu hình cho một dịch vụ. Theo mặc định, thiết bị chặn có thời gian tồn tại theo yêu cầu. Hàm tạo chặn được gọi và các tham số được giải quyết từ chèn phụ thuộc (DI). Một loại thiết bị chặn cũng có thể được đăng ký với DI để ghi đè cách tạo và thời gian tồn tại của nó. Bộ chặn cung cấp các chức năng tương tự so với middleware ASP.NET Core. Để biết thêm thông tin, hãy xem Trình chặn gRPC so với Middleware. |
IgnoreUnknownServices |
false |
Nếu true , các lời gọi đến các dịch vụ và phương thức không xác định không trả về trạng thái KHÔNG HOÀN TOÀN và yêu cầu sẽ chuyển sang middleware đã đăng ký tiếp theo trong ASP.NET Core. |
Các tùy chọn có thể được cấu hình cho tất cả các dịch vụ bằng cách cung cấp một delegate tùy chọn cho lời gọi AddGrpc
trong 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
});
}
Các tùy chọn cho một dịch vụ sẽ ghi đè các tùy chọn chung được cung cấp trong AddGrpc
và có thể được định cấu hình bằng cách sử dụng 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
});
}
Theo mặc định, các bộ chặn dịch vụ có thời gian tồn tại theo yêu cầu. Việc đăng ký loại thiết bị chặn với DI sẽ ghi đè cách tạo thiết bị chặn và thời gian tồn tại của nó.
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc(options =>
{
options.Interceptors.Add<LoggingInterceptor>();
});
services.AddSingleton<LoggingInterceptor>();
}
Tùy chọn máy chủ ASP.NET Core
Grpc.AspNetCore.Server
được lưu trữ bởi một máy chủ web ASP.NET Core. Có một số tùy chọn cho máy chủ ASP.NET Core, bao gồm Kestrel, IIS và HTTP.sys. Mỗi máy chủ cung cấp các tùy chọn bổ sung về cách phân phát các yêu cầu HTTP.
Máy chủ được ứng dụng ASP.NET Core sử dụng được định cấu hình trong mã khởi động ứng dụng. Máy chủ mặc định là Kestrel.
Để biết thêm thông tin về các máy chủ khác nhau và các tùy chọn cấu hình của chúng, hãy xem:
- Máy chủ web Kestrel trong ASP.NET Core
- Triển khai máy chủ web HTTP.sys trong ASP.NET Core
- Lưu trữ ASP.NET Core trên Windows bằng IIS
Định cấu hình tùy chọn máy khách
Cấu hình máy khách gRPC được đặt trên GrpcChannelOptions
. Tùy chọn cấu hình có trong gói Grpc.Net.Client.
Bảng sau mô tả các tùy chọn để định cấu hình kênh gRPC:
Lựa chọn | Giá trị mặc định | Mô tả |
---|---|---|
HttpHandler |
Phiên bản mới | Được HttpMessageHandler sử dụng để thực hiện lời gọi gRPC. Máy khách có thể được đặt để định cấu hình tùy chỉnh HttpClientHandler hoặc thêm trình xử lý bổ sung vào quy trình HTTP cho các lệnh gọi gRPC. Nếu không có HttpMessageHandler nào được chỉ định, thì một phiên bản mới HttpClientHandler sẽ được tạo cho kênh với tính năng xử lý tự động. |
HttpClient |
null |
Được HttpClient sử dụng để thực hiện lời gọi gRPC. Cài đặt này là một thay thế cho HttpHandler . |
DisposeHttpClient |
false |
Nếu được đặt thành true và HttpMessageHandler or HttpClient được chỉ định, thì HttpHandler hoặc HttpClient tương ứng sẽ được loại bỏ khi GrpcChannel được loại bỏ. |
LoggerFactory |
null |
LoggerFactory được máy khách sử dụng để ghi nhật ký thông tin về các lời gọi gRPC. Một thể hiện LoggerFactory có thể được giải quyết từ việc chèn phụ thuộc hoặc được tạo bằng cách sử dụng LoggerFactory.Create . Để biết ví dụ về cách định cấu hình ghi nhật ký, hãy xem Ghi nhật ký và chẩn đoán trong gRPC trên .NET. |
MaxSendMessageSize |
null |
Kích thước tin nhắn tối đa tính bằng byte có thể được gửi từ máy khách. Cố gắng gửi tin nhắn vượt quá kích thước thư tối đa được cấu hình sẽ dẫn đến một ngoại lệ. Khi được đặt thành null , kích thước tin nhắn là không giới hạn. |
MaxReceiveMessageSize |
4MB | Kích thước tin nhắn tối đa tính bằng byte mà máy khách có thể nhận được. Nếu máy khách nhận được một tin nhắn vượt quá giới hạn này, nó sẽ đưa ra một ngoại lệ. Việc tăng giá trị này cho phép máy khách nhận được tin nhắn lớn hơn nhưng có thể tác động tiêu cực đến mức tiêu thụ bộ nhớ. Khi được đặt thành null , kích thước tin nhắn là không giới hạn. |
Credentials |
null |
Một thể hiện ChannelCredentials . Thông tin xác thực được sử dụng để thêm siêu dữ liệu xác thực vào lệnh gọi gRPC. |
CompressionProviders |
gzip | Tập hợp các nhà cung cấp tính năng nén được sử dụng để nén và giải nén tin nhắn. Các nhà cung cấp nén tùy chỉnh có thể được tạo và thêm vào collection. Các nhà cung cấp được cấu hình mặc định hỗ trợ nén gzip. |
ThrowOperationCanceledOnCancellation |
false |
Nếu được đặt thành true , máy khách sẽ ném ra ngoại lệ OperationCanceledException khi cuộc gọi bị hủy hoặc vượt quá thời hạn. |
UnsafeUseInsecureChannelCallCredentials |
false |
Nếu được đặt thành true , CallCredentials sẽ được áp dụng cho các lệnh gọi gRPC được thực hiện bởi kênh không an toàn. Việc gửi header xác thực qua kết nối không an toàn có liên quan đến bảo mật và không nên thực hiện trong môi trường production. |
MaxRetryAttempts |
5 | Số lần thử lại tối đa. Giá trị này giới hạn mọi giá trị thử lại và thử bảo hiểm rủi ro được chỉ định trong cấu hình dịch vụ. Chỉ đặt giá trị này sẽ không cho phép thử lại. Việc thử lại được bật trong cấu hình dịch vụ, việc này có thể được thực hiện bằng cách sử dụng ServiceConfig . Một giá trị null sẽ loại bỏ giới hạn số lần thử lại tối đa. Để biết thêm thông tin về các lần thử lại, hãy xem Xử lý lỗi tạm thời với các lần thử lại gRPC. |
MaxRetryBufferSize |
16MB | Kích thước bộ đệm tối đa tính bằng byte có thể được sử dụng để lưu trữ tin nhắn đã gửi khi thử lại hoặc phòng ngừa lời gọi. Nếu vượt quá giới hạn bộ đệm thì sẽ không có lần thử lại nào được thực hiện nữa và tất cả lệnh gọi phòng ngừa trừ một lệnh sẽ bị hủy. Giới hạn này được áp dụng cho tất cả các lời gọi được thực hiện bằng kênh này. Giá trị null sẽ loại bỏ giới hạn kích thước bộ đệm thử lại tối đa. |
MaxRetryBufferPerCallSize |
1MB | Kích thước bộ đệm tối đa tính bằng byte có thể được sử dụng để lưu trữ tin nhắn đã gửi khi thử lại hoặc phòng ngừa lời gọi. Nếu vượt quá giới hạn bộ đệm thì sẽ không có lần thử lại nào được thực hiện nữa và tất cả lệnh gọi phòng ngừa trừ một lệnh sẽ bị hủy. Giới hạn này được áp dụng cho một lời gọi. Giá trị null sẽ loại bỏ giới hạn kích thước bộ đệm thử lại tối đa cho mỗi lời gọi. |
ServiceConfig |
null |
Cấu hình dịch vụ cho kênh gRPC. Cấu hình dịch vụ có thể được sử dụng để định cấu hình thử lại gRPC. |
Đoạn code sau sau đây sẽ:
- Đặt kích thước tin nhắn gửi và nhận tối đa trên kênh.
- Tạo một máy khách.
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);
}
Lưu ý rằng các thiết bị chặn máy khách không được định cấu hình bằng GrpcChannelOptions
. Thay vào đó, các thiết bị chặn máy khách được định cấu hình bằng phương thức mở rộng Intercept
với một kênh. Phương thức mở rộng này nằm trong namespace 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);
}
Tùy chọn xử lý System.Net
Grpc.Net.Client
sử dụng phương thức vận chuyển HTTP dẫn xuất từ HttpMessageHandler
để thực hiện các yêu cầu HTTP. Mỗi trình xử lý cung cấp các tùy chọn bổ sung về cách thực hiện các yêu cầu HTTP.
Trình xử lý được định cấu hình trên một kênh và có thể bị ghi đè bằng cách cài đặt GrpcChannelOptions.HttpHandler
. .NET Core 3 và .NET 5 trở lên sử dụng SocketsHttpHandler theo mặc định. Các ứng dụng khách gRPC trên .NET Framework nên định cấu hình WinHttpHandler.
Để biết thêm thông tin về các trình xử lý khác nhau và các tùy chọn cấu hình của chúng, hãy xem:
Tài nguyên bổ sung
- Dịch vụ gRPC với ASP.NET Core
- Gọi các dịch vụ gRPC bằng máy khách .NET
- Ghi nhật ký và chẩn đoán trong gRPC trên .NET
- Tạo máy khách và máy chủ .NET Core gRPC trong ASP.NET Core