ConsulServiceDiscovery.cs 1.1 KB

1234567891011121314151617181920212223242526272829303132
  1. using Consul;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Collections.Concurrent;
  6. using Grpc.Extension.Abstract.Discovery;
  7. namespace Grpc.Extension.Discovery.Consul
  8. {
  9. /// <summary>
  10. /// Consul服务发现
  11. /// </summary>
  12. public class ConsulServiceDiscovery : IServiceDiscovery
  13. {
  14. private ConcurrentDictionary<string, ConsulClient> _consulClients = new ConcurrentDictionary<string, ConsulClient>();
  15. /// <summary>
  16. /// 从consul获取可用的节点信息
  17. /// </summary>
  18. public List<string> GetEndpoints(string serviceName, string consulUrl, string consulTag)
  19. {
  20. var client = CreateConsulClient(consulUrl);
  21. var res = client.Health.Service(serviceName, consulTag , true).Result;
  22. return res.Response.Select(q => $"{q.Service.Address}:{q.Service.Port}").ToList();
  23. }
  24. private ConsulClient CreateConsulClient(string consulUrl)
  25. {
  26. return _consulClients.GetOrAdd(consulUrl, (url) => new ConsulClient(conf => conf.Address = new Uri(url)));
  27. }
  28. }
  29. }