using Consul; using System; using System.Collections.Generic; using System.Linq; using System.Collections.Concurrent; using Grpc.Extension.Abstract.Discovery; namespace Grpc.Extension.Discovery.Consul { /// /// Consul服务发现 /// public class ConsulServiceDiscovery : IServiceDiscovery { private ConcurrentDictionary _consulClients = new ConcurrentDictionary(); /// /// 从consul获取可用的节点信息 /// public List GetEndpoints(string serviceName, string consulUrl, string consulTag) { var client = CreateConsulClient(consulUrl); var res = client.Health.Service(serviceName, consulTag , true).Result; return res.Response.Select(q => $"{q.Service.Address}:{q.Service.Port}").ToList(); } private ConsulClient CreateConsulClient(string consulUrl) { return _consulClients.GetOrAdd(consulUrl, (url) => new ConsulClient(conf => conf.Address = new Uri(url))); } } }