Ejemplo n.º 1
0
        /// <summary>
        /// 同步分布式缓存键值对
        /// </summary>
        /// <returns></returns>
        private int SyncKeyValues()
        {
            var kvs = new List <Tuple <string, string> >();

            //刷新键值
            try
            {
                foreach (var key in ConsulCache.Instance.GetKeys())
                {
                    var value = ConsulLoader.GetKeyValue(key)
                                .GetAwaiter().GetResult();
                    if (value != null)
                    {
                        kvs.Add(new Tuple <string, string>(key, value));
                    }
                }
            }
            catch { }

            int count = ConsulCache.Instance.SetKeyValue(kvs.ToArray());

            //刷新Tags
            foreach (var sName in ConsulCache.Instance.GetServiceNames())
            {
                //var serviceTagKey = string.Format(ServiceTagsKeyFormat, serviceName, sName, Dns.GetHostName());
                var serviceTagKey = GetServiceTagsKey(sName);
                ConsulCache.Instance.SetServiceTag(sName, ConsulCache.Instance.GetKeyValue(serviceTagKey));
            }

            return(count);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 根据键获取值
        /// </summary>
        /// <param name="key">键</param>
        /// <returns>值</returns>
        public string GetKeyValue(string key)
        {
            var value = ConsulCache.Instance.GetKeyValue(key);

            try
            {
                if (value == null && !ConsulCache.Instance.GetKeys().Contains(key))
                {
                    value = ConsulLoader.GetKeyValue(key).GetAwaiter().GetResult();
                    ConsulCache.Instance.SetKeyValue(new Tuple <string, string>(key, value));
                }
            }
            catch { }

            return(value);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 根据键从Consul直接获取获取值,不缓存
        /// </summary>
        /// <param name="key">键</param>
        /// <returns>值</returns>
        public string GetKeyValueNoCache(string key)
        {
            var value = ConsulLoader.GetKeyValue(key).GetAwaiter().GetResult();

            return(value);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 初始化
        /// </summary>
        public void Initialize()
        {
            string basePath = null;

#if !CORECLR
            basePath = System.Web.HttpRuntime.AppDomainAppPath;
#else
            basePath = Directory.GetCurrentDirectory();
#endif

            //读取配置
            var consulConfig = new ConfigurationBuilder()
                               .SetBasePath(basePath)
                               .AddJsonFile("Config/consulplugin.json", true, false)
                               .Build().Get <ConsulConfigSection>();
            serviceName  = consulConfig.ServiceName;
            refreshBreak = consulConfig.RefreshBreak;
            heartBreak   = consulConfig.HeartBreak;

            //注册服务
            try
            {
                ConsulLoader.RegsterService(serviceName,
                                            consulConfig.ServiceTags,
                                            consulConfig.ServicePort,
                                            consulConfig.HeartBreak,
                                            consulConfig.HttpCheck,
                                            consulConfig.TcpCheck).GetAwaiter().GetResult();
            }
            catch { throw; }

            //若不存在HttpCheck且Interval存在时发送初始心跳
            if (string.IsNullOrEmpty(consulConfig.HttpCheck) &&
                string.IsNullOrEmpty(consulConfig.TcpCheck) &&
                heartBreak > 0)
            {
                HeartBreakService();
            }

            //读取缓存键值对配置信息
            if (consulConfig.KeyValues != null)
            {
                foreach (KeyValueElement kvConfig in consulConfig.KeyValues)
                {
                    ConsulCache.Instance.SetKeyValue(new Tuple <string, string>(kvConfig.Name, kvConfig.Value));
                }
            }


            //读取依赖服务配置信息
            if (consulConfig.Services != null)
            {
                foreach (ServiceElement serviceConfig in consulConfig.Services)
                {
                    ConsulCache.Instance.SetServiceTag(serviceConfig.Name, serviceConfig.ServiceTags);
                    var serviceTagKey = GetServiceTagsKey(serviceConfig.Name);
                    try
                    {
                        if (string.IsNullOrEmpty(ConsulLoader.GetKeyValue(serviceTagKey).GetAwaiter().GetResult()))
                        {
                            ConsulLoader.SetKeyValue(serviceTagKey, serviceConfig.ServiceTags).GetAwaiter().GetResult();
                        }
                    }
                    catch { }
                    ConsulCache.Instance.SetKeyValue(new Tuple <string, string>(serviceTagKey, serviceConfig.ServiceTags));
                }
            }

            //初次同步依赖服务信息及缓存信息
            SyncKeyValues();
            SyncServices();

            //若不存在HttpCheck且Interval存在时开启心跳线程
            if (string.IsNullOrEmpty(consulConfig.HttpCheck) &&
                string.IsNullOrEmpty(consulConfig.TcpCheck) &&
                heartBreak > 0)
            {
                new Thread(HeartProcess)
                {
                    IsBackground = true
                }.Start();
            }

            //同步线程开启
            new Thread(SyncProcess)
            {
                IsBackground = true
            }.Start();
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 初始化
        /// </summary>
        public void Initialize()
        {
            //读取配置
            var consulConfig = (ConsulConfigSection)ConfigurationManager.GetSection("consulplugin");

            serviceName  = consulConfig.ServiceName;
            refreshBreak = consulConfig.RefreshBreak;
            heartBreak   = consulConfig.HeartBreak;

            //注册服务
            try
            {
                ConsulLoader.RegsterService(serviceName,
                                            consulConfig.ServiceTags,
                                            consulConfig.ServicePort,
                                            consulConfig.HeartBreak,
                                            consulConfig.HttpCheck,
                                            consulConfig.TcpCheck).GetAwaiter().GetResult();
            }
            catch { }

            //若不存在HttpCheck且Interval存在时发送初始心跳
            if (string.IsNullOrEmpty(consulConfig.HttpCheck) &&
                string.IsNullOrEmpty(consulConfig.TcpCheck) &&
                heartBreak > 0)
            {
                HeartBreakService();
            }

            //读取缓存键值对配置信息
            foreach (KeyValueElement kvConfig in consulConfig.KeyValues)
            {
                ConsulCache.Instance.SetKeyValue(new Tuple <string, string>(kvConfig.Name, kvConfig.Value));
            }


            //读取依赖服务配置信息
            foreach (ServiceElement serviceConfig in consulConfig.Services)
            {
                ConsulCache.Instance.SetServiceTag(serviceConfig.Name, serviceConfig.ServiceTags);
                //var serviceTagKey = string.Format(ServiceTagsKeyFormat, serviceName, serviceConfig.Name, Dns.GetHostName());
                var serviceTagKey = GetServiceTagsKey(serviceConfig.Name);
                try
                {
                    if (string.IsNullOrEmpty(ConsulLoader.GetKeyValue(serviceTagKey).GetAwaiter().GetResult()))
                    {
                        ConsulLoader.SetKeyValue(serviceTagKey, serviceConfig.ServiceTags).GetAwaiter().GetResult();
                    }
                }
                catch { }
                ConsulCache.Instance.SetKeyValue(new Tuple <string, string>(serviceTagKey, serviceConfig.ServiceTags));
            }

            //初次同步依赖服务信息及缓存信息
            SyncServices();
            SyncKeyValues();

            //若不存在HttpCheck且Interval存在时开启心跳线程
            if (string.IsNullOrEmpty(consulConfig.HttpCheck) &&
                string.IsNullOrEmpty(consulConfig.TcpCheck) &&
                heartBreak > 0)
            {
                new Thread(HeartProcess)
                {
                    IsBackground = true
                }.Start();
            }

            //同步线程开启
            new Thread(SyncProcess)
            {
                IsBackground = true
            }.Start();
        }