public void Default_keyed_value_with_accept_header()
        {
            //Arrange
            const string scheme      = "http";
            const string host        = "localhost";
            const int    port        = 80;
            const string path        = "/hello";
            const string headerId    = "Accept";
            const string headerValue = "application/json";

            var request = A.Fake <HttpRequest>();

            var headers = new Dictionary <string, Microsoft.Extensions.Primitives.StringValues>
            {
                { headerId, new Microsoft.Extensions.Primitives.StringValues(headerValue) }
            };

            A.CallTo(() => request.Scheme).Returns(scheme);
            A.CallTo(() => request.Host).Returns(new HostString(host, port));
            A.CallTo(() => request.Path).Returns(path);
            A.CallTo(() => request.Headers).Returns(new HeaderDictionary(headers));

            var keyGen = new DefaultKeyGenerator();

            //Act
            string key = keyGen.Get(request);

            //Assert
            Assert.Contains(scheme, key);
            Assert.Contains(host, key);
            Assert.Contains(port.ToString(), key);
            Assert.Contains(path, key);
            Assert.Contains(headerId, key);
            Assert.Contains(headerValue, key);
        }
        public void Default_keyed_value_with_query()
        {
            //Arrange
            const string scheme     = "http";
            const string host       = "localhost";
            const int    port       = 80;
            const string path       = "/hello";
            const string queryId    = "id";
            const string queryValue = "value";

            var request = A.Fake <HttpRequest>();

            var query = new Dictionary <string, Microsoft.Extensions.Primitives.StringValues>
            {
                { queryId, new Microsoft.Extensions.Primitives.StringValues(queryValue) }
            };

            A.CallTo(() => request.Scheme).Returns(scheme);
            A.CallTo(() => request.Host).Returns(new HostString(host, port));
            A.CallTo(() => request.Path).Returns(path);
            A.CallTo(() => request.Query).Returns(new QueryCollection(query));

            var keyGen = new DefaultKeyGenerator();

            //Act
            string key = keyGen.Get(request);

            //Assert
            Assert.Contains(scheme, key);
            Assert.Contains(host, key);
            Assert.Contains(port.ToString(), key);
            Assert.Contains(path, key);
            Assert.Contains(queryId, key);
            Assert.Contains(queryValue, key);
        }
        public void Default_keyed_value()
        {
            //Arrange
            const string scheme = "http";
            const string host   = "localhost";
            const int    port   = 80;
            const string path   = "/hello";

            var request = A.Fake <HttpRequest>();

            A.CallTo(() => request.Scheme).Returns(scheme);
            A.CallTo(() => request.Host).Returns(new HostString(host, port));
            A.CallTo(() => request.Path).Returns(path);

            var keyGen = new DefaultKeyGenerator();

            //Act
            string key = keyGen.Get(request);

            //Assert
            Assert.Contains(scheme, key);
            Assert.Contains(host, key);
            Assert.Contains(port.ToString(), key);
            Assert.Contains(path, key);
        }
示例#4
0
        public void Default_caching_option_with_constructor_key()
        {
            //Arrange
            var key = new DefaultKeyGenerator();

            //Act
            var cachingOption = new CachingOption(key);

            //Assert
            Assert.StrictEqual(key, cachingOption.Key);
        }
        public void Default_keyed_null()
        {
            //Arrange
            var keyGen = new DefaultKeyGenerator();

            //Act
            string key = keyGen.Get(null);

            //Assert
            Assert.Empty(key);
        }
        /// <summary>
        /// 是否开启降级
        /// </summary>
        /// <returns></returns>
        public static bool IsOpenDegrade()
        {
            var keyGenerator = new DefaultKeyGenerator();
            var cacheKey     = keyGenerator.GetKeyRegion(CacheConstants.ServiceKeyNamespace, CacheConstants.KeyDegradation);
            var redisValue   = Helper.StringGet(cacheKey);

            if (redisValue.HasValue)
            {
                return((int)redisValue > 0);
            }
            return(false);
        }
示例#7
0
        public void Default_caching_option_with_constructor_key_and_store()
        {
            //Arrange
            var key   = new DefaultKeyGenerator();
            var store = new DefaultMemoryStore();

            //Act
            var cachingOption = new CachingOption(key, store);

            //Assert
            Assert.StrictEqual(key, cachingOption.Key);
            Assert.StrictEqual(store, cachingOption.Store);
        }
        /// <summary>
        /// 设置限流降级脚本(请求数限流)
        /// </summary>
        /// <param name="limit">限制请求数(1s)</param>
        /// <param name="duration">设置降级持续时间(s)</param>
        public static bool ThrottlingDegrade(int limit, int duration)
        {
            var str          = @"
                        local limitKey = KEYS[1]
                        local degradeKey = KEYS[2]
                        local limit = tonumber(ARGV[1])
                        local d = tonumber(ARGV[2])
                        
                        local current = tonumber(redis.call('GET',limitKey) or '0')
                        --超过1秒limit数时 开启动态降级
                        if current >= limit then
                            redis.call('SET',degradeKey,1)
                            redis.call('EXPIRE',degradeKey,d)
                        else 
                            redis.call('INCRBY',limitKey,1)
                            redis.call('EXPIRE',limitKey,1)
                        end

                        --判断是否已经动态开启降级
                        local v = tonumber(redis.call('GET',degradeKey) or '0')
                        if v > 0 then
                           return 1;
                        else
                           return 0;
                        end 
                        ";
            var keyGenerator = new DefaultKeyGenerator();
            var d            = keyGenerator.GetKeyRegion(CacheConstants.ServiceKeyNamespace, CacheConstants.KeyDegradation);
            var l            = keyGenerator.GetKeyRegion(CacheConstants.ServiceKeyNamespace, CacheConstants.KeyLimitSecond);
            var result       = Helper.ExecLuaScript(str, new[] { l, d }, new[] { limit.ToString(), duration.ToString() });

            if (!result.IsNull)
            {
                return((int)result > 0);
            }
            return(false);
        }