Kiểm thử dịch vụ gRPC với gRPCurl và gRPCui trong ASP.NET Core
Có các công cụ dành cho gRPC giúp nhà phát triển kiểm thử dịch vụ mà không cần xây dựng ứng dụng client:
- gRPCurl là công cụ dòng lệnh mã nguồn mở hỗ trợ tương tác với các dịch vụ gRPC.
- gRPCui được xây dựng trên nền tảng gRPCurl và bổ sung giao diện web tương tác mã nguồn mở cho gRPC.
Bài viết này thảo luận về cách:
- Cài đặt gRPC server reflection (phản chiếu máy chủ gRPC) trong ứng dụng gRPC ASP.NET Core.
- Tương tác với gRPC bằng công cụ kiểm thử:
- Khám phá và kiểm thử dịch vụ gRPC với
grpcurl. - Tương tác với dịch vụ gRPC qua trình duyệt bằng
grpcui.
Lưu ý: Để tìm hiểu cách unit test dịch vụ gRPC, xem Test gRPC services in ASP.NET Core.
Cài đặt gRPC reflection
Công cụ phải biết hợp đồng Protobuf (giao thức Protobuf) của dịch vụ trước khi có thể gọi chúng. Có hai cách để làm điều này:
- Cài đặt gRPC reflection trên máy chủ. Các công cụ như gRPCurl sử dụng reflection để tự động khám phá hợp đồng dịch vụ.
- Thêm file
.protovào công cụ theo cách thủ công.
Sử dụng gRPC reflection dễ hơn. gRPC reflection thêm một dịch vụ gRPC mới vào ứng dụng để client có thể gọi và khám phá các dịch vụ.
gRPC ASP.NET Core có hỗ trợ tích hợp cho gRPC reflection thông qua gói Grpc.AspNetCore.Server.Reflection. Để cấu hình reflection trong ứng dụng:
- Thêm tham chiếu gói
Grpc.AspNetCore.Server.Reflection. - Đăng ký reflection trong
Program.cs: AddGrpcReflectionđể đăng ký các dịch vụ cho phép reflection.MapGrpcReflectionServiceđể thêm endpoint dịch vụ reflection.
builder.Services.AddGrpc();
builder.Services.AddGrpcReflection();
var app = builder.Build();
app.MapGrpcService<GreeterService>();
IWebHostEnvironment env = app.Environment;
if (env.IsDevelopment())
{
app.MapGrpcReflectionService();
}Khi gRPC reflection được cài đặt:
- Một dịch vụ gRPC reflection được thêm vào ứng dụng máy chủ.
- Các ứng dụng client hỗ trợ gRPC reflection có thể gọi dịch vụ reflection để khám phá các dịch vụ được lưu trữ bởi máy chủ.
- Các dịch vụ gRPC vẫn được gọi từ client. Reflection chỉ cho phép khám phá dịch vụ và không bỏ qua bảo mật phía máy chủ. Các endpoint được bảo vệ bởi xác thực và ủy quyền yêu cầu người gọi phải truyền thông tin xác thực để gọi thành công.
Bảo mật dịch vụ Reflection
gRPC reflection trả về danh sách các API khả dụng, có thể chứa thông tin nhạy cảm. Cần cẩn thận để hạn chế quyền truy cập vào dịch vụ gRPC reflection.
gRPC reflection thường chỉ cần thiết trong môi trường phát triển cục bộ. Để phát triển cục bộ, dịch vụ reflection chỉ nên được ánh xạ khi IsDevelopment trả về true:
if (env.IsDevelopment())
{
app.MapGrpcReflectionService();
}Quyền truy cập vào dịch vụ có thể được kiểm soát thông qua các phương thức mở rộng ủy quyền chuẩn của ASP.NET Core, chẳng hạn như AllowAnonymous và RequireAuthorization.
Ví dụ, nếu ứng dụng đã được cấu hình để yêu cầu ủy quyền theo mặc định, cấu hình endpoint gRPC reflection với AllowAnonymous để bỏ qua xác thực và ủy quyền.
if (env.IsDevelopment())
{
app.MapGrpcReflectionService().AllowAnonymous();
}gRPCurl
gRPCurl là công cụ dòng lệnh được tạo bởi cộng đồng gRPC. Các tính năng bao gồm:
- Gọi dịch vụ gRPC, bao gồm cả dịch vụ streaming (truyền dữ liệu liên tục).
- Khám phá dịch vụ sử dụng gRPC reflection.
- Liệt kê và mô tả dịch vụ gRPC.
- Hoạt động với cả máy chủ bảo mật (TLS) và không bảo mật (plain-text).
Để biết thông tin về tải xuống và cài đặt grpcurl, xem trang chủ gRPCurl trên GitHub.
Sử dụng grpcurl
Tham số -help giải thích các tùy chọn dòng lệnh của grpcurl:
$ grpcurl -help
Khám phá dịch vụ
Sử dụng động từ describe để xem các dịch vụ được định nghĩa bởi máy chủ. Chỉ định <port> là số cổng localhost của máy chủ gRPC. Số cổng được gán ngẫu nhiên khi dự án được tạo và được đặt trong Properties/launchSettings.json:
$ grpcurl localhost:<port> describe
greet.Greeter is a service:
service Greeter {
rpc SayHello ( .greet.HelloRequest ) returns ( .greet.HelloReply );
rpc SayHellos ( .greet.HelloRequest ) returns ( stream .greet.HelloReply );
}
grpc.reflection.v1alpha.ServerReflection is a service:
service ServerReflection {
rpc ServerReflectionInfo ( stream .grpc.reflection.v1alpha.ServerReflectionRequest ) returns ( stream .grpc.reflection.v1alpha.ServerReflectionResponse );
}Ví dụ trên:
- Chạy động từ
describetrên máy chủlocalhost:<port>. Trong đó<port>được gán ngẫu nhiên khi dự án máy chủ gRPC được tạo và đặt trongProperties/launchSettings.json. - In các dịch vụ và phương thức được trả về bởi gRPC reflection.
Greeterlà dịch vụ được triển khai bởi ứng dụng.ServerReflectionlà dịch vụ được thêm bởi góiGrpc.AspNetCore.Server.Reflection.
Kết hợp describe với tên dịch vụ, phương thức hoặc thông báo để xem chi tiết:
$ grpcurl localhost:<port> describe greet.HelloRequest
greet.HelloRequest is a message:
message HelloRequest {
string name = 1;
}Gọi dịch vụ gRPC
Gọi dịch vụ gRPC bằng cách chỉ định tên dịch vụ và phương thức cùng với tham số JSON biểu diễn thông báo yêu cầu. JSON được chuyển đổi thành Protobuf và gửi đến dịch vụ.
$ grpcurl -d '{ \"name\": \"World\" }' localhost:<port> greet.Greeter/SayHello
{
"message": "Hello World"
}Trong ví dụ trên:
- Tham số
-dchỉ định thông báo yêu cầu với JSON. Tham số này phải đứng trước địa chỉ máy chủ và tên phương thức. - Gọi phương thức
SayHellotrên dịch vụgreeter.Greeter. - In thông báo phản hồi dưới dạng JSON.
<port>được gán ngẫu nhiên khi dự án máy chủ gRPC được tạo và đặt trongProperties/launchSettings.json.
Ví dụ trên sử dụng \ để thoát ký tự ". Thoát " là cần thiết trong console PowerShell nhưng không được sử dụng trong một số console. Ví dụ, lệnh trước cho console macOS:
$ grpcurl -d '{ "name": "World" }' localhost:<port> greet.Greeter/SayHello
{
"message": "Hello World"
}gRPCui
gRPCui là giao diện web tương tác cho gRPC. gRPCui được xây dựng trên nền tảng gRPCurl. gRPCui cung cấp GUI (giao diện đồ họa người dùng) để khám phá và kiểm thử dịch vụ gRPC, tương tự như các công cụ HTTP như Swagger UI.
Để biết thông tin về tải xuống và cài đặt grpcui, xem trang chủ gRPCui trên GitHub.
Sử dụng grpcui
Chạy grpcui với địa chỉ máy chủ để tương tác như là tham số:
$ grpcui localhost:<port> gRPC Web UI available at http://127.0.0.1:55038/
Trong ví dụ trên, chỉ định <port> là số cổng localhost của máy chủ gRPC. Số cổng được gán ngẫu nhiên khi dự án được tạo và đặt trong Properties/launchSettings.json.
Công cụ khởi chạy cửa sổ trình duyệt với giao diện web tương tác. Các dịch vụ gRPC được tự động khám phá bằng gRPC reflection.