Tổng quan về gRPC trên .NET
Nguồn: gRPC for .NET overview | Phiên bản: .NET 8.0
Tác giả: James Newton-King
Lưu ý: Đây không phải phiên bản mới nhất của bài viết này. Để xem bản phát hành hiện tại, hãy xem phiên bản .NET 10 của bài viết này.
Cảnh báo: Phiên bản ASP.NET Core này không còn được hỗ trợ nữa. Để biết thêm thông tin, hãy xem Chính sách hỗ trợ .NET và .NET Core. Để xem bản phát hành hiện tại, hãy xem phiên bản .NET 10 của bài viết này.
Trong bài viết này
gRPC là một framework (khung làm việc) RPC (Remote Procedure Call - Gọi thủ tục từ xa) hiệu suất cao, không phụ thuộc ngôn ngữ lập trình.
Các lợi ích chính của gRPC bao gồm:
- Framework RPC hiện đại, hiệu suất cao, nhẹ nhàng.
- Phát triển API theo hướng contract-first (hợp đồng trước), sử dụng Protobuf (Protocol Buffers) theo mặc định, cho phép triển khai độc lập với ngôn ngữ lập trình.
- Công cụ hỗ trợ cho nhiều ngôn ngữ để tạo ra server (máy chủ) và client (máy khách) với kiểu dữ liệu mạnh (strongly typed).
- Hỗ trợ các lời gọi streaming (truyền phát) từ client, từ server và hai chiều (bi-directional).
- Giảm băng thông mạng nhờ serialization (tuần tự hóa) nhị phân của Protobuf.
Những lợi ích này khiến gRPC trở nên lý tưởng cho:
- Các microservice (vi dịch vụ) nhẹ, nơi hiệu suất là yếu tố then chốt.
- Các hệ thống đa ngôn ngữ (polyglot) yêu cầu nhiều ngôn ngữ lập trình trong quá trình phát triển.
- Các service (dịch vụ) thời gian thực kết nối trực tiếp (point-to-point) cần xử lý các yêu cầu hoặc phản hồi có streaming (truyền phát).
Hỗ trợ công cụ C# cho các file .proto
gRPC sử dụng cách tiếp cận contract-first (hợp đồng trước) trong phát triển API. Các service (dịch vụ) và message (thông điệp) được định nghĩa trong các file .proto:
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}Các kiểu .NET cho service (dịch vụ), client (máy khách) và message (thông điệp) được tự động tạo ra bằng cách đưa các file .proto vào project (dự án):
- Thêm tham chiếu package (gói) tới Grpc.Tools.
- Thêm các file
.protovào item group (nhóm mục)<Protobuf>.
<ItemGroup> <Protobuf Include="Protos\greet.proto" /> </ItemGroup>
Để biết thêm thông tin về hỗ trợ công cụ gRPC, hãy xem gRPC services với C#.
Các gRPC service trên ASP.NET Core
Các gRPC service (dịch vụ) có thể được host (lưu trữ) trên ASP.NET Core. Các service có tích hợp đầy đủ với các tính năng của ASP.NET Core như logging (ghi nhật ký), dependency injection (DI - tiêm phụ thuộc), authentication (xác thực) và authorization (phân quyền).
Thêm các gRPC service vào ứng dụng ASP.NET Core
gRPC yêu cầu package (gói) Grpc.AspNetCore. Để biết thông tin về cách cấu hình gRPC trong ứng dụng .NET, hãy xem Configure gRPC.
Template dự án gRPC service
Template dự án ASP.NET Core gRPC Service cung cấp một service (dịch vụ) khởi đầu:
public class GreeterService(ILogger<GreeterService> logger) : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request,
ServerCallContext context)
{
logger.LogInformation("Saying hello to {Name}", request.Name);
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
public override Task<HelloReply> SayHello(HelloRequest request,
ServerCallContext context)
{
_logger.LogInformation("Saying hello to {Name}", request.Name);
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}GreeterService kế thừa từ kiểu GreeterBase, được tạo ra từ service (dịch vụ) Greeter trong file .proto. Service được cho phép truy cập bởi các client (máy khách) trong file Program.cs:
app.MapGrpcService<GreeterService>();
Để tìm hiểu thêm, hãy xem gRPC services với ASP.NET Core.
Gọi các gRPC service bằng .NET client
Các gRPC client (máy khách) là các kiểu client (máy khách) cụ thể được tạo ra từ các file .proto. Client (máy khách) gRPC cụ thể có các phương thức tương ứng với gRPC service (dịch vụ) trong file .proto.
var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(
new HelloRequest { Name = "World" });
Console.WriteLine(response.Message);Một gRPC client (máy khách) được tạo ra bằng cách sử dụng một channel (kênh), đại diện cho một kết nối tồn tại lâu dài tới một gRPC service (dịch vụ). Một channel (kênh) có thể được tạo ra bằng GrpcChannel.ForAddress.
Để biết thêm thông tin về việc tạo các client (máy khách) và gọi các phương thức service (dịch vụ) khác nhau, hãy xem Gọi các gRPC service bằng .NET client.