public SwitchingProvider(ConsulClient consul, Action beginEvent, Action endEvent, string serviceName, string serviceId, string currentZone, MasterOrSlaver masterOrSlaver, Action <string, LogLevel> logEvent, TimeSpan checkInsteval, int changeTimes = 3)
 {
     BeginEvent     += beginEvent;
     EndEvent       += endEvent;
     _logEvent       = logEvent;
     _serviceName    = serviceName;
     _checkInsteval  = Convert.ToInt32(checkInsteval.TotalMilliseconds);
     _changeTimes    = changeTimes;
     _serviceId      = serviceId;
     _currentZone    = currentZone;
     _masterOrSlaver = masterOrSlaver;
     _consulServiceSwitchProvider = new ConsulServiceSwitchProvider(consul);
 }
        public async Task <bool> CheckTargetInstanceRunningStatus(string serviceName, string currentZone, string serviceId, MasterOrSlaver masterOrSlaver)
        {
            var queryResult = await _consul.Health.Service(serviceName, currentZone, false);

            var tarService = queryResult.Response.Where(serviceEntry => serviceEntry.Service != null && serviceEntry.Service.ID == serviceId && serviceEntry.Service.Tags.Contains(masterOrSlaver.ToString())).FirstOrDefault();

            return(tarService?.Checks.Where(serviceCheck => !string.IsNullOrWhiteSpace(serviceCheck.ServiceID)).FirstOrDefault()?.Status == HealthStatus.Passing ? true : false);
        }
        /// <summary>
        /// 获取指定服务状态
        /// </summary>
        /// <param name="serviceName">服务名</param>
        /// <param name="currentZone">分片键</param>
        /// <param name="masterOrSlaver">主从身份</param>
        /// <returns></returns>
        public async Task <CurrentServiceStatus> GetCurrentServiceStatus(string serviceName, string currentZone, MasterOrSlaver masterOrSlaver)
        {
            var queryResult = await _consul.Health.Service(serviceName, currentZone, false);

            var tarService = queryResult.Response.Where(serviceEntry => serviceEntry.Service != null && serviceEntry.Service.Tags.Contains(masterOrSlaver.ToString())).FirstOrDefault();
            CurrentServiceStatus status = CurrentServiceStatus.Unsetting;

            if (tarService != null && tarService.Checks.Any(serviceCheck => !string.IsNullOrWhiteSpace(serviceCheck.ServiceID)))
            {
                var serviceStatus = tarService.Checks.Where(serviceCheck => !string.IsNullOrWhiteSpace(serviceCheck.ServiceID)).FirstOrDefault();
                if (serviceStatus != null)
                {
                    status = serviceStatus.Status == HealthStatus.Passing ? CurrentServiceStatus.Running : CurrentServiceStatus.Critical;
                }
            }
            return(status);
        }