ASP.NET Core: Dịch vụ gRPC với ASP.NET Core


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. Điều kiện tiên quyết
  2. Bắt đầu với dịch vụ gRPC trong ASP.NET Core
  3. Thêm dịch vụ gRPC vào ứng dụng ASP.NET Core
  4. Tùy chọn máy chủ
  5. Kestrel
  6. IIS
  7. HTTP.sys
  8. Lưu trữ gRPC trong các dự án không phải ASP.NET Core
  9. Tích hợp với API ASP.NET Core
  10. Tài nguyên bổ sung

Bài viết này chỉ ra cách bắt đầu với các dịch vụ gRPC bằng ASP.NET Core.

Điều kiện tiên quyết

Visual Studio 2022 có cài đặt ASP.NET and web development.

Khối lượng công việc của trình cài đặt VS22

Bắt đầu với dịch vụ gRPC trong ASP.NET Core

Xem hoặc tải xuống code mẫu ( cách tải xuống ).

Xem Bắt đầu với các dịch vụ gRPC để biết hướng dẫn chi tiết về cách tạo dự án gRPC.

Thêm dịch vụ gRPC vào ứng dụng ASP.NET Core

gRPC yêu cầu gói Grpc.AspNetCore.

Định cấu hình gRPC

Trong Program.cs:

  • gRPC được kích hoạt bằng phương thức AddGrpc.
  • Mỗi dịch vụ gRPC được thêm vào quy trình định tuyến thông qua phương thức MapGrpcService.
using GrpcGreeter.Services;

var builder = WebApplication.CreateBuilder(args);

// Cần có cấu hình bổ sung để chạy thành công gRPC trên macOS.
// Để biết hướng dẫn về cách cấu hình máy khách Kestrel và gRPC trên macOS,
// hãy truy cập https://go.microsoft.com/fwlink/?linkid=2099682

// Thêm dịch vụ vào container.
builder.Services.AddGrpc();

var app = builder.Build();

// Định cấu hình đường dẫn yêu cầu HTTP.
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();

Nếu bạn muốn xem các nhận xét về mã được dịch sang các ngôn ngữ khác ngoài tiếng Anh, hãy cho chúng tôi biết trong vấn đề thảo luận GitHub này.

Middleware và các tính năng của ASP.NET Core chia sẻ đường dẫn định tuyến, do đó, một ứng dụng có thể được định cấu hình để phục vụ các trình xử lý yêu cầu bổ sung. Các trình xử lý yêu cầu bổ sung, chẳng hạn như Controller MVC, hoạt động song song với các dịch vụ gRPC đã định cấu hình.

Tùy chọn máy chủ

Các dịch vụ gRPC có thể được lưu trữ bởi tất cả các máy chủ ASP.NET Core tích hợp.

  • Kestrel
  • TestServer
  • IIS†
  • HTTP.sys†

† Yêu cầu .NET 5 và Windows 11 Build 22000 hoặc Windows Server 2022 Build 20348 trở lên.

Để biết thêm thông tin về cách chọn máy chủ phù hợp cho ứng dụng ASP.NET Core, hãy xem Triển khai máy chủ web trong ASP.NET Core.

Kestrel

Kestrel là một máy chủ web đa nền tảng dành cho ASP.NET Core. Kestrel tập trung vào hiệu suất cao và sử dụng bộ nhớ, nhưng nó không có một số tính năng nâng cao trong HTTP.sys như chia sẻ cổng.

Endpoint gRPC của Kestrel:

HTTP/2

gRPC yêu cầu HTTP/2. gRPC cho ASP.NET Core xác thực HttpRequest.Protocol là HTTP/2.

Kestrel hỗ trợ HTTP/2 trên hầu hết các hệ điều hành hiện đại. Endpoint Kestrel được định cấu hình để hỗ trợ kết nối HTTP/1.1 và HTTP/2 theo mặc định.

TLS

Endpoint Kestrel dùng cho gRPC phải được bảo mật bằng TLS. Trong quá trình phát triển, endpoint được bảo mật bằng TLS sẽ tự động được tạo tại https://localhost:5001 khi có chứng chỉ phát triển ASP.NET Core. Không cần cấu hình. Tiền tố https xác minh điểm cuối Kestrel đang sử dụng TLS.

Trong môi trường production, TLS phải được cấu hình rõ ràng. Trong ví dụ appsettings.json sau, endpoint HTTP/2 được bảo mật bằng TLS được cung cấp:

{
  "Kestrel": {
    "Endpoints": {
      "HttpsInlineCertFile": {
        "Url": "https://localhost:5001",
        "Protocols": "Http2",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      }
    }
  }
}

Ngoài ra, điểm cuối Kestrel có thể được định cấu hình trong Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel(options =>
{
    options.Listen(IPAddress.Any, 5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http2;
        listenOptions.UseHttps("<path to .pfx file>",
            "<certificate password>");
    });
});

Để biết thêm thông tin về cách bật TLS với Kestrel, hãy xem Cấu hình điểm cuối HTTPS của Kestrel.

Đàm phán giao thức

TLS được sử dụng cho nhiều mục đích hơn là bảo mật thông tin liên lạc. Quá trình bắt tay Đàm phán Giao thức Lớp Ứng dụng (ALPN) TLS được sử dụng để đàm phán giao thức kết nối giữa máy khách và máy chủ khi endpoint hỗ trợ nhiều giao thức. Quá trình đàm phán này xác định xem kết nối sử dụng HTTP/1.1 hay HTTP/2.

Nếu endpoint (điểm cuối) HTTP/2 được định cấu hình không có TLS thì ListenOptions.Protocols của điểm cuối phải được đặt thành HttpProtocols.Http2. Một điểm cuối có nhiều giao thức, chẳng hạn như HttpProtocols.Http1AndHttp2 không thể sử dụng được nếu không có TLS vì không có sự đàm phán. Tất cả các kết nối đến điểm cuối không bảo mật đều được đặt mặc định là HTTP/1.1 và lệnh gọi gRPC đều không thành công.

Để biết thêm thông tin về cách bật HTTP/2 và TLS với Kestrel, hãy xem Cấu hình điểm cuối Kestrel.

Ghi chú

macOS không hỗ trợ ASP.NET Core gRPC với TLS trước bản .NET 8. Cần có cấu hình bổ sung để chạy thành công các dịch vụ gRPC trên macOS khi sử dụng .NET 7 trở về trước. Để biết thêm thông tin, hãy xem Không thể khởi động ứng dụng ASP.NET Core gRPC trên macOS.

IIS

Dịch vụ thông tin Internet (IIS) là một Máy chủ Web linh hoạt, an toàn và dễ quản lý để lưu trữ các ứng dụng web, bao gồm ASP.NET Core. Cần có .NET 5 và Windows 11 Build 22000 hoặc Windows Server 2022 Build 20348 trở lên để lưu trữ các dịch vụ gRPC với IIS.

IIS phải được cấu hình để sử dụng TLS và HTTP/2. Để biết thêm thông tin, hãy xem Sử dụng ASP.NET Core với HTTP/2 trên IIS.

HTTP.sys

HTTP.sys là máy chủ web dành cho ASP.NET Core chỉ chạy trên Windows. Cần có .NET 5 và Windows 11 Build 22000 hoặc Windows Server 2022 Build 20348 trở lên để lưu trữ các dịch vụ gRPC với HTTP.sys.

HTTP.sys phải được cấu hình để sử dụng TLS và HTTP/2. Để biết thêm thông tin, hãy xem hỗ trợ HTTP/2 của máy chủ web HTTP.sys.

Lưu trữ gRPC trong các dự án không phải ASP.NET Core

Máy chủ gRPC ASP.NET Core thường được tạo từ mẫu gRPC. Tệp dự án được tạo bởi mẫu sử dụng Microsoft.NET.SDK.Web làm SDK:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
  </ItemGroup>

</Project>

Giá trị SDK Microsoft.NET.SDK.Web tự động thêm tham chiếu đến framework ASP.NET Core. Tham chiếu này cho phép ứng dụng sử dụng các loại ASP.NET Core cần thiết để lưu trữ máy chủ.

Bạn có thể thêm máy chủ gRPC vào các dự án không phải ASP.NET Core bằng các cài đặt tệp dự án sau:

<Project Sdk="Microsoft.NET.Sdk">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
    
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

</Project>

File dự án trên:

  • Không sử dụng Microsoft.NET.SDK.Web làm SDK.
  • Thêm tham chiếu framework vào Microsoft.AspNetCore.App.
    • Tham chiếu framework cho phép các ứng dụng không phải ASP.NET Core, chẳng hạn như Dịch vụ Windows, ứng dụng WPF hoặc ứng dụng WinForms sử dụng API ASP.NET Core.
    • Ứng dụng hiện có thể sử dụng API ASP.NET Core để khởi động máy chủ ASP.NET Core.
  • Thêm yêu cầu gRPC:

Để biết thêm thông tin về cách sử dụng Microsoft.AspNetCore.App tham chiếu framework, hãy xem Sử dụng framework chia sẻ ASP.NET Core.

Tích hợp với API ASP.NET Core

Các dịch vụ gRPC có toàn quyền truy cập vào các tính năng của ASP.NET Core như Dependency Insert (DI) và Logging. Ví dụ: việc triển khai dịch vụ có thể giải quyết dịch vụ ghi nhật ký từ vùng chứa DI thông qua hàm tạo:

public class GreeterService : Greeter.GreeterBase
{
    public GreeterService(ILogger<GreeterService> logger)
    {
    }
}

Theo mặc định, việc triển khai dịch vụ gRPC có thể giải quyết các dịch vụ DI khác trong bất kỳ thời gian nào (Singleton, Scoped hoặc Transient).

Giải quyết HttpContext trong các phương thức gRPC

API gRPC cung cấp quyền truy cập vào một số dữ liệu message HTTP/2, chẳng hạn như phương thức, máy chủ, tiêu đề (header) và đoạn giới thiệu (trailer). Quyền truy cập thông qua đối số ServerCallContext được truyền cho từng phương thức gRPC:

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name
        });
    }
}

ServerCallContext không cung cấp quyền truy cập đầy đủ HttpContext vào tất cả các API ASP.NET. Phương thức mở rộng GetHttpContext cung cấp quyền truy cập đầy đủ vào thể hiện (representing) HttpContext message HTTP/2 cơ bản trong API ASP.NET:

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        var httpContext = context.GetHttpContext();
        var clientCertificate = httpContext.Connection.ClientCertificate;

        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name + " from " + clientCertificate.Issuer
        });
    }
}

Tài nguyên bổ sung

Nguồn: learn.microsoft.com
» Tiếp: gRPC trên nền tảng hỗ trợ .NET
« Trước: Giả lập máy khách gRPC trong các thử nghiệm
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 !!!