Skip to content

Why Use an API Gateway — Key Problems Solved by Gateway Architecture

DodaTech Updated 2026-06-28 5 min read

In this tutorial, you will learn about Why Use an API Gateway. We cover key concepts, practical examples, and best practices to help you master this topic.

An API gateway solves the growing complexity of client-to-microservice communication by providing a single unified entry point that handles authentication, rate limiting, routing, and response aggregation automatically.

What You'll Learn

  • The specific problems that emerge when clients call microservices directly
  • How a gateway reduces client complexity and backend coupling
  • Cross-cutting concerns that a gateway centralizes better than individual services

Why It Matters

When a frontend application needs to fetch a user profile, order history, and notification count, it must make three separate calls to three different services, each with its own URL, authentication, and error handling. An API gateway collapses this into one call, dramatically simplifying client code and reducing bandwidth.

Real-World Use

The Durga Antivirus Pro dashboard needs user info, scan history, subscription status, and threat alerts. Instead of the frontend managing four API calls with four different auth mechanisms, the gateway accepts one request, fans out to four services, and returns a single aggregated response.

flowchart LR
    subgraph "Without Gateway"
        Client1["Client"] --> S1a["User API"]
        Client1 --> S2a["Orders API"]
        Client1 --> S3a["Notifications API"]
    end
    subgraph "With Gateway"
        Client2["Client"] --> GW["Gateway"]
        GW --> S1b["User API"]
        GW --> S2b["Orders API"]
        GW --> S3b["Notifications API"]
    end
    style GW fill:#dbeafe,stroke:#2563eb

Problem 1: Client Must Know Every Service URL

Without a gateway, the frontend stores URLs for every backend service, hardcoding service locations. If a service moves or gets renamed, every client must update. The gateway abstracts this by providing a single domain and routing internally.

Before gateway — client manages multiple URLs:

user = requests.get("https://users.internal.dodatech.com/me")
orders = requests.get("https://orders.internal.dodatech.com/list")
alerts = requests.get("https://alerts.internal.dodatech.com/active")

After gateway — client calls one URL:

all_data = requests.get("https://api.dodatech.com/dashboard")

Problem 2: Each Service Duplicates Cross-Cutting Logic

Authentication, rate limiting, logging, and CORS headers are typically identical across services. Without a gateway, each microservice implements the same logic, leading to code duplication and inconsistent enforcement.

Problem 3: Protocol Translation

Backend services may use gRPC, WebSocket, or custom TCP protocols. The gateway translates external HTTP/JSON requests into the protocol each backend speaks, shielding clients from internal implementation details.

Problem 4: Response Aggregation

A mobile dashboard may need data from five services. Without aggregation, the device makes five round trips over potentially slow cellular connections. The gateway makes one round trip on the server side (fast internal network) and returns a single payload.

from flask import Flask, jsonify
import asyncio
import aiohttp

app = Flask(__name__)

async def fetch_user(session):
    async with session.get("http://user-service:8080/me") as resp:
        return await resp.json()

async def fetch_orders(session):
    async with session.get("http://order-service:8080/recent") as resp:
        return await resp.json()

async def fetch_alerts(session):
    async with session.get("http://alert-service:8080/unread") as resp:
        return await resp.json()

@app.route("/dashboard")
def dashboard():
    async def aggregate():
        async with aiohttp.ClientSession() as session:
            user, orders, alerts = await asyncio.gather(
                fetch_user(session),
                fetch_orders(session),
                fetch_alerts(session)
            )
            return {**user, "orders": orders, "alerts": alerts}
    return jsonify(asyncio.run(aggregate()))

Expected output:

{"name": "Alice", "orders": [{"id": 1, "item": "Laptop"}], "alerts": [{"type": "threat", "count": 3}]}

Common Mistakes

1. Adding Too Many Responsibilities

A gateway that does everything — routing, auth, Caching, logging, transformation, aggregation, circuit breaking — becomes a monolith. Split concerns into layers.

2. Neglecting Backend Discovery

Hardcoding backend URLs in the gateway defeats the purpose. Use service discovery (Consul, Kubernetes DNS, Eureka) so the gateway finds backends dynamically.

3. Forgetting About the Gateway in Disaster Recovery

If the gateway goes down, all APIs are inaccessible. Always run multiple instances and have a fallback DNS Strategy.

4. Not Handling Partial Failures

When aggregating responses, one backend may fail. Decide whether to fail the entire request or return partial data with error indicators.

5. Ignoring Client-Side Caching

Even with a gateway, clients should cache responses when possible. The gateway adds a hop — caching reduces the number of requests that reach it.

Practice Questions

  1. How does an API gateway reduce client complexity?
  2. What problems arise from each microservice implementing its own authentication?
  3. How does a gateway enable protocol translation?
  4. Why is response aggregation valuable for mobile clients?
  5. What is a partial failure scenario and how should a gateway handle it?

Answers:

  1. The client calls a single URL instead of tracking multiple service endpoints, and the gateway handles routing, aggregation, and cross-cutting concerns centrally.
  2. Duplicated code, inconsistent security policies, higher maintenance burden, and increased risk of misconfiguration.
  3. The gateway accepts external HTTP/JSON and translates to gRPC, WebSocket, or other protocols that internal services use.
  4. Mobile networks have higher latency. One server-side aggregation call is faster than five client-side sequential calls over cellular.
  5. One backend service fails during aggregation. The gateway can return partial data with error fields or fail the entire request depending on requirements.

Challenge: Design a gateway aggregation endpoint for a system with user, inventory, shipping, and payment services. Decide what happens if inventory is down but the other services respond.

FAQ

Is an API gateway necessary for two or three microservices?

: Not strictly necessary, but beneficial if those services have different auth requirements or you want to avoid duplicate cross-cutting logic.

Can a gateway help with legacy system integration?

: Yes. A gateway can translate modern REST/JSON calls into SOAP/XML or other legacy protocols, acting as a modernization facade.

Does a gateway add significant latency?

: Each hop adds microseconds. Compare this to the milliseconds saved by aggregation and reduced round trips over the internet.

How do gateways handle service discovery?

: Gateways integrate with Consul, etcd, Kubernetes DNS, or Eureka to resolve backend service locations dynamically.

Should the gateway handle request validation?

: Basic validation (required fields, data types) is appropriate. Complex business validation belongs in the backend service.

Mini Project

Extend the Flask gateway from Lesson 1 to add response aggregation. Create a /dashboard endpoint that calls three mock backend services (user, orders, alerts) concurrently and returns the combined result.

What's Next

Continue with Reverse Proxy in API Gateway to understand how gateways forward requests, or explore Gateway Routing for path-based and header-based routing strategies.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro