private void GetNewAppInfos(DevelopBase.Discovery.IClient client, bool isWatch = true) { //获取远程列表 List <string> srvs = client.GetServerList(); if (Appinfos == null) { Appinfos = new Dictionary <string, DPBase.RemoteAppInfo>(); } lock (Appinfos) { //剔除已有项目 srvs.RemoveAll(c => Appinfos.Any(k => k.Key == c)); //增加新增项目 foreach (var item in srvs) { lock (Appinfos) { if (!Appinfos.Any(c => c.Key == item)) { var val = Newtonsoft.Json.JsonConvert.DeserializeObject <DPBase.RemoteAppInfo>(client.GetServer(item, isWatch)); Appinfos.Add(item, val); } } } } }
/// <summary> /// 根据应用名获取应用信息 /// /// 加入轮询机制 /// 返回由GetApps序列化好的本地缓存中的应用信息 /// </summary> /// <param name="AppName">应用名</param> /// <returns>单一应用信息</returns> private DPBase.RemoteAppInfo GetAppInfo(string AppName) { var apps = Appinfos?.Where(c => c.Value.AppName == AppName).ToList(); //未找到运行的服务 if (apps.Count < 1) { return(null); } //只有一个直接返回 if (apps.Count == 1) { return(apps[0].Value); } //随机轮询 int use = 0; Random r = new Random(DateTime.Now.Millisecond); if (apps.Count > 1) { use = r.Next((apps.Count) * 10000) / 10000; } if (use == apps.Count) { use = use - 1; } return(apps[use].Value); }
/// <summary> /// 获取远程应用信息 /// /// 获取后序列化,保存本地缓存Appinfo /// 获取后注册被动更新方法到相关调用位置 /// </summary> /// <param name="RemoteAddr">远程应用保存服务信息</param> public void GetRemoteApps(IServiceProvider provider, DPBase.DiscoveryInfo discoveryInfo) { var services = provider.GetServices <DevelopBase.Discovery.IClient>(); var client = services.First(c => c.GetType().GetInterfaces().Contains(DiscoveryMap[discoveryInfo.ProtocolType].BaseInterface)); client.SetClient(discoveryInfo.Connstring, discoveryInfo.TimeOut); //注册被动更新 client.SetAction( new Action <string>((k) => { lock (Appinfos) { Appinfos.Remove(k); } }), new Action(() => { GetNewAppInfos(client); }), new Action <string, string>((k, v) => { lock (Appinfos) { Appinfos[k] = Newtonsoft.Json.JsonConvert.DeserializeObject <DPBase.RemoteAppInfo>(v); } }) ); GetNewAppInfos(client); }
/// <summary> /// 向远端注册服务信息 /// </summary> public void UpdateServer(IServiceProvider provider, DPBase.BaseServerInfo NewInfos) { //移除旧注册信息 var servers = provider.GetServices <DevelopBase.Discovery.IServer>(); var Register = servers.First(c => c.GetType().GetInterfaces().Contains(DiscoveryMap[BaseServerInfo.DiscoveryInfo.ProtocolType].BaseInterface)); //重置连接将删除以前全部数据 Register.SetServer(BaseServerInfo.DiscoveryInfo.Connstring); lock (Registered) { Registered.Clear(); } //更新本地缓存信息 Appinfos = provider.GetService <HashSet <DPBase.Appinfo> >(); if (Appinfos == null) { Appinfos = new HashSet <DPBase.Appinfo>(); } foreach (var item in NewInfos.Appinfos) { lock (Appinfos) { if (!Appinfos.Any(c => c.AppName == item.AppName)) { Appinfos.Add(item); } } } ProtocolInfos = NewInfos.ProtocolInfos; BaseServerInfo = NewInfos; //重新注册信息 foreach (var localInfo in Appinfos) { foreach (var SupportProtocolType in localInfo.SupportProtocolTypes) { var remoteInfo = new DPBase.RemoteAppInfo() { AppName = localInfo.AppName, ProtocolType = SupportProtocolType, HostName = BaseServerInfo.HostName, Infos = BaseServerInfo.Infos, HostAddr = ProtocolInfos.First(c => c.ProtocolType == SupportProtocolType).HostAddr, HostPort = ProtocolInfos.First(c => c.ProtocolType == SupportProtocolType).HostPort, }; lock (Registered) { var key = $"{remoteInfo.AppName}-{remoteInfo.HostName}-{remoteInfo.ProtocolType}"; Registered.Add(key, Newtonsoft.Json.JsonConvert.SerializeObject(remoteInfo)); Register.Register(key, Registered[key]); } } } }
/// <summary> /// 构造函数 /// 设置引用服务信息 /// /// 将用户设置信息序列化为对应的应用、协议和基础信息 /// </summary> /// <param name="BaseInfo">具体服务信息</param> public BaseService(IServiceCollection serviceCollection, DPBase.BaseServerInfo BaseInfo) { if (BaseInfo == null) { throw new Exception($" {nameof(BaseInfo)} can't be null ."); } //保存信息 ProtocolInfos = BaseInfo.ProtocolInfos; BaseServerInfo = BaseInfo; //本地映射信息因为是单例,所以要更新方式添加不能直接赋值 Appinfos = serviceCollection.BuildServiceProvider().GetService <HashSet <DPBase.Appinfo> >(); if (Appinfos == null) { Appinfos = new HashSet <DPBase.Appinfo>(); } foreach (var item in BaseInfo.Appinfos) { lock (Appinfos) { if (!Appinfos.Any(c => c.AppName == item.AppName)) { Appinfos.Add(item); } } } //依赖注入 serviceCollection.AddServices(MapBaseSettings()); var BaseProcess = new RegisterInfo() { FromName = "DevelopBase.Protocol.IBaseExtend, DevelopBase.Protocol", ToName = "DevelopBase.Protocol.BaseExtend, DevelopBase.Protocol" }; serviceCollection.AddServices(new RegisterInfo[] { BaseProcess }); //单例注入 serviceCollection.AddSingleton(Appinfos); }