diff --git a/docs/content/assets/img/middleware/ratelimit.png b/docs/content/assets/img/middleware/ratelimit.png deleted file mode 100644 index 049af712e..000000000 Binary files a/docs/content/assets/img/middleware/ratelimit.png and /dev/null differ diff --git a/docs/content/middlewares/ratelimit.md b/docs/content/middlewares/ratelimit.md index 058c67b27..b1d7a0a84 100644 --- a/docs/content/middlewares/ratelimit.md +++ b/docs/content/middlewares/ratelimit.md @@ -3,8 +3,6 @@ To Control the Number of Requests Going to a Service {: .subtitle } -![RateLimit](../assets/img/middleware/ratelimit.png) - The RateLimit middleware ensures that services will receive a _fair_ number of requests, and allows you define what is fair. ## Configuration Example diff --git a/integration/access_log_test.go b/integration/access_log_test.go index 5017b2132..ea21fe500 100644 --- a/integration/access_log_test.go +++ b/integration/access_log_test.go @@ -309,8 +309,6 @@ func (s *AccessLogSuite) TestAccessLogFrontendRedirect(c *check.C) { } func (s *AccessLogSuite) TestAccessLogRateLimit(c *check.C) { - c.Skip("RateLimit is disable for now") - ensureWorkingDirectoryIsClean() expected := []accessLogValue{ diff --git a/integration/fixtures/tracing/simple-jaeger-collector.toml b/integration/fixtures/tracing/simple-jaeger-collector.toml index 14bb2b42a..559f9a149 100644 --- a/integration/fixtures/tracing/simple-jaeger-collector.toml +++ b/integration/fixtures/tracing/simple-jaeger-collector.toml @@ -28,7 +28,7 @@ [http.routers] [http.routers.router1] Service = "service1" - Middlewares = ["retry", "ratelimit"] + Middlewares = ["retry", "ratelimit-1"] Rule = "Path(`/ratelimit`)" [http.routers.router2] Service = "service2" @@ -44,16 +44,9 @@ attempts = 3 [http.middlewares.basic-auth.basicAuth] users = ["test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/", "test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0"] - [http.middlewares.ratelimit.rateLimit] - extractorfunc = "client.ip" - [http.middlewares.ratelimit.rateLimit.rateSet.rateset1] - period = "60s" - average = 4 - burst = 5 - [http.middlewares.ratelimit.rateLimit.rateSet.rateset2] - period = "3s" - average = 1 - burst = 2 + [http.middlewares.ratelimit-1.rateLimit] + average = 1 + burst = 2 [http.services] diff --git a/integration/fixtures/tracing/simple-jaeger.toml b/integration/fixtures/tracing/simple-jaeger.toml index 3bc8a08d3..6f5e7da3a 100644 --- a/integration/fixtures/tracing/simple-jaeger.toml +++ b/integration/fixtures/tracing/simple-jaeger.toml @@ -27,7 +27,7 @@ [http.routers] [http.routers.router1] Service = "service1" - Middlewares = ["retry", "ratelimit"] + Middlewares = ["retry", "ratelimit-1"] Rule = "Path(`/ratelimit`)" [http.routers.router2] Service = "service2" @@ -43,17 +43,9 @@ attempts = 3 [http.middlewares.basic-auth.basicAuth] users = ["test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/", "test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0"] - [http.middlewares.ratelimit.rateLimit] - extractorfunc = "client.ip" - [http.middlewares.ratelimit.rateLimit.rateSet.rateset1] - period = "60s" - average = 4 - burst = 5 - [http.middlewares.ratelimit.rateLimit.rateSet.rateset2] - period = "3s" - average = 1 - burst = 2 - + [http.middlewares.ratelimit-1.rateLimit] + average = 1 + burst = 2 [http.services] [http.services.service1] diff --git a/integration/fixtures/tracing/simple-zipkin.toml b/integration/fixtures/tracing/simple-zipkin.toml index 41f858dbe..c5bc9d143 100644 --- a/integration/fixtures/tracing/simple-zipkin.toml +++ b/integration/fixtures/tracing/simple-zipkin.toml @@ -24,7 +24,7 @@ [http.routers] [http.routers.router1] service = "service1" - middlewares = ["retry", "ratelimit"] + middlewares = ["retry", "ratelimit-1"] rule = "Path(`/ratelimit`)" [http.routers.router2] service = "service2" @@ -40,16 +40,9 @@ attempts = 3 [http.middlewares.basic-auth.basicAuth] users = ["test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/", "test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0"] - [http.middlewares.ratelimit.rateLimit] - extractorfunc = "client.ip" - [http.middlewares.ratelimit.rateLimit.rateSet.rateset1] - period = "60s" - average = 4 - burst = 5 - [http.middlewares.ratelimit.rateLimit.rateSet.rateset2] - period = "3s" - average = 1 - burst = 2 + [http.middlewares.ratelimit-1.rateLimit] + average = 1 + burst = 2 [http.services] [http.services.service1] diff --git a/integration/resources/compose/access_log.yml b/integration/resources/compose/access_log.yml index d07f6d8a1..57215aef1 100644 --- a/integration/resources/compose/access_log.yml +++ b/integration/resources/compose/access_log.yml @@ -55,19 +55,17 @@ frontendRedirect: - traefik.http.middlewares.redirecthttp.redirectScheme.scheme=http - traefik.http.middlewares.redirecthttp.redirectScheme.port=8000 - traefik.http.services.service3.loadbalancer.server.port=80 -# TODO: disable temporarily (rateLimit) -#rateLimit: -# image: containous/whoami -# labels: -# - traefik.enable=true -# - traefik.http.routers.rt-rateLimit.entryPoints=httpRateLimit -# - traefik.http.routers.rt-rateLimit.rule=Host("ratelimit.docker.local") -# - traefik.http.routers.rt-rateLimit.middlewares=rate -# - traefik.http.middlewares.rate.ratelimit.extractorfunc=client.ip -# - traefik.http.middlewares.rate.ratelimit.rateset.Rate0.average=1 -# - traefik.http.middlewares.rate.ratelimit.rateset.Rate0.burst=2 -# - traefik.http.middlewares.rate.ratelimit.rateset.Rate0.period=10s -# - traefik.http.services.service3.loadbalancer.server.port=80 +rateLimit: + image: containous/whoami + labels: + - traefik.enable=true + - traefik.http.routers.rt-rateLimit.entryPoints=httpRateLimit + - traefik.http.routers.rt-rateLimit.rule=Host("ratelimit.docker.local") + - traefik.http.routers.rt-rateLimit.middlewares=rate + - traefik.http.middlewares.rate.ratelimit + - traefik.http.middlewares.rate.ratelimit.average=1 + - traefik.http.middlewares.rate.ratelimit.burst=2 + - traefik.http.services.service3.loadbalancer.server.port=80 frontendWhitelist: image: containous/whoami labels: diff --git a/integration/tracing_test.go b/integration/tracing_test.go index 26cf987f9..0dbf009c5 100644 --- a/integration/tracing_test.go +++ b/integration/tracing_test.go @@ -41,8 +41,6 @@ func (s *TracingSuite) startZipkin(c *check.C) { } func (s *TracingSuite) TestZipkinRateLimit(c *check.C) { - c.Skip("RateLimit is disable for now") - s.startZipkin(c) defer s.composeProject.Stop(c, "zipkin") file := s.adaptFile(c, "fixtures/tracing/simple-zipkin.toml", TracingTemplate{ @@ -88,7 +86,7 @@ func (s *TracingSuite) TestZipkinRateLimit(c *check.C) { err = try.GetRequest("http://127.0.0.1:8000/ratelimit", 500*time.Millisecond, try.StatusCodeIs(http.StatusTooManyRequests)) c.Assert(err, checker.IsNil) - err = try.GetRequest("http://"+s.IP+":9411/api/v2/spans?serviceName=tracing", 20*time.Second, try.BodyContains("forward service1/router1@file", "ratelimit@file")) + err = try.GetRequest("http://"+s.IP+":9411/api/v2/spans?serviceName=tracing", 20*time.Second, try.BodyContains("forward service1/router1@file", "ratelimit-1@file")) c.Assert(err, checker.IsNil) } @@ -157,8 +155,6 @@ func (s *TracingSuite) startJaeger(c *check.C) { } func (s *TracingSuite) TestJaegerRateLimit(c *check.C) { - c.Skip("RateLimit is disable for now") - s.startJaeger(c) defer s.composeProject.Stop(c, "jaeger") file := s.adaptFile(c, "fixtures/tracing/simple-jaeger.toml", TracingTemplate{ @@ -200,13 +196,11 @@ func (s *TracingSuite) TestJaegerRateLimit(c *check.C) { err = try.GetRequest("http://127.0.0.1:8000/ratelimit", 500*time.Millisecond, try.StatusCodeIs(http.StatusOK)) c.Assert(err, checker.IsNil) - time.Sleep(3 * time.Second) err = try.GetRequest("http://127.0.0.1:8000/ratelimit", 500*time.Millisecond, try.StatusCodeIs(http.StatusTooManyRequests)) c.Assert(err, checker.IsNil) - err = try.GetRequest("http://"+s.IP+":16686/api/traces?service=tracing", 20*time.Second, try.BodyContains("forward service1/router1@file", "ratelimit@file")) + err = try.GetRequest("http://"+s.IP+":16686/api/traces?service=tracing", 20*time.Second, try.BodyContains("forward service1/router1@file", "ratelimit-1@file")) c.Assert(err, checker.IsNil) - } func (s *TracingSuite) TestJaegerRetry(c *check.C) { diff --git a/pkg/config/dynamic/fixtures/sample.toml b/pkg/config/dynamic/fixtures/sample.toml index 53e9db906..122a58398 100644 --- a/pkg/config/dynamic/fixtures/sample.toml +++ b/pkg/config/dynamic/fixtures/sample.toml @@ -249,16 +249,14 @@ prefixes = ["foobar", "foobar"] [http.middlewares.Middleware10] [http.middlewares.Middleware10.rateLimit] - extractorFunc = "foobar" - [http.middlewares.Middleware10.rateLimit.rateSet] - [http.middlewares.Middleware10.rateLimit.rateSet.Rate0] - period = 42000000000 - average = 42 - burst = 42 - [http.middlewares.Middleware10.rateLimit.rateSet.Rate1] - period = 42000000000 - average = 42 - burst = 42 + average = 42 + burst = 42 + [http.middlewares.Middleware10.rateLimit.sourceCriterion] + requestHeaderName = "foobar" + requestHost = true + [http.middlewares.Middleware10.rateLimit.sourceCriterion.ipStrategy] + depth = 42 + excludedIPs = ["foobar", "foobar"] [http.middlewares.Middleware11] [http.middlewares.Middleware11.redirectRegex] regex = "foobar" diff --git a/pkg/config/file/fixtures/sample.toml b/pkg/config/file/fixtures/sample.toml index 0b1ff7f17..4da227f2b 100644 --- a/pkg/config/file/fixtures/sample.toml +++ b/pkg/config/file/fixtures/sample.toml @@ -240,16 +240,14 @@ prefixes = ["foobar", "foobar"] [http.middlewares.Middleware10] [http.middlewares.Middleware10.rateLimit] - extractorFunc = "foobar" - [http.middlewares.Middleware10.rateLimit.rateSet] - [http.middlewares.Middleware10.rateLimit.rateSet.Rate0] - period = 42000000000 - average = 42 - burst = 42 - [http.middlewares.Middleware10.rateLimit.rateSet.Rate1] - period = 42000000000 - average = 42 - burst = 42 + average = 42 + burst = 42 + [http.middlewares.Middleware10.rateLimit.sourceCriterion] + requestHeaderName = "foobar" + requestHost = true + [http.middlewares.Middleware10.rateLimit.sourceCriterion.ipStrategy] + depth = 42 + excludedIPs = ["foobar", "foobar"] [http.middlewares.Middleware11] [http.middlewares.Middleware11.redirectRegex] regex = "foobar"