Exemple #1
0
 /// <inheritdoc/>
 public void SetStatus(IConsulRegistration registration, string status)
 {
     Task.Run(async() =>
     {
         await SetStatusAsync(registration, status);
     }).Wait();
 }
Exemple #2
0
        public static IConsulRegistration AddHttpHealthCheckEndpoint(this IConsulRegistration registration, int healthCheckPort)
        {
            var responseBody = Encoding.UTF8.GetBytes("OK");
            var address      = $"http://*:{healthCheckPort}/";

            var listener = new HttpListener
            {
                Prefixes = { address }
            };

            listener.Start();

            Task.Run(() =>
            {
                while (true)
                {
                    var context  = listener.GetContext();
                    var response = context.Response;

                    response.OutputStream.Write(responseBody, 0, responseBody.Length);
                    response.OutputStream.Close();
                }
            });

            return(registration);
        }
Exemple #3
0
        /// <inheritdoc/>
        public async Task RegisterAsync(IConsulRegistration registration)
        {
            if (registration == null)
            {
                throw new ArgumentNullException(nameof(registration));
            }

            _logger?.LogInformation("Registering service with consul {serviceId} ", registration.ServiceId);

            try
            {
                await _client.Agent.ServiceRegister(registration.Service);

                if (Options.IsHeartBeatEnabled && _scheduler != null)
                {
                    _scheduler.Add(registration.InstanceId);
                }
            }
            catch (Exception e)
            {
                if (Options.FailFast)
                {
                    _logger?.LogError(e, "Error registering service with consul {serviceId} ", registration.ServiceId);
                    throw;
                }

                _logger?.LogWarning(e, "Failfast is false. Error registering service with consul {serviceId} ", registration.ServiceId);
            }
        }
Exemple #4
0
 /// <inheritdoc/>
 public void Deregister(IConsulRegistration registration)
 {
     Task.Run(async() =>
     {
         await DeregisterAsync(registration);
     }).Wait();
 }
Exemple #5
0
        /// <inheritdoc/>
        public S GetStatus <S>(IConsulRegistration registration)
            where S : class
        {
            var result = GetStatusAsync(registration).GetAwaiter().GetResult();

            return((S)result);
        }
Exemple #6
0
        /// <inheritdoc/>
        public Task <object> GetStatusAsync(IConsulRegistration registration)
        {
            if (registration == null)
            {
                throw new ArgumentNullException(nameof(registration));
            }

            return(GetStatusAsyncInternal(registration));
        }
Exemple #7
0
        /// <inheritdoc/>
        public Task RegisterAsync(IConsulRegistration registration)
        {
            if (registration == null)
            {
                throw new ArgumentNullException(nameof(registration));
            }

            return(RegisterAsyncInternal(registration));
        }
Exemple #8
0
        /// <inheritdoc/>
        public Task SetStatusAsync(IConsulRegistration registration, string status)
        {
            if (registration == null)
            {
                throw new ArgumentNullException(nameof(registration));
            }

            return(SetStatusAsyncInternal(registration, status));
        }
 public ThisServiceInstance(IConsulRegistration registration)
 {
     ServiceId = registration.Service.Name;
     Host      = registration.Service.Address;
     IsSecure  = registration.IsSecure;
     Port      = registration.Port;
     Metadata  = registration.Metadata;
     Uri       = registration.Uri;
 }
Exemple #10
0
        /// <inheritdoc/>
        public S GetStatus <S>(IConsulRegistration registration)
            where S : class
        {
            var result = Task.Run(async() =>
            {
                return(await GetStatusAsync(registration));
            }).Result;

            return((S)result);
        }
Exemple #11
0
        private async Task DeregisterAsyncInternal(IConsulRegistration registration)
        {
            if (Options.IsHeartBeatEnabled && _scheduler != null)
            {
                _scheduler.Remove(registration.InstanceId);
            }

            _logger?.LogInformation("Deregistering service with consul {instanceId} ", registration.InstanceId);

            await _client.Agent.ServiceDeregister(registration.InstanceId).ConfigureAwait(false);
        }
        private Task SetStatusAsyncInternal(IConsulRegistration registration, string status)
        {
            if (OUT_OF_SERVICE.Equals(status, StringComparison.OrdinalIgnoreCase))
            {
                return(_client.Agent.EnableServiceMaintenance(registration.InstanceId, OUT_OF_SERVICE));
            }

            if (UP.Equals(status, StringComparison.OrdinalIgnoreCase))
            {
                return(_client.Agent.DisableServiceMaintenance(registration.InstanceId));
            }

            throw new ArgumentException($"Unknown status: {status}");
        }
Exemple #13
0
 private async Task SetStatusAsyncInternal(IConsulRegistration registration, string status)
 {
     if (OUT_OF_SERVICE.Equals(status, StringComparison.OrdinalIgnoreCase))
     {
         await _client.Agent.EnableServiceMaintenance(registration.InstanceId, OUT_OF_SERVICE).ConfigureAwait(false);
     }
     else if (UP.Equals(status, StringComparison.OrdinalIgnoreCase))
     {
         await _client.Agent.DisableServiceMaintenance(registration.InstanceId).ConfigureAwait(false);
     }
     else
     {
         throw new ArgumentException($"Unknown status: {status}");
     }
 }
Exemple #14
0
        public static IConsulRegistration AddTTLCheck(this IConsulRegistration registration, TimeSpan ttl, TimeSpan interval, TimeSpan deregisterFailedAfter)
        {
            var ttlCheck = new AgentCheckRegistration
            {
                DockerContainerID = Environment.MachineName,
                DeregisterCriticalServiceAfter = deregisterFailedAfter,
                Interval = interval,
                TTL      = ttl,
                Name     = $"TTL check"
            };

            registration.AddHealthCheck(ttlCheck);

            return(registration);
        }
Exemple #15
0
        /// <inheritdoc/>
        public async Task DeregisterAsync(IConsulRegistration registration)
        {
            if (registration == null)
            {
                throw new ArgumentNullException(nameof(registration));
            }

            if (Options.IsHeartBeatEnabled && _scheduler != null)
            {
                _scheduler.Remove(registration.InstanceId);
            }

            _logger?.LogInformation("Deregistering service with consul {instanceId} ", registration.InstanceId);

            await _client.Agent.ServiceDeregister(registration.InstanceId);
        }
Exemple #16
0
        public static IConsulRegistration AddHttpCheck(this IConsulRegistration registration, int port, string relativePath, TimeSpan interval, TimeSpan deregisterFailedAfter)
        {
            var url       = $"{registration.Address}:{port}{relativePath}";
            var httpCheck = new AgentCheckRegistration
            {
                DockerContainerID = Environment.MachineName,
                DeregisterCriticalServiceAfter = deregisterFailedAfter,
                Interval = interval,
                HTTP     = url,
                Name     = $"HTTP GET {url} check"
            };

            registration.AddHealthCheck(httpCheck);

            return(registration);
        }
Exemple #17
0
        public async Task <object> GetStatusAsyncInternal(IConsulRegistration registration)
        {
            var response = await _client.Health.Checks(registration.ServiceId, QueryOptions.Default).ConfigureAwait(false);

            var checks = response.Response;

            foreach (HealthCheck check in checks)
            {
                if (check.ServiceID.Equals(registration.InstanceId) && check.Name.Equals("Service Maintenance Mode", StringComparison.OrdinalIgnoreCase))
                {
                    return(OUT_OF_SERVICE);
                }
            }

            return(UP);
        }
Exemple #18
0
        /// <inheritdoc/>
        public async Task SetStatusAsync(IConsulRegistration registration, string status)
        {
            if (registration == null)
            {
                throw new ArgumentNullException(nameof(registration));
            }

            if (OUT_OF_SERVICE.Equals(status, StringComparison.OrdinalIgnoreCase))
            {
                await _client.Agent.EnableServiceMaintenance(registration.InstanceId, OUT_OF_SERVICE);
            }
            else if (UP.Equals(status, StringComparison.OrdinalIgnoreCase))
            {
                await _client.Agent.DisableServiceMaintenance(registration.InstanceId);
            }
            else
            {
                throw new ArgumentException($"Unknown status: {status}");
            }
        }
Exemple #19
0
        /// <inheritdoc/>
        public async Task <object> GetStatusAsync(IConsulRegistration registration)
        {
            if (registration == null)
            {
                throw new ArgumentNullException(nameof(registration));
            }

            var response = await _client.Health.Checks(registration.ServiceId, QueryOptions.Default);

            var checks = response.Response;

            foreach (HealthCheck check in checks)
            {
                if (check.ServiceID.Equals(registration.InstanceId))
                {
                    if (check.Name.Equals("Service Maintenance Mode", StringComparison.OrdinalIgnoreCase))
                    {
                        return(OUT_OF_SERVICE);
                    }
                }
            }

            return(UP);
        }
Exemple #20
0
        private async Task RegisterAsyncInternal(IConsulRegistration registration)
        {
            _logger?.LogInformation("Registering service with consul {serviceId} ", registration.ServiceId);

            try
            {
                await _client.Agent.ServiceRegister(registration.Service).ConfigureAwait(false);

                if (Options.IsHeartBeatEnabled && _scheduler != null)
                {
                    _scheduler.Add(registration.InstanceId);
                }
            }
            catch (Exception e)
            {
                if (Options.FailFast)
                {
                    _logger?.LogError(e, "Error registering service with consul {serviceId} ", registration.ServiceId);
                    throw;
                }

                _logger?.LogWarning(e, "Failfast is false. Error registering service with consul {serviceId} ", registration.ServiceId);
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="ConsulServiceRegistrar"/> class.
 /// </summary>
 /// <param name="registry">the Consul service registry to use when doing registrations</param>
 /// <param name="options">configuration options to use</param>
 /// <param name="registration">the registration to register with Consul</param>
 /// <param name="logger">optional logger</param>
 public ConsulServiceRegistrar(IConsulServiceRegistry registry, ConsulDiscoveryOptions options, IConsulRegistration registration, ILogger <ConsulServiceRegistrar> logger = null)
 {
     _registry    = registry ?? throw new ArgumentNullException(nameof(registry));
     _options     = options ?? throw new ArgumentNullException(nameof(options));
     Registration = registration ?? throw new ArgumentNullException(nameof(registration));
     _logger      = logger;
 }
Exemple #22
0
 public static IConsulRegistration AddHttpCheck(this IConsulRegistration registration, int port, TimeSpan interval, TimeSpan deregisterFailedAfter)
 {
     return(registration.AddHttpCheck(port, string.Empty, interval, deregisterFailedAfter));
 }
Exemple #23
0
 /// <inheritdoc/>
 public void SetStatus(IConsulRegistration registration, string status)
 {
     SetStatusAsync(registration, status).GetAwaiter().GetResult();
 }
Exemple #24
0
 public static IConsulRegistration AddHttpCheck(this IConsulRegistration registration, string relativePath, TimeSpan interval, TimeSpan deregisterFailedAfter)
 {
     return(registration.AddHttpCheck(registration.Port, relativePath, interval, deregisterFailedAfter));
 }
Exemple #25
0
 /// <inheritdoc/>
 public void Deregister(IConsulRegistration registration)
 {
     DeregisterAsync(registration).GetAwaiter().GetResult();
 }