InMemoryConfigProvider.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. using Microsoft.Extensions.Primitives;
  2. using Yarp.ReverseProxy.Configuration;
  3. public sealed class InMemoryConfigProvider : IProxyConfigProvider
  4. {
  5. private volatile InMemoryConfig _config;
  6. public InMemoryConfigProvider(IReadOnlyList<RouteConfig> routes,
  7. IReadOnlyList<ClusterConfig> clusters)
  8. {
  9. _config = new InMemoryConfig(routes, clusters);
  10. }
  11. public IProxyConfig GetConfig() => _config;
  12. public void Update(IReadOnlyList<RouteConfig> routes,
  13. IReadOnlyList<ClusterConfig> clusters)
  14. {
  15. var old = _config;
  16. _config = new InMemoryConfig(routes, clusters);
  17. old.SignalChange(); // 触发 YARP 重新加载
  18. }
  19. private sealed class InMemoryConfig : IProxyConfig
  20. {
  21. private readonly CancellationTokenSource _cts = new();
  22. public InMemoryConfig(IReadOnlyList<RouteConfig> routes,
  23. IReadOnlyList<ClusterConfig> clusters)
  24. {
  25. Routes = routes;
  26. Clusters = clusters;
  27. ChangeToken = new CancellationChangeToken(_cts.Token);
  28. }
  29. public IReadOnlyList<RouteConfig> Routes { get; }
  30. public IReadOnlyList<ClusterConfig> Clusters { get; }
  31. public IChangeToken ChangeToken { get; }
  32. internal void SignalChange() => _cts.Cancel();
  33. }
  34. }