Migrate (di chuyển) gRPC từ C-core sang gRPC cho .NET
Do cách triển khai của stack (ngăn xếp) cơ bản, không phải tất cả các tính năng đều hoạt động theo cùng một cách giữa ứng dụng gRPC dựa trên C-core và gRPC cho .NET. Tài liệu này nêu bật những điểm khác biệt chính khi di chuyển giữa hai stack.
Quan trọng: gRPC C-core đang ở chế độ bảo trì và sẽ bị ngừng sử dụng để nhường chỗ cho gRPC cho .NET. gRPC C-core không được khuyến nghị cho các ứng dụng mới.
Hỗ trợ nền tảng
gRPC C-core và gRPC cho .NET có hỗ trợ nền tảng khác nhau:
- gRPC C-core: Triển khai gRPC bằng C++ với các stack TLS và HTTP/2 riêng. Gói
Grpc.Corelà một wrapper (lớp bọc) .NET xung quanh gRPC C-core và chứa gRPC client và server. Hỗ trợ .NET Framework, .NET Core và .NET 5 trở lên. - gRPC cho .NET: Được thiết kế cho .NET Core 3.x và .NET 5 trở lên. Sử dụng các stack TLS và HTTP/2 được tích hợp vào các bản phát hành .NET hiện đại. Gói
Grpc.AspNetCorechứa máy chủ gRPC được lưu trữ trong ASP.NET Core và yêu cầu .NET Core 3.x hoặc .NET 5 trở lên. GóiGrpc.Net.Clientchứa gRPC client. Client trongGrpc.Net.Clientcó hỗ trợ hạn chế cho .NET Framework bằng cách sử dụng WinHttpHandler.
Để biết thêm thông tin, xem gRPC on .NET supported platforms.
Cấu hình server và channel (kênh)
Các gói NuGet, cấu hình và code khởi động phải được sửa đổi khi di chuyển từ gRPC C-Core sang gRPC cho .NET.
gRPC cho .NET có các gói NuGet riêng biệt cho client và server. Các gói được thêm phụ thuộc vào việc ứng dụng lưu trữ dịch vụ gRPC hay gọi chúng:
- **
Grpc.AspNetCore**: Dịch vụ được lưu trữ bởi ASP.NET Core. Để biết thông tin cấu hình máy chủ, xem gRPC services with ASP.NET Core. - **
Grpc.Net.Client**: Client sử dụngGrpcChannel, bên trong sử dụng chức năng mạng được tích hợp vào .NET. Để biết thông tin cấu hình client, xem Call gRPC services with the .NET client.
Khi việc di chuyển hoàn tất, gói Grpc.Core nên được xóa khỏi ứng dụng. Grpc.Core chứa các binary (tệp nhị phân) gốc lớn, và việc xóa gói giúp giảm thời gian khôi phục NuGet và kích thước ứng dụng.
Dịch vụ và client được tạo từ code
gRPC C-Core và gRPC cho .NET chia sẻ nhiều API, và code được tạo từ các file .proto tương thích với cả hai triển khai gRPC. Hầu hết các client và dịch vụ có thể được di chuyển từ C-Core sang gRPC cho .NET mà không cần thay đổi.
Vòng đời triển khai dịch vụ gRPC
Trong stack ASP.NET Core, các dịch vụ gRPC theo mặc định được tạo với vòng đời scoped. Ngược lại, gRPC C-core theo mặc định ràng buộc với dịch vụ có vòng đời singleton.
Vòng đời scoped cho phép triển khai dịch vụ giải quyết các dịch vụ khác có vòng đời scoped. Ví dụ, vòng đời scoped cũng có thể giải quyết DbContext từ container DI (Dependency Injection - tiêm phụ thuộc) thông qua constructor injection (tiêm qua hàm tạo). Khi sử dụng vòng đời scoped:
- Một instance mới của triển khai dịch vụ được tạo cho mỗi request (yêu cầu).
- Không thể chia sẻ trạng thái giữa các request thông qua các thành viên instance trên kiểu triển khai.
- Trạng thái được chia sẻ được kỳ vọng sẽ được lưu trữ trong dịch vụ singleton trong container DI. Trạng thái được chia sẻ đã lưu trữ được giải quyết trong constructor của triển khai dịch vụ gRPC.
Để biết thêm thông tin về vòng đời dịch vụ, xem Dependency injection in ASP.NET Core.
Thêm dịch vụ singleton
Để tạo điều kiện chuyển đổi từ triển khai gRPC C-core sang ASP.NET Core, có thể thay đổi vòng đời dịch vụ của triển khai dịch vụ từ scoped sang singleton. Điều này liên quan đến việc thêm một instance của triển khai dịch vụ vào container DI:
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
services.AddSingleton(new GreeterService());
}Tuy nhiên, triển khai dịch vụ với vòng đời singleton không còn có thể giải quyết các dịch vụ scoped thông qua constructor injection.
Cấu hình tùy chọn dịch vụ gRPC
Trong các ứng dụng dựa trên C-core, các cài đặt như grpc.max_receive_message_length và grpc.max_send_message_length được cấu hình với ChannelOption khi xây dựng instance Server.
Trong ASP.NET Core, gRPC cung cấp cấu hình thông qua kiểu GrpcServiceOptions. Ví dụ, kích thước thông báo nhận tối đa của dịch vụ gRPC có thể được cấu hình qua AddGrpc. Ví dụ sau đây thay đổi MaxReceiveMessageSize mặc định từ 4 MB thành 16 MB:
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc(options =>
{
options.MaxReceiveMessageSize = 16 * 1024 * 1024; // 16 MB
});
}Để biết thêm thông tin về cấu hình, xem gRPC for .NET configuration.
Logging (ghi nhật ký)
Các ứng dụng dựa trên C-core dựa vào GrpcEnvironment để cấu hình logger cho mục đích gỡ lỗi. Stack ASP.NET Core cung cấp chức năng này thông qua Logging API. Ví dụ, một logger có thể được thêm vào dịch vụ gRPC.
Constructor injection (tiêm qua hàm tạo):
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
}Primary constructor injection (tiêm qua hàm tạo chính) (.NET 8 trở lên):
public class GreeterService(ILogger<GreeterService> logger) : Greeter.GreeterBase
{
...
}Để biết thêm thông tin về logging và diagnostics (chẩn đoán) trong gRPC, xem Logging and diagnostics in gRPC on .NET.
HTTPS
Các ứng dụng dựa trên C-core cấu hình HTTPS thông qua thuộc tính Server.Ports. Một khái niệm tương tự được sử dụng để cấu hình máy chủ trong ASP.NET Core. Ví dụ, Kestrel sử dụng cấu hình endpoint cho chức năng này.
gRPC Interceptors (bộ chặn)
ASP.NET Core middleware (phần mềm trung gian) cung cấp chức năng tương tự so với các interceptor trong ứng dụng gRPC dựa trên C-core. Cả hai đều được hỗ trợ bởi ứng dụng ASP.NET Core gRPC, vì vậy không cần phải viết lại các interceptor.
Để biết thêm thông tin về cách các tính năng này so sánh với nhau, xem gRPC Interceptors versus Middleware.
Lưu trữ gRPC trong các dự án không phải ASP.NET Core
Máy chủ dựa trên C-core có thể được thêm vào bất kỳ loại dự án nào. Máy chủ gRPC cho .NET yêu cầu ASP.NET Core. ASP.NET Core thường có sẵn vì file dự án chỉ định Microsoft.NET.SDK.Web làm SDK.
Máy chủ gRPC có thể được lưu trữ trong các dự án không phải ASP.NET Core bằng cách thêm <FrameworkReference Include="Microsoft.AspNetCore.App" /> vào dự án. Tham chiếu framework (khung) làm cho các API ASP.NET Core khả dụng và chúng có thể được sử dụng để khởi động máy chủ ASP.NET Core.
Để biết thêm thông tin, xem Host gRPC in non-ASP.NET Core projects.