| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- using Microsoft.Extensions.Primitives;
- using Yarp.ReverseProxy.Configuration;
- public sealed class InMemoryConfigProvider : IProxyConfigProvider
- {
- private volatile InMemoryConfig _config;
- public InMemoryConfigProvider(IReadOnlyList<RouteConfig> routes,
- IReadOnlyList<ClusterConfig> clusters)
- {
- _config = new InMemoryConfig(routes, clusters);
- }
- public IProxyConfig GetConfig() => _config;
- public void Update(IReadOnlyList<RouteConfig> routes,
- IReadOnlyList<ClusterConfig> 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<RouteConfig> routes,
- IReadOnlyList<ClusterConfig> clusters)
- {
- Routes = routes;
- Clusters = clusters;
- ChangeToken = new CancellationChangeToken(_cts.Token);
- }
- public IReadOnlyList<RouteConfig> Routes { get; }
- public IReadOnlyList<ClusterConfig> Clusters { get; }
- public IChangeToken ChangeToken { get; }
- internal void SignalChange() => _cts.Cancel();
- }
- }
|