Exemple #1
0
        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);
                        }
                    }
                }
            }
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        /// <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]);
                    }
                }
            }
        }
Exemple #5
0
        /// <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);
        }