using Microsoft.Extensions.Primitives; using Yarp.ReverseProxy.Configuration; public sealed class InMemoryConfigProvider : IProxyConfigProvider { private volatile InMemoryConfig _config; public InMemoryConfigProvider(IReadOnlyList routes, IReadOnlyList clusters) { _config = new InMemoryConfig(routes, clusters); } public IProxyConfig GetConfig() => _config; public void Update(IReadOnlyList routes, IReadOnlyList clusters) { var old = _config; _config = new InMemoryConfig(routes, clusters); old.SignalChange(); // 触发 YARP 重新加载 } private sealed class InMemoryConfig : IProxyConfig { private readonly CancellationTokenSource _cts = new(); public InMemoryConfig(IReadOnlyList routes, IReadOnlyList clusters) { Routes = routes; Clusters = clusters; ChangeToken = new CancellationChangeToken(_cts.Token); } public IReadOnlyList Routes { get; } public IReadOnlyList Clusters { get; } public IChangeToken ChangeToken { get; } internal void SignalChange() => _cts.Cancel(); } }