Xây dựng dịch vụ gRPC bằng C#

1. Tổng quan

gRPC là một khung và bộ công cụ cho lệnh gọi quy trình từ xa (RPC) trung lập về ngôn ngữ và nền tảng do Google phát triển. Lớp này cho phép bạn xác định dịch vụ bằng Vùng đệm giao thức, bộ công cụ và ngôn ngữ chuyển đổi tuần tự nhị phân đặc biệt mạnh mẽ. Sau đó, bạn có thể tạo các mã giả lập máy khách và máy chủ tương thích từ định nghĩa dịch vụ bằng nhiều ngôn ngữ.

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách tạo dịch vụ C# để hiển thị một API bằng khung gRPC. Bạn tương tác với dịch vụ này bằng ứng dụng bảng điều khiển được viết bằng C# và sử dụng cùng một nội dung mô tả dịch vụ với dịch vụ.

Kiến thức bạn sẽ học được

  • Ngôn ngữ vùng đệm giao thức.
  • Cách triển khai dịch vụ gRPC bằng C#.
  • Cách triển khai ứng dụng gRPC bằng C#.
  • Cách cập nhật dịch vụ gRPC.

Bạn cần có

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ có thể đọc Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm sử dụng Google Cloud Platform?

Người mới tập Trung cấp Thành thạo

2. Tải xuống và tạo mẫu C# gRPC

Tải các mẫu xuống

Tải kho lưu trữ mẫu C# của gRPC xuống dưới dạng tệp zip và giải nén.

Ngoài ra, bạn có thể sao chép kho lưu trữ git của nó.

git clone https://github.com/meteatamel/grpc-samples-dotnet.git

Dù bằng cách nào thì bạn cũng nên có một thư mục grpc-samples-dotnet với nội dung sau:

d056832ff4ce0c8f.png

Xây dựng cuộc cách mạng

Thư mục ứng dụng mẫu chứa GrpcSamples.sln, một giải pháp Visual Studio. Nhấp đúp để mở giải pháp này trong Visual Studio. Bạn sẽ thấy một giải pháp với một số dự án.

61da9ddc86c08019.pngS

Chúng ta sẽ tìm hiểu chi tiết hơn về các dự án trong phần tiếp theo, nhưng trước tiên, hãy cùng tạo dự án. Chuyển đến Build > Build Solution hoặc Ctrl + Shift + B để tạo giải pháp. Thao tác này sẽ tải tất cả phần phụ thuộc từ NuGet xuống rồi biên dịch ứng dụng.

Cuối cùng, bạn sẽ thấy thông báo Build succeeded trong dữ liệu đầu ra của bảng điều khiển Visual Studio.

3. Khám phá mẫu Greeter

Greeter là một mẫu gRPC đơn giản, trong đó ứng dụng gửi yêu cầu kèm theo tên và máy chủ phản hồi bằng thông báo theo sau là tên. Có một dự án Greeter bao gồm định nghĩa dịch vụ chung (tệp proto) mà ứng dụng và máy chủ dựa vào đó.

Dự án Greeter

Đây là dự án chung được chia sẻ giữa ứng dụng và máy chủ. Dịch vụ này có greeter.proto là định nghĩa dịch vụ gRPC mà ứng dụng và máy chủ sử dụng. Định nghĩa dịch vụ khai báo một dịch vụ gRPC có tên là GreetingService. Dịch vụ này có phương thức greeting nhận HelloRequest làm dữ liệu đầu vào và HelloResponse làm đầu ra.

service GreetingService {
    rpc greeting(HelloRequest) returns (HelloResponse);
}

Đây là phương thức đơn phân (tức là không truyền trực tuyến), trong đó ứng dụng gửi một yêu cầu và nhận một phản hồi duy nhất từ máy chủ. Bạn có thể khám phá phần còn lại của nội dung greeter.proto. Dự án này cũng có một tập lệnh tên là generate_protos.bat. Tập lệnh này có thể được dùng để tạo mã giả lập máy khách và máy chủ từ tệp proto. Dự án đã chứa các mã giả lập máy khách và máy chủ được tạo, vì vậy, bạn không phải tự tạo các mã này. Tuy nhiên, nếu bạn thay đổi điều gì đó về tệp định nghĩa dịch vụ, bạn sẽ cần phải chạy tập lệnh này để tạo lại các mã giả lập.

Máy chủ của Hy Lạp

Đây là dự án dành cho máy chủ gRPC. Program.cs là điểm truy cập chính nơi thiết lập phương thức triển khai cổng và máy chủ. Lớp quan trọng là GreeterServiceImpl.cs. Hàm này có một phương thức greeting giúp triển khai chức năng thực tế.

public override Task<HelloResponse> greeting(HelloRequest request,
       ServerCallContext context)
{
    return Task.FromResult(new HelloResponse { 
          Greeting = "Hello " + request.Name });
}

Ứng dụng Greeter

Đây là phía máy khách của dịch vụ gRPC. Lớp này cũng có Program.cs làm điểm truy cập. Công cụ này tạo một kênh để giao tiếp với máy chủ rồi tạo một ứng dụng khách với kênh này từ mã giả lập đã tạo. Sau đó, mã này sẽ tạo một yêu cầu rồi gửi yêu cầu đó đến máy chủ bằng mã ứng dụng khách.

4. Chạy mẫu Greeter

Trước tiên, hãy khởi động Máy chủ Greeter. Mở cửa sổ lệnh rồi chuyển đến thư mục bin > Debug của Greeter Server rồi chạy tệp thực thi. Bạn sẽ thấy máy chủ đang lắng nghe.

> C:\grpc-samples-dotnet\GreeterServer\bin\Debug>GreeterServer.exe
GreeterServer listening on port 50051
Press any key to stop the server...

Tiếp theo, hãy chạy Ứng dụng Greeter. Trong một dấu nhắc lệnh riêng, hãy chuyển đến thư mục bin > Debug của Greeter Server rồi chạy tệp thực thi. Bạn sẽ thấy máy khách gửi yêu cầu và nhận phản hồi từ máy chủ.

> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
Press any key to exit...

5. Cập nhật mẫu Greeter

Hãy xem quy trình cập nhật dịch vụ của chúng tôi. Thêm một phương thức mới vào dịch vụ gRPC của chúng tôi có tên là "tạm biệt". Phương thức này sẽ trả về lời tạm biệt thay vì gửi lời chào đến ứng dụng khách.

Bước đầu tiên là cập nhật tệp định nghĩa dịch vụ greeter.proto.

service GreetingService {
    rpc greeting(HelloRequest) returns (HelloResponse);
    
    rpc goodbye(HelloRequest) returns (HelloResponse);
}

Tiếp theo, bạn cần tạo lại mã giả lập máy khách và máy chủ. Trong dấu nhắc lệnh, hãy chạy generate_protos.bat. Sau khi tạo mã giả lập, bạn có thể cần làm mới dự án Visual Studio của mình để nhận mã mới.

Cuối cùng, hãy cập nhật mã ứng dụng và mã máy chủ để tận dụng phương thức mới này. Trong dịch vụ, hãy cập nhật GreeterServiceImpl.cs và thêm một phương thức goodbye mới.

public override Task<HelloResponse> goodbye(HelloRequest request,
       ServerCallContext context)
{
    return Task.FromResult(new HelloResponse { 
          Greeting = "Goodbye " + request.Name });
}

Trong ứng dụng, hãy gọi phương thức goodbye trong Program.cs.

response = client.goodbye(request);
Console.WriteLine("GreeterClient received response: " 
                       + response.Greeting);

Tạo lại dự án rồi chạy lại máy chủ và ứng dụng. Giờ bạn sẽ thấy khách hàng nhận được thông báo tạm biệt.

> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
GreeterClient received response: Goodbye Mete - on C#
Press any key to exit...

6. Khám phá mẫu Chat

Ngoài ra, còn có một dự án ChatServerChatWindowsClient trong giải pháp này. Đúng như tên gọi, đây là cặp ứng dụng và máy chủ dành cho ứng dụng trò chuyện đơn giản. Dự án Chat có tệp định nghĩa dịch vụ tên là chat.proto. Định nghĩa này xác định ChatService bằng phương thức chat.

service ChatService {
 rpc chat(stream ChatMessage) returns (stream ChatMessageFromServer);
}

Điều quan trọng ở đây là cả tin nhắn trò chuyện đến và đi đều được đánh dấu bằng từ khoá stream. Về cơ bản, điều này biến kết nối thành một luồng hai chiều nơi ứng dụng và máy chủ có thể gửi thông báo cho nhau bất kỳ lúc nào; giải pháp hoàn hảo cho ứng dụng trò chuyện.

Bạn có thể khám phá thêm, tạo và chạy mẫu để xem mẫu hoạt động như một bài tập như thế nào.

7. Xin chúc mừng!

Nội dung đã đề cập

  • Ngôn ngữ vùng đệm giao thức.
  • Cách triển khai dịch vụ gRPC bằng C#.
  • Cách triển khai ứng dụng gRPC bằng C#.
  • Cách cập nhật dịch vụ gRPC.

Các bước tiếp theo