/// <summary>
        /// 申请新的Soa服务
        /// </summary>
        /// <param name="serviceId"></param>
        /// <param name="appId"></param>
        /// <param name="description"></param>
        public void Apply(string serviceId, string appId, string description)
        {
            if (string.IsNullOrWhiteSpace(serviceId))
            {
                throw new SoaDataAdapterException(ErrorCode.InvalidSoaServiceId, "ServiceId is empty");
            }

            if (string.IsNullOrWhiteSpace(appId))
            {
                throw new SoaDataAdapterException(ErrorCode.InvalidAppId, "AppId is empty");
            }

            var soaInfo = new SoaInfo()
            {
                ServiceId   = serviceId.Trim().ToLower(),
                AppId       = appId.Trim().ToLower(),
                Description = description
            };

            if (resources.TryAdd(soaInfo.ServiceId, soaInfo) == false)
            {
                throw new SoaDataAdapterException(ErrorCode.InvalidSoaServiceId, "SerivceId already exist");
            }

            var list = new List <SoaInfo>(resources.Values);

            if (list.Exists(p => string.Equals(p.AppId, soaInfo.AppId, StringComparison.InvariantCultureIgnoreCase)) == false)
            {
                // 新的AppId需要被监听
                Listen(soaInfo.AppId);
            }

            Save();
        }
        private List <string> GetAvailableInstances
            (AppInfoQueryResponseType appInfo, IDynamicConfigProvider provider, SoaInfo soaInfo)
        {
            // 如果Soa中没有注册任何实例,那么当前soa服务就不存在可用的实例
            if (soaInfo.RegisteredResources == null || soaInfo.RegisteredResources.Count == 0)
            {
                logger.Warn($"There's no registered instance in current service : {soaInfo.ServiceId}");
                return(null);
            }

            // 如果soa服务对应的app不存在任何实例,那么soa服务也不可以被访问
            if (appInfo.Instances == null || appInfo.Instances.Count == 0)
            {
                logger.Warn($"There's no instance in current app : {appInfo.AppId}");
                return(null);
            }

            List <string> list = new List <string>();

            foreach (var item in soaInfo.RegisteredResources)
            {
                // 根据在Soa中注册的实例Id,在app信息中查找实例是否存在,并且校验实例的状态
                var instance = appInfo.Instances.Find
                                   (p => p.InstanceId.Equals(item.InstanceId, StringComparison.InvariantCultureIgnoreCase));

                if (instance == null)
                {
                    logger.Warn($"Althrough this instances '{item.InstanceId}' was registered in soa service '{soaInfo.ServiceId}'," +
                                $" it is no longer in the app's resource list : {appInfo.AppId}");
                    continue;
                }

                var status = provider.GetIntProperty(item.InstanceId);
                logger.Info($"Instance status : {item.InstanceId}, {status}");

                if (VerifyInstanceStatus(status) == false)
                {
                    continue;
                }
                // 获取实例的具体资源
                var address = $"{instance.ResourceId}:{instance.Port}";
                logger.Info($"Found available instance {item.InstanceId} of {appInfo.AppId} for service : " +
                            $"{soaInfo.ServiceId}, resource : {address}");

                list.Add(address);
            }

            return(list);
        }