/// <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); }