YARP Extensibility - Destination Resolvers (Bộ giải quyết đích)
Giới thiệu
YARP sử dụng một destination resolver (bộ giải quyết đích) để mở rộng tập hợp các địa chỉ destination đã được cấu hình. Destination resolver có thể được sử dụng như một điểm tích hợp với các hệ thống service discovery (khám phá dịch vụ).
Cấu trúc
IDestinationResolver có một phương thức duy nhất ResolveDestinationsAsync(IReadOnlyDictionary<string, DestinationConfig> destinations, CancellationToken cancellationToken) nên trả về một instance của ResolvedDestinationCollection. ResolvedDestinationCollection có một tập hợp các instance DestinationConfig, cũng như một IChangeToken để thông báo cho proxy khi thông tin này đã lỗi thời và cần được tải lại, điều này sẽ khiến ResolveDestinationsAsync được gọi lại.
DestinationConfig
DestinationConfig có thuộc tính Host có thể được sử dụng để chỉ định giá trị header Host mặc định mà proxy nên sử dụng khi giao tiếp với destination đó. Điều này cho phép IDestinationResolver giải quyết các destination thành một tập hợp các địa chỉ IP, chẳng hạn, mà không gây ra lỗi cho SNI hoặc host-based routing.
Vòng đời
Khởi động
IDestinationResolver nên được đăng ký trong DI container dưới dạng singleton (đơn lẻ). Khi khởi động, proxy sẽ resolve instance này và gọi ResolveDestinationsAsync(...) với các destination đã được cấu hình lấy từ các IProxyConfigProviders đã được resolve. Trong lần gọi đầu tiên này, provider có thể chọn:
- Ném một ngoại lệ nếu provider không thể tạo cấu hình proxy hợp lệ vì bất kỳ lý do gì. Điều này sẽ ngăn ứng dụng khởi động.
- Giải quyết các destination bất đồng bộ. Điều này sẽ ngăn ứng dụng khởi động cho đến khi các destination đã được giải quyết có sẵn.
- Hoặc, có thể chọn trả về một instance
ResolvedDestinationCollectionrỗng trong khi giải quyết các destination ở chế độ nền. Provider sẽ cần kích hoạtIChangeTokenkhi cấu hình có sẵn.
Tính nguyên tử (Atomicity)
Các đối tượng và collection destination được cung cấp cho proxy nên là read-only và không được sửa đổi sau khi chúng đã được bàn giao cho proxy thông qua GetConfig().
Tải lại
Nếu IChangeToken hỗ trợ ActiveChangeCallbacks, sau khi proxy đã xử lý tập hợp destinations ban đầu, nó sẽ đăng ký một callback với token này. Nếu provider không hỗ trợ callbacks thì HasChanged sẽ được polling cùng với IProxyConfig change tokens, mỗi 5 phút một lần.
Khi provider muốn cung cấp một tập hợp destinations mới cho proxy, nó nên:
- Giải quyết các destinations đó ở chế độ nền.
ResolvedDestinationCollectionlà bất biến (immutable), vì vậy các instance mới phải được tạo cho bất kỳ dữ liệu mới nào.- Các đối tượng cho destinations không thay đổi có thể được tái sử dụng, hoặc có thể tạo các instance mới.
- Vô hiệu hóa
IChangeTokenđược trả về từ lần gọiResolveDestinationsAsynctrước đó.
Sau khi các destinations mới đã được áp dụng, proxy sẽ đăng ký một callback với IChangeToken mới. Lưu ý nếu có nhiều lần tải lại được báo hiệu trong khoảng thời gian ngắn liên tiếp, proxy có thể bỏ qua một số và resolve destinations ngay khi sẵn sàng.
DNS Destination Resolver
YARP bao gồm một triển khai IDestinationResolver mở rộng tập hợp các destinations đã cấu hình bằng cách giải quyết mỗi hostname thành một hoặc nhiều địa chỉ IP bằng DNS, tạo một destination cho mỗi IP được resolve. DNS destination resolver có thể được thêm vào reverse proxy của bạn bằng phương thức IReverseProxyBuilder.AddDnsDestinationResolver(Action<DnsDestinationResolverOptions>). Phương thức này chấp nhận một delegate tùy chọn để cấu hình các tùy chọn của resolver, DnsDestinationResolverOptions.
Ví dụ
// Add the DNS destination resolver, restricting results to IPv4 addresses reverseProxyBuilder.AddDnsDestinationResolver(o => o.AddressFamily = AddressFamily.InterNetwork);
Cấu hình
Các tùy chọn của DNS destination resolver, DnsDestinationResolverOptions, có các thuộc tính sau:
RefreshPeriod
Khoảng thời gian giữa các lần yêu cầu làm mới tên đã được resolve. Mặc định là 5 phút.
AddressFamily
Tùy chọn, chỉ định giá trị System.Net.Sockets.AddressFamily là AddressFamily.InterNetwork hoặc AddressFamily.InterNetworkV6 để giới hạn kết quả resolve chỉ theo địa chỉ IPv4 hoặc IPv6. Giá trị mặc định, null, hướng dẫn resolver không giới hạn address family của kết quả và chấp nhận tất cả các địa chỉ được trả về.