コード例 #1
0
        internal static InstanceInfo FromInstanceConfig(IEurekaInstanceConfig instanceConfig)
        {
            InstanceInfo info = new InstanceInfo
            {
                LeaseInfo  = LeaseInfo.FromConfig(instanceConfig),
                InstanceId = instanceConfig.InstanceId
            };

            if (string.IsNullOrEmpty(info.InstanceId))
            {
                info.InstanceId = instanceConfig.GetHostName(false);
            }

            string defaultAddress = instanceConfig.GetHostName(false);

            if (instanceConfig.PreferIpAddress || string.IsNullOrEmpty(defaultAddress))
            {
                defaultAddress = instanceConfig.IpAddress;
            }

            info.AppName               = instanceConfig.AppName.ToUpperInvariant();
            info.AppGroupName          = instanceConfig.AppGroupName?.ToUpperInvariant();
            info.DataCenterInfo        = instanceConfig.DataCenterInfo;
            info.IpAddr                = instanceConfig.IpAddress;
            info.HostName              = defaultAddress;
            info.Port                  = (instanceConfig.NonSecurePort == -1) ? EurekaInstanceConfig.Default_NonSecurePort : instanceConfig.NonSecurePort;
            info.IsUnsecurePortEnabled = instanceConfig.IsNonSecurePortEnabled;
            info.SecurePort            = (instanceConfig.SecurePort == -1) ? EurekaInstanceConfig.Default_SecurePort : instanceConfig.SecurePort;
            info.IsSecurePortEnabled   = instanceConfig.SecurePortEnabled;
            info.VipAddress            = instanceConfig.VirtualHostName;
            info.SecureVipAddress      = instanceConfig.SecureVirtualHostName;
            info.HomePageUrl           = MakeUrl(info, instanceConfig.HomePageUrlPath, instanceConfig.HomePageUrl);
            info.StatusPageUrl         = MakeUrl(info, instanceConfig.StatusPageUrlPath, instanceConfig.StatusPageUrl);
            info.AsgName               = instanceConfig.ASGName;
            info.HealthCheckUrl        = MakeUrl(info, instanceConfig.HealthCheckUrlPath, instanceConfig.HealthCheckUrl, instanceConfig.SecureHealthCheckUrl);

            if (!instanceConfig.IsInstanceEnabledOnInit)
            {
                info._status = InstanceStatus.STARTING;
            }

            if (!string.IsNullOrEmpty(info.InstanceId))
            {
                InstanceInfo me = ApplicationInfoManager.Instance.InstanceInfo;
                if (me != null)
                {
                    if (info.InstanceId.Equals(me.InstanceId))
                    {
                        info.IsCoordinatingDiscoveryServer = true;
                    }
                }
            }

            if (instanceConfig.MetadataMap != null && instanceConfig.MetadataMap.Count > 0)
            {
                info._metaData = new Dictionary <string, string>(instanceConfig.MetadataMap);
            }

            return(info);
        }
コード例 #2
0
        internal HealthStatus AddHeartbeatStatus(IEurekaClientConfig clientConfig, IEurekaInstanceConfig instanceConfig, HealthCheckResult result, long lastGoodHeartbeatTimeTicks)
        {
            if (clientConfig != null && clientConfig.ShouldRegisterWithEureka)
            {
                var lastGoodHeartbeatPeriod = GetLastGoodHeartbeatTimePeriod(lastGoodHeartbeatTimeTicks);
                if (lastGoodHeartbeatPeriod <= 0)
                {
                    result.Details.Add("heartbeat", "Not yet successfully connected");
                    result.Details.Add("heartbeatStatus", HealthStatus.UNKNOWN.ToString());
                    result.Details.Add("heartbeatTime", "UNKNOWN");
                    return(HealthStatus.UNKNOWN);
                }
                else if (lastGoodHeartbeatPeriod > ((instanceConfig.LeaseRenewalIntervalInSeconds * TimeSpan.TicksPerSecond) * 2))
                {
                    result.Details.Add("heartbeat", "Reporting failures connecting");
                    result.Details.Add("heartbeatStatus", HealthStatus.DOWN.ToString());
                    result.Details.Add("heartbeatTime", new DateTime(lastGoodHeartbeatTimeTicks).ToString("s"));
                    result.Details.Add("heartbeatFailures", lastGoodHeartbeatPeriod / (instanceConfig.LeaseRenewalIntervalInSeconds * TimeSpan.TicksPerSecond));
                    return(HealthStatus.DOWN);
                }

                result.Details.Add("heartbeat", "Successful");
                result.Details.Add("heartbeatStatus", HealthStatus.UP.ToString());
                result.Details.Add("heartbeatTime", new DateTime(lastGoodHeartbeatTimeTicks).ToString("s"));
                return(HealthStatus.UP);
            }

            result.Details.Add("heartbeatStatus", "Not registering");
            return(HealthStatus.UNKNOWN);
        }
コード例 #3
0
        public void SetAppUp(IEurekaInstanceConfig instanceConfig, EurekaClientConfig config, ILoggerFactory factory)
        {
            this._logger.LogDebug("Start registering service instance...");
            ApplicationInfoManager aim = this.InitializeApplicationInfoManager(instanceConfig);

            this.SetAppStatus(InstanceStatus.UP, aim);
            this._logger.LogDebug($"Service instance was registered (ip: {instanceConfig.IpAddress}, port: {instanceConfig.NonSecurePort}, sec-port: {instanceConfig.SecurePort})");

            this._eurekaClient = this.InitializeEurekaClient(instanceConfig, config, factory);

            for (int i = 0; i < 120; i++)
            {
                try
                {
                    IList <InstanceInfo> infoList = this._eurekaClient.GetInstanceById(instanceConfig.InstanceId);
                    if (infoList != null && infoList.Count > 0)
                    {
                        this._logger.LogDebug("Service instance was online.");
                        return;
                    }
                    Thread.Sleep(1000);
                }
                catch (Exception)
                {
                    Thread.Sleep(1000);
                }
            }

            throw new ThriftyException($"Unable to connect to the eureka server (eureka server: {config.EurekaServerServiceUrls}), please check the swifty server configuration");
        }
コード例 #4
0
        protected internal virtual void ConfigureInstanceIfNeeded(IEurekaInstanceConfig instConfig)
        {
            if (string.IsNullOrEmpty(instConfig.AppName))
            {
                instConfig.AppName = "unknown";
            }

            if (string.IsNullOrEmpty(instConfig.InstanceId))
            {
                var hostName = instConfig.GetHostName(false);
                var appName  = instConfig.AppName;
                var index    = (instConfig.NonSecurePort == -1) ? EurekaInstanceOptions.Default_NonSecurePort.ToString() : instConfig.NonSecurePort.ToString();
                instConfig.InstanceId = hostName + ":" + appName + ":" + index;
            }

            if (string.IsNullOrEmpty(instConfig.VirtualHostName))
            {
                instConfig.VirtualHostName = instConfig.AppName;
            }

            if (string.IsNullOrEmpty(instConfig.SecureVirtualHostName))
            {
                instConfig.SecureVirtualHostName = instConfig.AppName;
            }
        }
コード例 #5
0
        protected EurekaDiscoveryClientBase(EurekaClientOptions clientOptions, EurekaInstanceOptions instOptions, IEurekaHttpClient httpClient, IApplicationLifetime lifeCycle = null, ILoggerFactory logFactory = null)
        {
            if (clientOptions == null)
            {
                throw new ArgumentNullException(nameof(clientOptions));
            }

            ClientConfig = clientOptions;
            InstConfig   = instOptions;

            if (InstConfig == null)
            {
                DiscoveryManager.Instance.Initialize(ClientConfig, httpClient, logFactory);
            }
            else
            {
                ConfigureInstanceIfNeeded(InstConfig);
                DiscoveryManager.Instance.Initialize(ClientConfig, InstConfig, httpClient, logFactory);
            }

            if (lifeCycle != null)
            {
                lifeCycle.ApplicationStopping.Register(() => { ShutdownAsync(); });
            }

            Client = DiscoveryManager.Instance.Client;
        }
コード例 #6
0
ファイル: ThriftyBootstrap.cs プロジェクト: ysj123688/Thrifty
        /// <summary>
        /// 获取或初始化实例配置,不存在则使用默认方式初始化一个
        /// </summary>
        /// <returns></returns>
        private IEurekaInstanceConfig GetEurekaInstanceConfig()
        {
            if (_instanceConfig == null)
            {
                _instanceConfig           = new EurekaRegisterInfo();
                _instanceConfig.IpAddress = "127.0.0.1"; //为空获取网卡报错?
                if (String.IsNullOrWhiteSpace(_serverConfig.BindingAddress) || _serverConfig.BindingAddress == "0.0.0.0")
                {
                    ThrowIfAddressWrong();

                    if (IsIPAddress(_instanceDescription.PublicAddress))
                    {
                        _instanceConfig.IpAddress = _instanceDescription.PublicAddress;
                    }
                    else if (!String.IsNullOrWhiteSpace(_instanceDescription.PublicAddress))
                    {
                        _instanceConfig.HostName = _instanceDescription.PublicAddress;
                    }
                }
                else
                {
                    _instanceConfig.IpAddress = _serverConfig.BindingAddress;
                }

                _instanceConfig.SecurePortEnabled = false;
                _instanceConfig.NonSecurePort     = _serverConfig.Port;
                _instanceConfig.AppName           = _instanceDescription.AppName;
                _instanceConfig.VirtualHostName   = _instanceDescription.VipAddress;
            }
            return(_instanceConfig);
        }
コード例 #7
0
 public void Initialize(IEurekaInstanceConfig instanceConfig, ILoggerFactory logFactory = null)
 {
     if (instanceConfig == null)
     {
         throw new ArgumentNullException(nameof(instanceConfig));
     }
     _logger        = logFactory?.CreateLogger <ApplicationInfoManager>();
     InstanceConfig = instanceConfig;
     InstanceInfo   = InstanceInfo.FromInstanceConfig(instanceConfig);
 }
コード例 #8
0
        internal static LeaseInfo FromConfig(IEurekaInstanceConfig config)
        {
            var info = new LeaseInfo()
            {
                RenewalIntervalInSecs = config.LeaseRenewalIntervalInSeconds,
                DurationInSecs        = config.LeaseExpirationDurationInSeconds
            };

            return(info);
        }
コード例 #9
0
        public virtual void Initialize(IEurekaClientConfig clientConfig, IEurekaInstanceConfig instanceConfig, IEurekaHttpClient httpClient, ILoggerFactory logFactory = null)
        {
            _logger        = logFactory?.CreateLogger <DiscoveryManager>();
            ClientConfig   = clientConfig ?? throw new ArgumentNullException(nameof(clientConfig));
            InstanceConfig = instanceConfig ?? throw new ArgumentNullException(nameof(instanceConfig));

            if (ApplicationInfoManager.Instance.InstanceInfo == null)
            {
                ApplicationInfoManager.Instance.Initialize(instanceConfig, logFactory);
            }

            Client = new DiscoveryClient(clientConfig, httpClient, logFactory);
        }
コード例 #10
0
        /// <summary>
        ///     初始化应用信息管理器
        /// </summary>
        /// <param name="instanceConfig">实例配置</param>
        /// <returns>应用信息管理器</returns>
        ApplicationInfoManager InitializeApplicationInfoManager(IEurekaInstanceConfig instanceConfig)
        {
            if (this._applicationInfoManager == null)
            {
                lock (this)
                {
                    if (ApplicationInfoManager.Instance.InstanceInfo == null)
                    {
                        ApplicationInfoManager.Instance.Initialize(instanceConfig);
                    }

                    this._applicationInfoManager = ApplicationInfoManager.Instance;
                }
            }
            return(this._applicationInfoManager);
        }
コード例 #11
0
 /// <summary>
 ///     初始化Eureka客户端
 /// </summary>
 /// <param name="instanceConfig">实例配置</param>
 /// <param name="config">服务发现注册客户端配置</param>
 /// <param name="loggerFactory">loggerfactory</param>
 /// <returns>服务发现注册eureka客户端</returns>
 IEurekaClient InitializeEurekaClient(IEurekaInstanceConfig instanceConfig, EurekaClientConfig config, ILoggerFactory loggerFactory = null)
 {
     this._loggerFactory = loggerFactory;
     if (this._eurekaClient == null)
     {
         lock (this)
         {
             if (DiscoveryManager.Instance.Client == null)
             {
                 DiscoveryManager.Instance.Initialize(config, instanceConfig, loggerFactory);
             }
             this._eurekaClient = DiscoveryManager.Instance.Client;
         }
     }
     this._logger = loggerFactory?.CreateLogger <ThriftyRegistryService>() ?? (ILogger)NullLogger.Instance;
     return(this._eurekaClient);
 }
コード例 #12
0
 public virtual void Initialize(IEurekaClientConfig clientConfig, IEurekaInstanceConfig instanceConfig, ILoggerFactory logFactory = null)
 {
     Initialize(clientConfig, instanceConfig, null, logFactory);
 }
コード例 #13
0
 public virtual void Initialize(IEurekaInstanceConfig instanceConfig)
 {
     InstanceConfig = instanceConfig ?? throw new ArgumentNullException(nameof(instanceConfig));
     InstanceInfo   = InstanceInfo.FromInstanceConfig(instanceConfig);
 }
コード例 #14
0
 public EurekaClient(IEurekaHttpClient httpClient, IEurekaInstanceConfig instanceConfig)
 {
     _httpClient     = httpClient;
     _instanceConfig = instanceConfig;
 }