ASP.NET Core: Tích hợp factory máy khách gRPC trong .NET
Trong bài viết này
- Đăng ký máy khách gRPC
- Định cấu hình httpHandler
- Định cấu hình trình chặn
- Định cấu hình kênh
- Thông tin xác thực lời gọi
- Truyền bá về thời hạn và hủy bỏ
- Máy khách được đặt tên
- Tài nguyên bổ sung
Tích hợp với gRPC HttpClientFactory
cung cấp một cách tập trung để tạo các máy khách gRPC. Nó có thể được sử dụng như một giải pháp thay thế cho việc định cấu hình các phiên bản máy khách gRPC độc lập. Tích hợp factory có sẵn trong gói NuGet Grpc.Net.ClientFactory.
Factory mang lại những lợi ích sau:
- Cung cấp một vị trí trung tâm để định cấu hình các phiên bản máy khách gRPC logic.
- Quản lý vòng đời của cơ sở
HttpClientMessageHandler
. - Tự động truyền bá thời hạn và hủy trong dịch vụ ASP.NET Core gRPC.
Đăng ký máy khách gRPC
Để đăng ký máy khách gRPC, phương thức AddGrpcClient
mở rộng chung có thể được sử dụng trong một phiên bản của WebApplicationBuilder tại điểm vào của ứng dụng trong Program.cs
, chỉ định địa chỉ dịch vụ và lớp máy khách đã nhập gRPC:
builder.Services.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
});
Loại máy khách gRPC được đăng ký là tạm thời với tính năng chèn phụ thuộc (DI). Giờ đây, máy khách có thể được đưa vào và sử dụng trực tiếp theo các loại do DI tạo. Controller ASP.NET Core MVC, trung tâm SignalR và dịch vụ gRPC là những nơi mà máy khách gRPC có thể được đưa vào tự động:
public class AggregatorService : Aggregator.AggregatorBase
{
private readonly Greeter.GreeterClient _client;
public AggregatorService(Greeter.GreeterClient client)
{
_client = client;
}
public override async Task SayHellos(HelloRequest request,
IServerStreamWriter<HelloReply> responseStream, ServerCallContext context)
{
// Forward the call on to the greeter service
using (var call = _client.SayHellos(request))
{
await foreach (var response in call.ResponseStream.ReadAllAsync())
{
await responseStream.WriteAsync(response);
}
}
}
}
Định cấu hình httpHandler
HttpClientFactory
tạo ra ứng dụng HttpMessageHandler
được sử dụng bởi máy khách gRPC. Các phương thức tiêu chuẩn HttpClientFactory
có thể được sử dụng để thêm middleware yêu cầu gửi đi hoặc để định cấu hình cơ bản HttpClientHandler
của HttpClient
:
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.ConfigurePrimaryHttpMessageHandler(() =>
{
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(LoadCertificate());
return handler;
});
Để biết thêm thông tin, hãy xem Tạo yêu cầu HTTP bằng IHttpClientFactory.
Định cấu hình trình chặn
Các thiết bị chặn gRPC có thể được thêm vào máy khách bằng phương thức AddInterceptor
.
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.AddInterceptor<LoggingInterceptor>();
Đoạn code trên:
- Đăng ký kiểu
GreeterClient
. - Định cấu hình
LoggingInterceptor
cho máy khách này.LoggingInterceptor
được tạo một lần và được chia sẻ giữa các thể hiện củaGreeterClient
.
Theo mặc định, thiết bị chặn được tạo một lần và được chia sẻ giữa các máy khách. Hành vi này có thể được ghi đè bằng cách chỉ định phạm vi khi đăng ký thiết bị chặn. Factory khách có thể được cấu hình để tạo một thiết bị chặn mới cho mỗi máy khách bằng cách chỉ định InterceptorScope.Client
.
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.AddInterceptor<LoggingInterceptor>(InterceptorScope.Client);
Việc tạo các thiết bị chặn trong phạm vi máy khách rất hữu ích khi một thiết bị chặn yêu cầu các dịch vụ trong phạm vi có phạm vi hoặc tạm thời từ DI.
Có thể sử dụng thông tin xác thực kênh hoặc thiết bị chặn gRPC để gửi siêu dữ liệu Authorization
với mỗi yêu cầu. Để biết thêm thông tin về cách định cấu hình xác thực, hãy xem Gửi mã thông báo mang với factory khách gRPC.
Định cấu hình kênh
Cấu hình bổ sung có thể được áp dụng cho kênh bằng phương thức ConfigureChannel
:
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.ConfigureChannel(o =>
{
o.Credentials = new CustomCredentials();
});
ConfigureChannel
được truyền một thể hiện của GrpcChannelOptions
. Để biết thêm thông tin, hãy xem cấu hình tùy chọn máy khách.
Lưu ý
Một số property được thiết lập trên GrpcChannelOptions
trước khi ConfigureChannel
chạy lệnh gọi lại:
HttpHandler
được đặt thành kết quả từ configurePrimaryHttpMessageHandler.LoggerFactory
được đặt thành ILoggerFactory được giải quyết từ DI.
Những giá trị này có thể bị ghi đè bởi ConfigureChannel
.
Thông tin xác thực lời gọi
Tiêu đề xác thực có thể được thêm vào lệnh gọi gRPC bằng phương thức AddCallCredentials
:
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.AddCallCredentials((context, metadata) =>
{
if (!string.IsNullOrEmpty(_token))
{
metadata.Add("Authorization", $"Bearer {_token}");
}
return Task.CompletedTask;
});
Để biết thêm thông tin về cách định cấu hình thông tin xác thực lời gọi, hãy xem Mã thông báo Bearer với factory khách gRPC.
Truyền bá về thời hạn và hủy bỏ
Các máy khách gRPC do factory tạo ra trong dịch vụ gRPC có thể được định cấu hình EnableCallContextPropagation()
để tự động truyền thời hạn và mã thông báo hủy cho các lời gọi con. Phương thức mở rộng EnableCallContextPropagation()
có sẵn trong gói NuGet Grpc.AspNetCore.Server.ClientFactory.
Truyền bá ngữ cảnh lời gọi hoạt động bằng cách đọc thời hạn và mã thông báo hủy từ ngữ cảnh yêu cầu gRPC hiện tại và tự động truyền chúng đến các lời gọi đi do ứng dụng khách gRPC thực hiện. Truyền bá ngữ cảnh lời gọi là một cách tuyệt vời để đảm bảo rằng các kịch bản gRPC lồng nhau, phức tạp luôn truyền bá thời hạn và sự hủy bỏ.
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.EnableCallContextPropagation();
Theo mặc định, EnableCallContextPropagation
sẽ phát sinh lỗi nếu ứng dụng khách được sử dụng bên ngoài ngữ cảnh của lệnh gọi gRPC. Lỗi này được thiết kế để cảnh báo bạn rằng không có ngữ cảnh lời gọi nào cần truyền bá. Nếu bạn muốn sử dụng ứng dụng khách bên ngoài ngữ cảnh lời gọi, hãy khắc phục lỗi khi ứng dụng khách được định cấu hình bằng SuppressContextNotFoundErrors
:
builder.Services
.AddGrpcClient<Greeter.GreeterClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
})
.EnableCallContextPropagation(o => o.SuppressContextNotFoundErrors = true);
Để biết thêm thông tin về thời hạn và việc hủy RPC, hãy xem Dịch vụ gRPC đáng tin cậy có thời hạn và việc hủy.
Máy khách được đặt tên
Thông thường, loại máy khách gRPC được đăng ký một lần và sau đó được DI đưa trực tiếp vào hàm tạo của loại đó. Tuy nhiên, có những trường hợp sẽ hữu ích nếu có nhiều cấu hình cho một máy khách. Ví dụ: một ứng dụng khách thực hiện lời gọi gRPC có và không có xác thực.
Nhiều máy khách cùng loại có thể được đăng ký bằng cách đặt tên cho mỗi máy khách. Mỗi máy khách được đặt tên có thể có cấu hình riêng. Phương thức mở rộng generic AddGrpcClient
có tình trạng quá tải bao gồm tham số tên:
builder.Services
.AddGrpcClient<Greeter.GreeterClient>("Greeter", o =>
{
o.Address = new Uri("https://localhost:5001");
});
builder.Services
.AddGrpcClient<Greeter.GreeterClient>("GreeterAuthenticated", o =>
{
o.Address = new Uri("https://localhost:5001");
})
.ConfigureChannel(o =>
{
o.Credentials = new CustomCredentials();
});
Đoạn code trên:
- Đăng ký kiểu
GreeterClient
hai lần, chỉ định một tên duy nhất cho mỗi kiểu. - Định cấu hình các cài đặt khác nhau cho từng máy khách được đặt tên. Việc đăng ký
GreeterAuthenticated
sẽ thêm thông tin xác thực vào kênh để các lời gọi gRPC được thực hiện với kênh đó được xác thực.
Máy khách gRPC có tên được tạo trong mã ứng dụng bằng cách sử dụng GrpcClientFactory
. Kiểu và tên của máy khách mong muốn được chỉ định bằng phương thức generic GrpcClientFactory.CreateClient
:
public class AggregatorService : Aggregator.AggregatorBase
{
private readonly Greeter.GreeterClient _client;
public AggregatorService(GrpcClientFactory grpcClientFactory)
{
_client = grpcClientFactory.CreateClient<Greeter.GreeterClient>("GreeterAuthenticated");
}
}
Tài nguyên bổ sung
- Gọi các dịch vụ gRPC bằng máy khách .NET
- Dịch vụ gRPC đáng tin cậy có thời hạn và hủy bỏ
- Thực hiện các yêu cầu HTTP bằng IHttpClientFactory trong ASP.NET Core