예제 #1
0
        /// <summary>
        /// 获取并转换Consul配置信息
        /// </summary>
        /// <param name="reloading"></param>
        /// <param name="source"></param>
        /// <returns></returns>
        public async Task <IDictionary <string, string> > GetConfig(bool reloading, IConsulConfigurationSource source)
        {
            QueryResult <KVPair> kvPair = await this.GetKvPairs(source.ServiceKey, source.QueryOptions, source.CancellationToken).ConfigureAwait(false);

            switch (kvPair?.Response)
            {
            case null when !source.Optional:
            {
                if (!reloading)
                {
                    throw new FormatException("Error_InvalidService" + source.ServiceKey);
                }

                return(new Dictionary <string, string>());
            }

            case null:
                throw new FormatException("Error_ValueNotExist" + source.ServiceKey);

            default:
                this.UpdateLastIndex(kvPair);

                return(JsonConfigurationFileParser.Parse(source.ServiceKey, new MemoryStream(kvPair.Response.Value)));
            }
        }
        /// <summary>
        /// 获取并转换Consul配置信息
        /// </summary>
        /// <param name="reloading"></param>
        /// <param name="source"></param>
        /// <returns></returns>
        public async Task <IDictionary <string, string> > GetConfig(bool reloading, IConsulConfigurationSource source)
        {
            try
            {
                QueryResult <KVPair> kvPair = await this.GetKvPairs(source.ServiceKey, source.QueryOptions, source.CancellationToken).ConfigureAwait(false);

                if ((kvPair?.Response == null) && !source.Optional)
                {
                    if (!reloading)
                    {
                        throw new FormatException(Resources.Error_InvalidService(source.ServiceKey));
                    }

                    return(new Dictionary <string, string>());
                }

                if (kvPair?.Response == null)
                {
                    throw new FormatException(Resources.Error_ValueNotExist(source.ServiceKey));
                }

                this.UpdateLastIndex(kvPair);

                return(JsonConfigurationFileParser.Parse(source.ServiceKey, new MemoryStream(kvPair.Response.Value)));
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }
 internal ConsulWatchExceptionContext(
     Exception exception,
     int consecutiveFailureCount,
     IConsulConfigurationSource source)
 {
     Exception = exception;
     ConsecutiveFailureCount = consecutiveFailureCount;
     Source = source;
 }
예제 #4
0
        public ConsulConfigurationProvider(IConsulConfigurationSource source)
        {
            _source = source;
            _url    = new Uri(source.Url, $"v1/kv/{_source.Path}");

            _httpClient = new HttpClient(new HttpClientHandler {
                AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
            }, true);
        }
            public Load()
            {
                _source = new ConsulConfigurationSource("Test", default(CancellationToken))
                {
                    Parser         = _configParserMock.Object,
                    ReloadOnChange = false
                };

                _consulConfigProvider = new ConsulConfigurationProvider(_source, _consulConfigClientMock.Object);
            }
 private void ConsulClientOptions(IConsulConfigurationSource source)
 {
     source.ConsulConfigurationOptions = config =>
     {
         config.Address    = new Uri(_configuration["ServiceConfig:serviceDiscoveryAddress"]);
         config.Datacenter = _configuration["ServiceConfig:DataCenter"];
         //config.Token = "";
     };
     source.ReloadOnChange = true;
     source.Optional       = true;
 }
예제 #7
0
 static void ConfigureConsulOptions(IConsulConfigurationSource options, ConsulClientConfiguration consulClientConfiguration)
 {
     options.Optional = false;
     options.ConsulConfigurationOptions = x =>
     {
         x.Address    = consulClientConfiguration.Address;
         x.Datacenter = consulClientConfiguration.Datacenter;
         x.Token      = consulClientConfiguration.Token;
         x.WaitTime   = consulClientConfiguration.WaitTime;
     };
     options.ReloadOnChange = false;
 }
예제 #8
0
        public ConsulConfigurationProvider(
            IConsulConfigurationSource source,
            IConsulClientFactory consulClientFactory)
        {
            if (source.Parser == null)
            {
                throw new ArgumentNullException(nameof(source.Parser));
            }

            _source = source;
            _consulClientFactory     = consulClientFactory;
            _cancellationTokenSource = new CancellationTokenSource();
        }
            public Reload()
            {
                _source = new ConsulConfigurationSource("Test", default(CancellationToken))
                {
                    Parser         = _configParserMock.Object,
                    ReloadOnChange = true
                };
                _firstChangeToken = new ConfigurationReloadToken();
                _consulConfigClientMock
                .SetupSequence(ccc => ccc.Watch("Test", It.IsAny <Action <ConsulWatchExceptionContext> >(), default(CancellationToken)))
                .Returns(_firstChangeToken)
                .Returns(new ConfigurationReloadToken());

                _consulConfigProvider = new ConsulConfigurationProvider(
                    _source,
                    _consulConfigClientMock.Object);
            }
        public ConsulConfigurationProvider(IConsulConfigurationSource source, IConsulConfigurationClient consulConfigClient, string serviceKey)
        {
            this.consulConfigClient = consulConfigClient;
            this.source             = source;
            this.serviceKey         = serviceKey;

            if (source.ReloadOnChange)
            {
                ChangeToken.OnChange(
                    () => this.consulConfigClient.Watch(this.source.Key, this.source.CancellationToken),
                    async() =>
                {
                    await this.DoLoad(true).ConfigureAwait(false);

                    this.OnReload();
                });
            }
        }
        public ConsulConfigurationProvider(IConsulConfigurationSource source, ConsulConfigurationParser configurationParser)
        {
            this.configurationParser = configurationParser;
            this.source = source;

            if (source.ReloadOnChange)
            {
                ChangeToken.OnChange(
                    () => this.configurationParser.Watch(this.source.ServiceKey, this.source.CancellationToken),
                    async() =>
                {
                    await this.configurationParser.GetConfig(true, source).ConfigureAwait(false);

                    Thread.Sleep(source.ReloadDelay);

                    this.OnReload();
                });
            }
        }
        public ConsulConfigurationProvider(IConsulConfigurationSource source, ConsulConfigurationParser configurationParser)
        {
            this.configurationParser = configurationParser;
            this.source = source;

            if (source.ReloadOnChange)
            {
                ChangeToken.OnChange(
                    () => this.configurationParser.Watch(this.source.ServiceKey, this.source.CancellationToken),
                    async() =>
                {
                    Console.WriteLine("--------- SyZero.Consul:检测到配置变更 => 开始重新加载配置");
                    await this.configurationParser.GetConfig(true, source).ConfigureAwait(false);
                    Thread.Sleep(source.ReloadDelay);
                    this.Load();
                    Console.WriteLine("--------- SyZero.Consul:检测到配置变更 => 完成");
                    this.OnReload();
                });
            }
        }
예제 #13
0
        public ConsulConfigurationProvider(IConsulConfigurationSource source, IConsulConfigurationClient consulConfigClient)
        {
            if (source.Parser == null)
            {
                throw new ArgumentNullException(nameof(source.Parser));
            }

            _consulConfigClient = consulConfigClient;
            _source             = source;

            if (source.ReloadOnChange)
            {
                ChangeToken.OnChange(
                    () => _consulConfigClient.Watch(_source.OnWatchException),
                    async() =>
                {
                    await DoLoad(reloading: true);
                    OnReload();
                });
            }
        }
        public ConsulConfigurationProviderTests()
        {
            _kvEndpoint = new Mock <IKVEndpoint>(MockBehavior.Strict);
            var consulClient = new Mock <IConsulClient>(MockBehavior.Strict);

            consulClient
            .Setup(cc => cc.KV)
            .Returns(_kvEndpoint.Object);
            consulClient
            .Setup(cc => cc.Dispose());
            var consulClientFactory = new Mock <IConsulClientFactory>(MockBehavior.Strict);

            consulClientFactory
            .Setup(ccf => ccf.Create())
            .Returns(consulClient.Object);
            _parser = new Mock <IConfigurationParser>(MockBehavior.Strict);
            _source = new ConsulConfigurationSource("Test")
            {
                Parser = _parser.Object
            };
            _provider = new ConsulConfigurationProvider(
                _source,
                consulClientFactory.Object);
        }
예제 #15
0
 internal ConsulWatchExceptionContext(IConsulConfigurationSource source, Exception exception)
 {
     Exception = exception;
     Source    = source;
 }
예제 #16
0
 public ConsulConfigurationClient(IConsulConfigurationSource consulConfigurationSource)
 {
     this.consulConfigurationSource = consulConfigurationSource;
 }
 public ConsulConfigurationParser(IConsulConfigurationSource consulConfigurationSource)
 {
     this.consulConfigurationSource = consulConfigurationSource;
 }
예제 #18
0
 public ConsulConfigurationClient(IConsulClientFactory consulClientFactory, IConsulConfigurationSource source)
 {
     _consulClientFactory = consulClientFactory;
     _source = source;
 }
예제 #19
0
 public ConsulClientFactory(IConsulConfigurationSource consulConfigSource)
 {
     _consulConfigSource = consulConfigSource;
 }
예제 #20
0
 public static ConsulClient CreateConsulClient(this IConsulConfigurationSource _consulConfigSource)
 {
     return(new ConsulClient(_consulConfigSource.ConsulConfigurationOptions,
                             _consulConfigSource.ConsulHttpClientOptions,
                             _consulConfigSource.ConsulHttpClientHandlerOptions));
 }
예제 #21
0
 internal ConsulLoadExceptionContext(IConsulConfigurationSource source, Exception exception)
 {
     Source    = source;
     Exception = exception;
 }