mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-04-23 04:42:51 +08:00

* copied everything from repos back to ocelot repo * added src projects to sln * removed all test projects that have no tests * added all test projects to sln * removed test not on master * merged unit tests * merged acceptance tests * merged integration tests * fixed namepaces * build script creates packages for all projects * updated docs to make sure no references to external repos that we will remove * +semver: breaking
77 lines
2.7 KiB
C#
77 lines
2.7 KiB
C#
namespace Ocelot.Provider.Consul
|
|
{
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using global::Consul;
|
|
using Infrastructure.Extensions;
|
|
using Logging;
|
|
using ServiceDiscovery.Providers;
|
|
using Values;
|
|
|
|
|
|
public class Consul : IServiceDiscoveryProvider
|
|
{
|
|
private readonly ConsulRegistryConfiguration _config;
|
|
private readonly IOcelotLogger _logger;
|
|
private readonly IConsulClient _consul;
|
|
private const string VersionPrefix = "version-";
|
|
|
|
public Consul(ConsulRegistryConfiguration config, IOcelotLoggerFactory factory, IConsulClientFactory clientFactory)
|
|
{
|
|
_logger = factory.CreateLogger<Consul>();
|
|
_config = config;
|
|
_consul = clientFactory.Get(_config);
|
|
}
|
|
|
|
public async Task<List<Service>> Get()
|
|
{
|
|
var queryResult = await _consul.Health.Service(_config.KeyOfServiceInConsul, string.Empty, true);
|
|
|
|
var services = new List<Service>();
|
|
|
|
foreach (var serviceEntry in queryResult.Response)
|
|
{
|
|
if (IsValid(serviceEntry))
|
|
{
|
|
services.Add(BuildService(serviceEntry));
|
|
}
|
|
else
|
|
{
|
|
_logger.LogWarning($"Unable to use service Address: {serviceEntry.Service.Address} and Port: {serviceEntry.Service.Port} as it is invalid. Address must contain host only e.g. localhost and port must be greater than 0");
|
|
}
|
|
}
|
|
|
|
return services.ToList();
|
|
}
|
|
|
|
private Service BuildService(ServiceEntry serviceEntry)
|
|
{
|
|
return new Service(
|
|
serviceEntry.Service.Service,
|
|
new ServiceHostAndPort(serviceEntry.Service.Address, serviceEntry.Service.Port),
|
|
serviceEntry.Service.ID,
|
|
GetVersionFromStrings(serviceEntry.Service.Tags),
|
|
serviceEntry.Service.Tags ?? Enumerable.Empty<string>());
|
|
}
|
|
|
|
private bool IsValid(ServiceEntry serviceEntry)
|
|
{
|
|
if (string.IsNullOrEmpty(serviceEntry.Service.Address) || serviceEntry.Service.Address.Contains("http://") || serviceEntry.Service.Address.Contains("https://") || serviceEntry.Service.Port <= 0)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
private string GetVersionFromStrings(IEnumerable<string> strings)
|
|
{
|
|
return strings
|
|
?.FirstOrDefault(x => x.StartsWith(VersionPrefix, StringComparison.Ordinal))
|
|
.TrimStart(VersionPrefix);
|
|
}
|
|
}
|
|
}
|