{"id":29508034,"url":"https://github.com/youssefgamalmohamed/spring-cloud-api-gateway","last_synced_at":"2026-05-17T01:44:06.644Z","repository":{"id":302950028,"uuid":"1012776087","full_name":"youssefGamalMohamed/spring-cloud-api-gateway","owner":"youssefGamalMohamed","description":"API Gateway with Spring Cloud API Gateway and Contains Most of Patterns into API Gateway as ( Security, Rate-Limiting, Routing , Retry Pattern, Circuit-Breakers, ... etc )","archived":false,"fork":false,"pushed_at":"2025-07-04T23:10:09.000Z","size":20,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-05T00:23:30.758Z","etag":null,"topics":["api-gateway","authentication","authorization","circuit-breaker","microservices","proxy","rate-limiting","retry-pattern","routing","spring-boot","spring-cloud-gateway"],"latest_commit_sha":null,"homepage":"","language":"Java","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/youssefGamalMohamed.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,"zenodo":null}},"created_at":"2025-07-02T21:37:05.000Z","updated_at":"2025-07-04T23:10:12.000Z","dependencies_parsed_at":"2025-07-05T00:23:48.350Z","dependency_job_id":null,"html_url":"https://github.com/youssefGamalMohamed/spring-cloud-api-gateway","commit_stats":null,"previous_names":["youssefgamalmohamed/spring-cloud-api-gateway"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/youssefGamalMohamed/spring-cloud-api-gateway","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youssefGamalMohamed%2Fspring-cloud-api-gateway","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youssefGamalMohamed%2Fspring-cloud-api-gateway/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youssefGamalMohamed%2Fspring-cloud-api-gateway/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youssefGamalMohamed%2Fspring-cloud-api-gateway/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/youssefGamalMohamed","download_url":"https://codeload.github.com/youssefGamalMohamed/spring-cloud-api-gateway/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youssefGamalMohamed%2Fspring-cloud-api-gateway/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265482439,"owners_count":23774045,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["api-gateway","authentication","authorization","circuit-breaker","microservices","proxy","rate-limiting","retry-pattern","routing","spring-boot","spring-cloud-gateway"],"created_at":"2025-07-16T04:45:26.952Z","updated_at":"2026-05-17T01:44:06.604Z","avatar_url":"https://github.com/youssefGamalMohamed.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Spring Cloud API Gateway\n\n[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-6DB33F?logo=springboot\u0026logoColor=white)](https://spring.io/projects/spring-boot)\n[![Spring Cloud](https://img.shields.io/badge/Spring%20Cloud-6DB33F?logo=spring\u0026logoColor=white)](https://spring.io/projects/spring-cloud)\n[![Java](https://img.shields.io/badge/Java-17-007396?logo=java\u0026logoColor=white)](https://adoptopenjdk.net/)\n[![Redis](https://img.shields.io/badge/Redis-DC382D?logo=redis\u0026logoColor=white)](https://redis.io/)\n[![Zipkin](https://img.shields.io/badge/Zipkin-000000?logo=apache\u0026logoColor=white)](https://zipkin.io/)\n[![Docker](https://img.shields.io/badge/Docker-2496ED?logo=docker\u0026logoColor=white)](https://www.docker.com/)\n[![Reactive](https://img.shields.io/badge/Reactive-5A29E4?logo=react\u0026logoColor=white)](https://projectreactor.io/)\n[![Keycloak](https://img.shields.io/badge/Keycloak-1E2526?logo=keycloak\u0026logoColor=white)](https://www.keycloak.org/)\n[![Hey](https://img.shields.io/badge/Hey-4B275F?logo=go\u0026logoColor=white)](https://github.com/rakyll/hey)\n\n---\n\n## Overview\n\nA robust **API Gateway** built with [Spring Cloud Gateway](https://spring.io/projects/spring-cloud-gateway), designed to demonstrate and implement common API Gateway patterns such as **security**, **rate-limiting**, **routing**, **resilience**, and **observability**.\n\nThis project is ready for extension and integration with microservices architectures.\n\n---\n\n## ✨ Features\n\n- **Dynamic Routing**: Easily route requests to backend services.\n- **Rate Limiting**: Protect your APIs using Redis-backed rate limiting.\n- **Resilience Patterns**: Circuit breaker, retry, and fallback using Resilience4j.\n- **Distributed Tracing**: Integrated with Zipkin and Micrometer Tracing.\n- **Metrics \u0026 Monitoring**: Expose actuator endpoints for health and metrics.\n- **Custom Filters**: Add custom logic (e.g., request ID injection) via global filters.\n- **Docker Compose**: Spin up dependencies (Redis, Zipkin, Keycloak) with a single command.\n- **Reactive \u0026 Non-blocking**: Built on Spring WebFlux for high concurrency.\n- **Authentication \u0026 Authorization**: Secured with Keycloak for OAuth2 and JWT-based authentication.\n\n---\n\n## 🚀 Getting Started\n\n### Prerequisites\n\n- [Java 17+](https://adoptopenjdk.net/)\n- [Maven](https://maven.apache.org/)\n- [Docker](https://www.docker.com/) (for running dependencies)\n- [Hey](https://github.com/rakyll/hey) (for stress testing)\n\n### Clone the Repository\n\n```bash\ngit clone https://github.com/your-username/spring-cloud-api-gateway.git\ncd spring-cloud-api-gateway\n```\n\n### Start Dependencies\n\n```bash\ndocker compose up -d\n```\n\n### Configure Keycloak\n\nAfter starting the Docker Compose services, configure Keycloak:\n\n1. Access the Keycloak Admin Console at [http://localhost:8080](http://localhost:8080).\n2. Log in with the credentials:\n   - Username: `admin`\n   - Password: `admin`\n3. Import the realm configuration:\n   - Navigate to the Keycloak Admin Console.\n   - Click on the realm dropdown (top-left) and select **\"Add realm\"**.\n   - Choose the `realm-settings.json` file located in the `imports/keykloak/` folder of the project.\n   - Click **Create** to import the `json-placeholder-realm` configuration.\n\n### Run the Application\n\n```bash\n./mvnw spring-boot:run\n```\n\n---\n\n## 🛠️ Tools \u0026 Technologies\n\n| Tool/Tech           | Description                        |\n|---------------------|------------------------------------|\n| ![Spring Boot](https://img.shields.io/badge/-Spring%20Boot-6DB33F?logo=springboot\u0026logoColor=white) | Application framework |\n| ![Spring Cloud Gateway](https://img.shields.io/badge/-Spring%20Cloud%20Gateway-6DB33F?logo=spring\u0026logoColor=white) | API Gateway |\n| ![Java](https://img.shields.io/badge/-Java%2017-007396?logo=java\u0026logoColor=white) | Programming language |\n| ![Redis](https://img.shields.io/badge/-Redis-DC382D?logo=redis\u0026logoColor=white) | Rate limiting backend |\n| ![Zipkin](https://img.shields.io/badge/-Zipkin-000000?logo=apache\u0026logoColor=white) | Distributed tracing |\n| ![Docker](https://img.shields.io/badge/-Docker-2496ED?logo=docker\u0026logoColor=white) | Containerization |\n| ![Micrometer](https://img.shields.io/badge/-Micrometer-5A29E4?logo=react\u0026logoColor=white) | Metrics \u0026 tracing |\n| ![Resilience4j](https://img.shields.io/badge/-Resilience4j-4F8EF7?logo=java\u0026logoColor=white) | Resilience patterns |\n| ![Keycloak](https://img.shields.io/badge/-Keycloak-1E2526?logo=keycloak\u0026logoColor=white) | Authentication \u0026 authorization |\n| ![Hey](https://img.shields.io/badge/-Hey-4B275F?logo=go\u0026logoColor=white) | Stress testing tool |\n\n---\n\n## 📦 Project Structure\n\n```\nsrc/\n  main/\n    java/\n      com.youssef.gamal.microservices.spring_cloud_api_gateway/\n        SpringCloudApiGatewayApplication.java\n        configs/\n        filters/\n  resources/\n    application.yaml\ntest/\n  java/\n    ...\ncompose.yml\nREADME.md\npom.xml\nimports/\n  keykloak/\n    realm-settings.json\n```\n\n---\n\n## ⚙️ Configuration\n\n- **Routes** and **filters** are defined in [`application.yaml`](src/main/resources/application.yaml).\n- **Rate limiting** and **custom filters** are configured in the `configs` and `filters` packages.\n- **Tracing** is enabled and configured for Zipkin.\n- **Authentication** is configured with Keycloak in `application.yaml` and `realm-settings.json`.\n\n---\n\n## 📊 Observability\n\n- **Zipkin UI**: [http://localhost:9411](http://localhost:9411)\n- **Actuator Endpoints**: [http://localhost:8080/actuator](http://localhost:8080/actuator)\n\n---\n\n## 🧪 Testing\n\nRun all unit tests:\n\n```bash\n./mvnw test\n```\n\n### Stress Testing\n\nTo perform stress testing on the API Gateway, we use the `hey` tool to simulate load. Below is an example command to test the `GET /posts/{id}` endpoint:\n\n```bash\nhey -n 100 -c 100 -m GET \\\n-H \"Authorization: Bearer $TOKEN_VALUE\" \\\nhttp://localhost:9090/posts/1\n```\n\nReplace `$TOKEN_VALUE` with a valid JWT token obtained from Keycloak.\n\n**Example Stress Test Result**:\n\n```plaintext\nSummary:\n  Total:        4.1552 secs\n  Slowest:      4.1550 secs\n  Fastest:      0.4334 secs\n  Average:      3.2293 secs\n  Requests/sec: 24.0665\n\nResponse time histogram:\n  0.433 [1]     |■\n  0.806 [5]     |■■■■\n  1.178 [6]     |■■■■■\n  1.550 [3]     |■■■\n  1.922 [0]     |\n  2.294 [0]     |\n  2.666 [0]     |\n  3.038 [0]     |\n  3.411 [14]    |■■■■■■■■■■■■\n  3.783 [45]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n  4.155 [26]    |■■■■■■■■■■■■■■■■■■■■■■■\n\nLatency distribution:\n  10% in 1.0938 secs\n  25% in 3.3998 secs\n  50% in 3.5556 secs\n  75% in 3.8002 secs\n  90% in 3.9024 secs\n  95% in 3.9245 secs\n  99% in 4.1550 secs\n\nDetails (average, fastest, slowest):\n  DNS+dialup:   0.0090 secs, 0.4334 secs, 4.1550 secs\n  DNS-lookup:   0.0022 secs, 0.0000 secs, 0.0108 secs\n  req write:    0.0013 secs, 0.0000 secs, 0.0058 secs\n  resp wait:    3.2180 secs, 0.4223 secs, 4.1318 secs\n  resp read:    0.0008 secs, 0.0000 secs, 0.0228 secs\n\nStatus code distribution:\n  [200] 5 responses\n  [429] 95 responses\n```\n\nThe high number of `[429]` responses indicates that the rate limiter (configured in `application.yaml`) is effectively throttling requests.\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! Please open issues or submit pull requests for improvements.\n\n---\n\n## 👤 Author\n\n[Youssef Gamal](https://github.com/your-username)\n\n---\n\n## 📬 Contact\n\nFor questions or support, please open an issue or contact me via [GitHub](https://github.com/your-username).\n\n---","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoussefgamalmohamed%2Fspring-cloud-api-gateway","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyoussefgamalmohamed%2Fspring-cloud-api-gateway","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoussefgamalmohamed%2Fspring-cloud-api-gateway/lists"}