ASP.NET Core: Các dịch vụ và máy khách gRPC code-first với .NET
Trong bài viết này
gRPC code-first sử dụng các loại .NET để định nghĩa hợp đồng dịch vụ và tin nhắn.
Code-first là một lựa chọn tốt khi toàn bộ hệ thống sử dụng .NET:
- Các loại hợp đồng dữ liệu và dịch vụ .NET có thể được chia sẻ giữa máy chủ .NET và máy khách.
- Tránh sự cần thiết phải định nghĩa hợp đồng trong file
.proto
và tạo code.
Code-first không được khuyến nghị sử dụng trong các hệ thống đa ngôn ngữ có nhiều ngôn ngữ. Không thể sử dụng các loại hợp đồng dữ liệu và dịch vụ .NET với các nền tảng không phải .NET. Để gọi dịch vụ gRPC được viết bằng code-first, các nền tảng khác phải tạo hợp đồng .proto
phù hợp với dịch vụ.
protobuf-net.Grpc
Quan trọng
Để được trợ giúp về protobuf-net.Grpc, hãy truy cập trang web protobuf-net.Grpc hoặc tạo sự cố (issue) trên kho lưu trữ protobuf-net.Grpc GitHub.
protobuf-net.Grpc là một dự án cộng đồng và không được Microsoft hỗ trợ. Nó bổ sung thêm hỗ trợ code-first cho Grpc.AspNetCore
và Grpc.Net.Client
. Nó sử dụng các loại .NET được chú thích bằng các attribute để định nghĩa các tin nhắn và dịch vụ gRPC của ứng dụng.
Bước đầu tiên để tạo dịch vụ gRPC code-first là định nghĩa hợp đồng code:
- Tạo một dự án mới sẽ được chia sẻ bởi máy chủ và máy khách.
- Thêm tham chiếu gói protobuf-net.Grpc.
- Tạo các loại hợp đồng dịch vụ và dữ liệu.
using ProtoBuf.Grpc;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Threading.Tasks;
namespace Shared.Contracts;
[DataContract]
public class HelloReply
{
[DataMember(Order = 1)]
public string Message { get; set; }
}
[DataContract]
public class HelloRequest
{
[DataMember(Order = 1)]
public string Name { get; set; }
}
[ServiceContract]
public interface IGreeterService
{
[OperationContract]
Task<HelloReply> SayHelloAsync(HelloRequest request,
CallContext context = default);
}
Đoạn code trên:
- Định nghĩa tin nhắn
HelloRequest
vàHelloReply
. - Định nghĩa interface hợp đồng
IGreeterService
với phương thức gRPCSayHelloAsync
đơn nhất.
Hợp đồng dịch vụ được triển khai trên máy chủ và được gọi từ máy khách.
Các phương thức được định nghĩa trên interface dịch vụ phải khớp với một số chữ ký (signature) nhất định tùy thuộc vào việc chúng có:
- Đơn nhất
- Truyền phát máy chủ
- Truyền phát máy khách
- Truyền phát hai chiều
Để biết thêm thông tin về cách định nghĩa hợp đồng dịch vụ, hãy xem tài liệu bắt đầu protobuf-net.Grpc.
Tạo dịch vụ gRPC code-first
Để thêm dịch vụ code gRPC đầu tiên vào ứng dụng ASP.NET Core:
-
Thêm tham chiếu gói protobuf-net.Grpc.AspNetCore.
-
Thêm một tham chiếu đến dự án hợp đồng mã được chia sẻ.
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <ItemGroup> <PackageReference Include="protobuf-net.Grpc.AspNetCore" Version="1.0.152" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\Shared\Shared.Contracts.csproj" /> </ItemGroup> </Project>
-
Tạo một file
GreeterService.cs
mới và thực thi interface dịch vụIGreeterService
:using Shared.Contracts; using ProtoBuf.Grpc; public class GreeterService : IGreeterService { public Task<HelloReply> SayHelloAsync(HelloRequest request, CallContext context = default) { return Task.FromResult( new HelloReply { Message = $"Hello {request.Name}" }); } }
-
Cập nhật file
Program.cs
:using ProtoBuf.Grpc.Server; var builder = WebApplication.CreateBuilder(args); // Additional configuration is required to successfully run gRPC on macOS. // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682 // Add services to the container. builder.Services.AddCodeFirstGrpc(); var app = builder.Build(); // Configure the HTTP request pipeline. app.MapGrpcService<GreeterService>(); app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); app.Run();
Code được đánh dấu ở trên cập nhật nội dung sau:
AddCodeFirstGrpc
đăng ký các dịch vụ cho phép code-first.MapGrpcService<GreeterService>
thêm điểm cuối dịch vụ code-first.
Các dịch vụ gRPC được triển khai bằng code-first và các file .proto
có thể cùng tồn tại trong cùng một ứng dụng. Tất cả các dịch vụ gRPC đều sử dụng cấu hình dịch vụ gRPC.
Tạo máy khách gRPC code-first
Máy khách gRPC code-first sử dụng hợp đồng dịch vụ để gọi các dịch vụ gRPC.
-
Trong file
.csproj
máy khách gRPC:- Thêm tham chiếu gói protobuf-net.Grpc.
- Thêm tham chiếu gói Grpc.Net.Client.
- Thêm một tham chiếu đến dự án hợp đồng mã được chia sẻ.
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Grpc.Net.Client" Version="2.52.0" /> <PackageReference Include="protobuf-net.Grpc" Version="1.0.152" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\Shared\Shared.Contracts.csproj" /> </ItemGroup> </Project>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Grpc.Net.Client" Version="2.52.0" />
<PackageReference Include="protobuf-net.Grpc" Version="1.0.152" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Shared.Contracts.csproj" />
</ItemGroup>
</Project>
-
Cập nhật máy khách
program.cs
// See https://aka.ms/new-console-template for more information using Grpc.Net.Client; using ProtoBuf.Grpc.Client; using Shared.Contracts; namespace GrpcGreeterClient; internal class Program { private static async Task Main(string[] args) { using var channel = GrpcChannel.ForAddress("https://localhost:7184"); var client = channel.CreateGrpcService<IGreeterService>(); var reply = await client.SayHelloAsync( new HelloRequest { Name = "GreeterClient" }); Console.WriteLine($"Greeting: {reply.Message}"); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } }
Đoạn code Program.cs
máy khách gRPC ở trên:
- Tạo kênh gRPC.
- Tạo máy khách code-first từ kênh bằng phương thức mở rộng
CreateGrpcService<IGreeterService>
. - Gọi dịch vụ gRPC bằng
SayHelloAsync
.
Máy khách gRPC code-first được tạo từ một kênh. Cũng giống như máy khách thông thường, máy khách code-first sử dụng cấu hình kênh của nó.
Xem hoặc tải xuống code mẫu ( cách tải xuống )