π§ Microservices Gateway with Ocelot and Swagger (.NET 9)
This solution demonstrates a simple API Gateway built with Ocelot that routes traffic to two downstream microservices:
- AuthService β handles authentication and issues JWT tokens.
- DataService β exposes example data endpoints.
The gateway also aggregates both servicesβ Swagger documentation using SwaggerForOcelot, providing a unified API explorer at a single URL.
| Component |
Purpose |
| .NET 9 |
Framework for all services |
| Ocelot |
API Gateway / Reverse Proxy |
| MMLib.SwaggerForOcelot |
Aggregates Swagger from downstream services |
| Swashbuckle.AspNetCore |
Swagger UI for microservices |
| JWT Bearer Auth |
Token-based authentication (AuthService) |
ποΈ Architecture Overview
βββββββββββββββββββββββββββββββ
β API Gateway β
β (Ocelot + SwaggerForOcelot) β
β Port: 5123 β
βββββββββ¬ββββββββββββ¬ββββββββββ
β β
βΌ βΌ
βββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββ
β AuthService β β DataService β
β Issues JWT tokens β β Returns product data β
β Port: 5138 β β Port: 5146 β
βββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββ
MicroservicesOcelotDemo/
β
βββ ApiGateway/
β βββ Program.cs
β βββ ocelot.json
β
βββ AuthService/
β βββ Program.cs
β
βββ DataService/
β βββ Program.cs
β
βββ TestClient/
βββ Program.cs
βοΈ Setup Instructions
1οΈβ£ Clone the Repository
git clone https://github.com/YOUR_USERNAME/MicroservicesOcelotDemo.git
cd MicroservicesOcelotDemo
2οΈβ£ Restore Dependencies
3οΈβ£ Run Each Service in Separate Terminals
# Auth Service (port 5138)
cd AuthService
dotnet run --urls http://localhost:5138
# Data Service (port 5146)
cd DataService
dotnet run --urls http://localhost:5146
# API Gateway (port 5123)
cd ApiGateway
dotnet run --urls http://localhost:5123
π§ Gateway Routing Summary
| Gateway Path |
Forwards To |
Description |
/auth/* |
http://localhost:5138/* |
Auth endpoints |
/data/* |
http://localhost:5146/* |
Data endpoints |
/swagger |
Aggregated docs |
SwaggerForOcelot UI |
curl -X POST http://localhost:5123/auth/token \
-H "Content-Type: application/json" \
-d '{ "username": "demo", "password": "demo" }'
curl http://localhost:5123/data/products \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
π§© Key Configuration Files
{
"Routes": [
{
"UpstreamPathTemplate": "/auth/{everything}",
"UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete", "Options" ],
"DownstreamPathTemplate": "/{everything}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 5138 } ]
},
{
"UpstreamPathTemplate": "/data/{everything}",
"UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete", "Options" ],
"DownstreamPathTemplate": "/{everything}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 5146 } ]
}
],
"SwaggerEndPoints": [
{
"Key": "auth",
"TransformByOcelotConfig": true,
"Config": [
{ "Name": "Auth Service", "Version": "v1", "Url": "http://localhost:5138/swagger/v1/swagger.json" }
]
},
{
"Key": "data",
"TransformByOcelotConfig": true,
"Config": [
{ "Name": "Data Service", "Version": "v1", "Url": "http://localhost:5146/swagger/v1/swagger.json" }
]
}
],
"GlobalConfiguration": { "BaseUrl": "http://localhost:5123" }
}
- The gateway is configured purely as a reverse proxy β no authentication required.
- Both microservices have independent Swagger UIs.
- The gatewayβs Swagger aggregates both under
/swagger.
- You can later enable JWT validation or rate limiting if needed.
| Project |
Package |
Purpose |
| ApiGateway |
Ocelot |
Reverse proxy / API Gateway |
| ApiGateway |
MMLib.SwaggerForOcelot.AspNetCore |
Aggregates Swagger docs |
| AuthService |
Swashbuckle.AspNetCore |
Swagger UI |
| DataService |
Swashbuckle.AspNetCore |
Swagger UI |
| AuthService / DataService |
Microsoft.AspNetCore.Authentication.JwtBearer |
JWT auth |
This project is licensed under the MIT License.
Feel free to use, modify, and share.