ASP.NET Core: Các dịch vụ và máy khách gRPC code-first với .NET


Khóa học qua video:
Lập trình Python All C# Lập trình C Java SQL Server PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Trong bài viết này

  1. protobuf-net.Grpc
  2. Tạo dịch vụ gRPC code-first
  3. Tạo máy khách gRPC code-first
  4. Tài nguyên bổ sung

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 gRPC SayHelloAsync đơ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 )

Tài nguyên bổ sung

Nguồn: learn.microsoft.com
» Tiếp: Kiểm tra tình trạng gRPC trong ASP.NET Core
« Trước: Giao tiếp giữa các tiến trình với socket tên miền gRPC và Unix
Khóa học qua video:
Lập trình Python All C# Lập trình C Java SQL Server PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!