{"id":20548006,"url":"https://github.com/aleroxac/goexpert-ratelimiter","last_synced_at":"2026-06-10T07:31:14.861Z","repository":{"id":242410361,"uuid":"809359130","full_name":"aleroxac/goexpert-ratelimiter","owner":"aleroxac","description":"goexpert-ratelimiter","archived":false,"fork":false,"pushed_at":"2024-06-02T19:48:32.000Z","size":10,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-06T05:23:30.647Z","etag":null,"topics":["fullcycle","go","go-chi","goexpert","golang","middleware","rate-limiting"],"latest_commit_sha":null,"homepage":"https://github.com/aleroxac/goexpert-ratelimiter","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aleroxac.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-02T13:22:52.000Z","updated_at":"2024-06-02T19:49:30.000Z","dependencies_parsed_at":"2024-06-02T21:30:55.776Z","dependency_job_id":"4b18c2c6-05aa-4f6f-aec1-cfc801fea0ab","html_url":"https://github.com/aleroxac/goexpert-ratelimiter","commit_stats":null,"previous_names":["aleroxac/goexpert-ratelimiter"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/aleroxac/goexpert-ratelimiter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aleroxac%2Fgoexpert-ratelimiter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aleroxac%2Fgoexpert-ratelimiter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aleroxac%2Fgoexpert-ratelimiter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aleroxac%2Fgoexpert-ratelimiter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aleroxac","download_url":"https://codeload.github.com/aleroxac/goexpert-ratelimiter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aleroxac%2Fgoexpert-ratelimiter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34142637,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fullcycle","go","go-chi","goexpert","golang","middleware","rate-limiting"],"created_at":"2024-11-16T02:11:38.599Z","updated_at":"2026-06-10T07:31:14.834Z","avatar_url":"https://github.com/aleroxac.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# goexpert-ratelimiter\nProjeto do Desafio Técnico \"Rate Limiter\" do treinamento GoExpert(FullCycle).\n\n\n\n## O desafio\nDesenvolver um rate limiter em Go que possa ser configurado para limitar o número máximo de requisições por segundo com base em um endereço IP específico ou em um token de acesso.\n- Endereço IP: O rate limiter deve restringir o número de requisições recebidas de um único endereço IP dentro de um intervalo de tempo definido.\n- Token de Acesso: O rate limiter deve também poderá limitar as requisições baseadas em um token de acesso único, permitindo diferentes limites de tempo de expiração para diferentes tokens. O Token deve ser informado no header no seguinte formato:\nAPI_KEY: \u003cTOKEN\u003e\n- As configurações de limite do token de acesso devem se sobrepor as do IP. Ex: Se o limite por IP é de 10 req/s e a de um determinado token é de 100 req/s, o rate limiter deve utilizar as informações do token.\n\n\n\n## Como rodar o projeto: manual\n``` shell\n## 1. Suba os containers\ndocker-compose up -d\n\n## 2. Teste os cenários\n## Limitação por IP\nfor i in {1..4}; do curl -is -w \"Request $i: %{http_code}\\n\" -o /dev/null \"http://localhost:8080/api/v1/zipcode/01001001\"; done\necho \"wait for block duration: 5s\" \u0026\u0026 sleep 5\ncurl -is -w \"status: %{http_code}\\n\" -o /dev/null http://localhost:8080/api/v1/zipcode/01001001\n\n## Limitação por token\nfor i in {1..6}; do curl -is -w \"Request $i: %{http_code}\\n\" -o /dev/null -H \"API_KEY: my-token\" http://localhost:8080/api/v1/zipcode/01001001; done\necho \"wait for block duration: 5s\" \u0026\u0026 sleep 5\ncurl -is -w \"status: %{http_code}\\n\" -o /dev/null -H \"API_KEY: my-token\" \"http://localhost:8080/api/v1/zipcode/01001001\"\n```\n\n\n\n## Como rodar o projeto: make\n``` shell\n## 1. Suba os containers\nmake up\n\n## 2. Teste os cenários\n## Limitação por IP\nmake run SCENARIO=ip\n\n## Limitação por token\nmake run SCENARIO=token\n```\n\n\n\n## Funcionalidades da Linguagem Utilizadas\n- web-frameworks: go-chi\n- envs: godotenv\n- middlewares\n\n\n\n## Requisitos: implementação\n- [x] O rate limiter deve poder trabalhar como um middleware que é injetado ao servidor web\n- [x] O rate limiter deve permitir a configuração do número máximo de requisições permitidas por segundo.\n- [x] O rate limiter deve ter ter a opção de escolher o tempo de bloqueio do IP ou do Token caso a quantidade de requisições tenha sido excedida.\n- [x] As configurações de limite devem ser realizadas via variáveis de ambiente ou em um arquivo “.env” na pasta raiz.\n- [x] Deve ser possível configurar o rate limiter tanto para limitação por IP quanto por token de acesso.\n- [x] O sistema deve responder adequadamente quando o limite é excedido:\n    - Código HTTP: 429\n    - Mensagem: you have reached the maximum number of requests or actions allowed within a certain time frame\n-  [x] Todas as informações de \"limiter” devem ser armazenadas e consultadas de um banco de dados Redis. Você pode utilizar docker-compose para subir o Redis.\n-  [x] Crie uma “strategy” que permita trocar facilmente o Redis por outro mecanismo de persistência.\n-  [x] A lógica do limiter deve estar separada do middleware.\n\n## Requisitos: entrega\n- [x] O código-fonte completo da implementação.\n- [x] Documentação explicando como o rate limiter funciona e como ele pode ser configurado.\n- [x] Testes automatizados demonstrando a eficácia e a robustez do rate limiter.\n- [x] Utilize docker/docker-compose para que possamos realizar os testes de sua aplicação.\n- [x] O servidor web deve responder na porta 8080.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faleroxac%2Fgoexpert-ratelimiter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faleroxac%2Fgoexpert-ratelimiter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faleroxac%2Fgoexpert-ratelimiter/lists"}