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); }
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); }
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); }