Docker Compose (docker-compose.yml):
-------------------------------------------
version: '3.8'
services:
krakend1:
build: .
ports:
- "8081:8080"
networks:
- krakend-net
- faker-net
krakend2:
build: .
ports:
- "8082:8080"
networks:
- krakend-net
- faker-net
loadbalancer:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- krakend1
- krakend2
networks:
- krakend-net
fakerloadbalancer:
image: nginx:latest
ports:
- "4040:4040"
volumes:
- ./nginx-faker.conf:/etc/nginx/nginx.conf
depends_on:
- faker1
- faker2
networks:
- faker-net
faker1:
image: dotronglong/faker:stable
ports:
- "3030:3030"
volumes:
- ./mocks:/app/mocks
networks:
- faker-net
faker2:
image: dotronglong/faker:stable
ports:
- "3031:3030"
volumes:
- ./mocks2:/app/mocks
networks:
- faker-net
networks:
krakend-net:
faker-net:
---------------------------------------------------------
KrakenD Configuration (krakend.json):
-------------------------------------------------------------
{
"$schema": "
https://www.krakend.io/schema/krakend.json",
"version": 3,
"name": "KrakenD - API Gateway",
"timeout": "3000ms",
"port": 8080,
"output_encoding": "no-op",
"extra_config": {
"router": {
"return_error_msg": true
}
},
"endpoints": [
{
"endpoint": "/api/users",
"method": "GET",
"extra_config": {
"security/cors": {
"allow_origins": ["*"],
"allow_methods": ["GET", "HEAD", "POST"],
"expose_headers": ["Content-Length", "Content-Type"],
"allow_headers": ["Accept-Language"],
"max_age": "12h",
"allow_credentials": false,
"debug": false
},
"
github.com/devopsfaith/krakend-ratelimit/juju/router": {
"max_rate": 2,
"client_max_rate": 1,
"strategy": "ip"
}
},
"backend": [
{
"url_pattern": "/v1/users",
"method": "GET",
"host": [
"
http://fakerloadbalancer:4040"
],
"extra_config": {
"
github.com/devopsfaith/krakend-ratelimit/juju/proxy": {
"max_rate": 2,
"every": "1s",
"capacity": 2
}
}
}
]
}
]
}
------------------------------------------------------------------------------
NGINX Configuration for Faker Load Balancer (nginx-faker.conf):
-------------------------------------------------------------------------------
upstream faker_backend {
server faker1:3030;
server faker2:3030;
}
server {
listen 4040;
location / {
proxy_pass
http://faker_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
--------------------------------------------------------------------------------------
NGINX Configuration for KrakenD Load Balancer (nginx.conf):
------------------------------------------------------------------------------------
upstream krakend_backend {
server krakend1:8080;
server krakend2:8080;
}
server {
listen 80;
location / {
proxy_pass
http://krakend_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
--------------------------------------------------------------------------------------------------
Mock Data (mocks/users.json and mocks2/users.json):
----------------------------------------------------------
{
"request": {
"method": "GET",
"path": "/v1/users"
},
"response": {
"body": [
{ "id": 1, "name": "John" },
{ "id": 2, "name": "Marry" },
{ "source": "faker1" }
]
}
}
{
"request": {
"method": "GET",
"path": "/v1/users"
},
"response": {
"body": [
{ "id": 1, "name": "John" },
{ "id": 2, "name": "Marry" },
{ "source": "faker2" }
]
}
}
----------------------------------------------------------------------------------
this is what I am trying to reach
User request -> NGINX load balancer -> KrakenD API Gateway -> Faker load balancer -> Faker service -> Response sent back along the same path.