Пример #1
0
 private void RefreshAndInitFiles(string zkHosts, IEnumerable <string> files)
 {
     if (files != null)
     {
         IZkTreeBuilder fileBuilder = new ZkFileTreeBuilder(config.ClientInfo.AppName, config.ClientInfo.Version, config.ClientInfo.Environment);
         foreach (var file in files)
         {
             fileBuilder.GetOrAddZnodeName(file);
             this._handler.Execute(() =>
             {
                 if (!config.UpdateStrategy.FileIgnoreList.Contains(file))
                 {
                     //对于文件类型,如果本地没配置过Rule规则,则采用默认规则,即将文件复制到实际位置,然后RefreshSection配置对应的文件名
                     this.FileRules.For(file);
                     this.FileRules.ConfigChanged(file, null);
                 }
             }, string.Format("Some thing is wrong with file '{0}'", file));//除了外部包含保证Exception不会导致程序异常,方法内部同样需要保证单次异常不会导致其它监控流程失败
         }
         if (!string.IsNullOrWhiteSpace(zkHosts))
         {
             this._fileWatcher              = new NodeWatcher(zkHosts, 30000, fileBuilder, config.ClientInfo.ClientName);
             this._fileWatcher.NodeChanged += _fileWatcher_NodeChanged;
         }
     }
 }
Пример #2
0
        private void GetAllConfigs()
        {
            IEnumerable <string>         files;
            IDictionary <string, string> items;

            FetchManager.Instance.GetAllConfigs(out files, out items);
            string zkHosts = FetchManager.Instance.GetZookeeperHosts();

            if (files != null)
            {
                IZkTreeBuilder fileBuilder = new ZkFileTreeBuilder(config.ClientInfo.AppName, config.ClientInfo.Version, config.ClientInfo.Environment);
                foreach (var file in files)
                {
                    fileBuilder.GetOrAddZnodeName(file);
                    this.FileRules.For(file);
                    this.FileRules.ConfigChanged(file, null);
                }
                this._fileWatcher              = new NodeWatcher(zkHosts, 30000, fileBuilder);
                this._fileWatcher.NodeChanged += _fileWatcher_NodeChanged;
            }
            if (items != null)
            {
                IZkTreeBuilder itemBuilder = new ZkItemTreeBuilder(config.ClientInfo.AppName, config.ClientInfo.Version, config.ClientInfo.Environment);
                foreach (var item in items.Keys)
                {
                    itemBuilder.GetOrAddZnodeName(item);
                    this.ItemRules.ConfigChanged(item, items[item]);
                }
                this._itemWatcher              = new NodeWatcher(zkHosts, 30000, itemBuilder);
                this._itemWatcher.NodeChanged += _itemWatcher_NodeChanged;;
            }
        }
Пример #3
0
        private async Task AddWatcher(params IZkTreeBuilder[] builders)
        {
            var signatureData = new SignatureData
            {
                HashAlgorithm = this._setting.Security.HashAlgorithm
            };

            signatureData.SetSecretKey(this._setting.Security.SecretKey);
            var zkHost = await this._fetcher.GetZkHosts(signatureData).ConfigureAwait(false);

            this._watcher              = new NodeWatcher(zkHost, this._setting.ZookeeperSessionTimeout, this._setting.ClientInfo.ClientIdentity, builders);
            this._watcher.NodeChanged += Watcher_NodeChanged;
            this._watcher.StartConnect();
        }
Пример #4
0
        /// <summary>
        /// 刷新键值对
        /// </summary>
        /// <param name="zkHosts"></param>
        /// <param name="items"></param>
        private void RefreshAndInitItems(string zkHosts, IDictionary <string, string> items)
        {
            if (items != null)
            {
                var itemBuilder = new ZkItemTreeBuilder(config.ClientInfo.AppName, config.ClientInfo.Version, config.ClientInfo.Environment);
                foreach (var itemName in items.Keys)
                {
                    itemBuilder.GetOrAddZnodeName(itemName);
                    ItemWatcher_NodeChanged(itemName);
                }

                if (!string.IsNullOrWhiteSpace(zkHosts))
                {
                    _itemWatcher              = new NodeWatcher(zkHosts, 30000, itemBuilder, config.ClientInfo.ClientName);
                    _itemWatcher.NodeChanged += ItemWatcher_NodeChanged;
                }
            }
        }
Пример #5
0
        /// <summary>
        /// 刷新文件配置
        /// </summary>
        /// <param name="zkHosts"></param>
        /// <param name="files"></param>
        private void RefreshAndInitFiles(string zkHosts, IEnumerable <string> files)
        {
            if (files != null)
            {
                var fileBuilder = new ZkFileTreeBuilder(config.ClientInfo.AppName, config.ClientInfo.Version, config.ClientInfo.Environment);
                foreach (var configName in files)
                {
                    fileBuilder.GetOrAddZnodeName(configName);
                    FileRules.For(configName).MapTo(configName);
                    FileWatcher_NodeChanged(configName);
                }

                if (!string.IsNullOrWhiteSpace(zkHosts))
                {
                    _fileWatcher              = new NodeWatcher(zkHosts, 30000, fileBuilder, config.ClientInfo.ClientName);
                    _fileWatcher.NodeChanged += FileWatcher_NodeChanged;
                }
            }
        }
Пример #6
0
        public virtual async Task WatchedByAsync(NodeWatcher watcher)
        {
            if (watcher == null)
            {
                throw new ArgumentNullException(nameof(watcher));
            }
            _watcher = watcher;
            //说明:如果znode存在,则会注册一个existWatch, 反之则会注册一个dataWatch
            _stat = await Connection.existsAsync(Path, _watcher).ConfigureAwait(false);

            //如果znode已经存在,则直接监控其children
            if (_stat != null)
            {
                await WatchChildrenAsync(_watcher).ConfigureAwait(false);
            }
            ////znode被删除时,会丢失对children的监控
            //NodeCreated += async (_, __) =>
            //{
            //    await WatchChildrenAsync(watcher).ConfigureAwait(false);
            //};
        }
Пример #7
0
 private void RefreshAndInitItems(string zkHosts, IDictionary <string, string> items)
 {
     if (items != null)
     {
         IZkTreeBuilder itemBuilder = new ZkItemTreeBuilder(config.ClientInfo.AppName, config.ClientInfo.Version, config.ClientInfo.Environment);
         foreach (var item in items.Keys)
         {
             itemBuilder.GetOrAddZnodeName(item);
             this._handler.Execute(() =>
             {
                 if (!config.UpdateStrategy.ItemIgnoreList.Contains(item))
                 {
                     //键值对必须配置本地规则,否则无法处理
                     this.ItemRules.ConfigChanged(item, items[item]);
                 }
             }, string.Format("Some thing is wrong with item '{0}'", item));
         }
         if (!string.IsNullOrWhiteSpace(zkHosts))
         {
             this._itemWatcher              = new NodeWatcher(zkHosts, 30000, itemBuilder, config.ClientInfo.ClientName);
             this._itemWatcher.NodeChanged += _itemWatcher_NodeChanged;
         }
     }
 }
Пример #8
0
        /// <summary>
        /// 同步zookeeper服务并序列化成配置文件到本地
        /// 初始化
        /// </summary>
        public void InitClient()
        {
            var task = Task.Run(() =>
            {
                this._handler.Execute(() => {
                    StringBuilder logBuilder = new StringBuilder();

                    #region  步配置到本地
                    if (!Directory.Exists(ClientPath))
                    {
                        Directory.CreateDirectory(ClientPath);
                    }

                    logBuilder.AppendLine("同步zookeeper数据到本地\r\n");
                    using (MaintainWatcher mk = new MaintainWatcher(config.Host, 1000))
                    {
                        ZooKeeper zk = mk.ZooKeeper;
                        //本地站点的名称
                        string name = config.ClientInfo.AppName;
                        var stat    = zk.Exists($"/{name}", false);
                        if (stat == null)
                        {
                            return;
                        }
                        if (!System.IO.Directory.Exists(Path.Combine(ClientPath, name)))
                        {
                            System.IO.Directory.CreateDirectory(Path.Combine(ClientPath, name));
                        }

                        var children = zk.GetChildren($"/{name}", false);//取不到节点会报错
                        foreach (var child in children)
                        {
                            stat             = new Stat();
                            var tmpdata      = zk.GetData($"/{name}/{child}", false, stat);
                            string tmpString = System.Text.Encoding.UTF8.GetString(tmpdata);
                            ZNode znode      = Deserialize(tmpString);
                            if (znode == null)
                            {
                                continue;
                            }
                            znode.Version = stat.Version;

                            //看下本地的配置文件版本号,需要不需要更新
                            string file  = Path.Combine(ClientPath, name, child + ".txt");
                            string text  = FileHelper.ReadFile(file);
                            ZNode zLocal = Deserialize(text);

                            if (zLocal == null || zLocal.Version < znode.Version)
                            {
                                FileHelper.WriteFile(file, znode.ToString());
                                logBuilder.AppendLine($"下载节点:{$"/{name}/{child}"},值:{JsonHelper.ToNewtonJsonString(znode)}");
                            }
                        }
                    }
                    #endregion

                    #region 加载配置到内存
                    var files = Directory.GetFiles(Path.Combine(ClientPath, config.ClientInfo.AppName), "*.txt");
                    IZkTreeBuilder itemBuilder = new ZkTreeBuilder(config.ClientInfo.AppName);
                    foreach (string file in files)
                    {
                        string key  = Path.GetFileNameWithoutExtension(file);
                        string text = FileHelper.ReadFile(file);
                        ZNode znode = Deserialize(text);
                        if (znode == null)
                        {
                            continue;
                        }
                        itemBuilder.GetOrAddZnodeName($"/{config.ClientInfo.AppName}/{key}", znode.Value);
                    }
                    this._itemWatcher              = new NodeWatcher(config.Host, 30000, itemBuilder);
                    this._itemWatcher.NodeChanged += _itemWatcher_NodeChanged;
                    #endregion

                    LogHelper.WriteCustom(logBuilder.ToString(), "zookeeper\\", false);
                }, string.Empty);
            });

            task.Wait();
        }
Пример #9
0
		/// <summary>
		/// 监控路径,监控前会事先创建路径,并且会新建一个自己的Temp子结点
		/// </summary>
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: public void watchPath(com.baidu.disconf.client.core.processor.DisconfCoreProcessor disconfCoreMgr, com.baidu.disconf.client.common.model.DisConfCommonModel disConfCommonModel, String keyName, com.baidu.disconf.core.common.constants.DisConfigTypeEnum disConfigTypeEnum, String value) throws Exception
		public virtual void watchPath(DisconfCoreProcessor disconfCoreMgr, DisConfCommonModel disConfCommonModel, string keyName, DisConfigTypeEnum disConfigTypeEnum, string value)
		{

			// 新建
			string monitorPath = makeMonitorPath(disConfigTypeEnum, disConfCommonModel, keyName, value);

			// 进行监控
			NodeWatcher nodeWatcher = new NodeWatcher(disconfCoreMgr, monitorPath, keyName, disConfigTypeEnum, new DisconfSysUpdateCallback(), debug);
			nodeWatcher.monitorMaster();
		}