Skip to content
Weave templates

Microservices Map with API Gateway & Service Mesh

Eight bounded-context services inside an Istio mesh pool, fronted by an API gateway, wired to Kafka for domain events and to their own datastores — with the mesh control plane drawn as a nested frame.

Template previewWeave
Rendering…

Make it your own.

{
  "nodes": [
    { "id": "mesh", "type": "pool",      "label": "Service mesh — Istio, mTLS between all services", "x": 400, "y": 20,  "width": 760, "height": 560, "fill": "rgba(241,245,249,0.45)", "stroke": "#475569" },
    { "id": "ctl",  "type": "container", "label": "Mesh control plane", "x": 430, "y": 380, "width": 720, "height": 150, "fill": "rgba(237,233,254,0.26)", "stroke": "#6d28d9" },

    { "id": "web",  "type": "browser-window", "label": "Web app",          "x": 40, "y": 60,  "width": 150, "height": 104, "fill": "#e0f2fe", "stroke": "#0369a1" },
    { "id": "mob",  "type": "mobile-device",  "label": "iOS / Android",    "x": 40, "y": 200, "width": 150, "height": 104, "fill": "#e0f2fe", "stroke": "#0369a1" },
    { "id": "part", "type": "cloud",          "label": "Partner API callers","x": 40, "y": 355, "width": 160, "height": 74, "fill": "#e0f2fe", "stroke": "#0369a1" },

    { "id": "gw",   "type": "api-gateway", "label": "API gateway — Kong",  "x": 230, "y": 170, "width": 150, "height": 104, "fill": "#dcfce7", "stroke": "#15803d", "bold": true },
    { "id": "auth", "type": "fingerprint", "label": "Auth service (OIDC)", "x": 230, "y": 340, "width": 150, "height": 104, "fill": "#fee2e2", "stroke": "#b91c1c" },

    { "id": "ord",  "type": "microservice", "label": "orders",     "x": 440, "y": 80,  "width": 140, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8", "bold": true },
    { "id": "cat",  "type": "microservice", "label": "catalogue",  "x": 620, "y": 80,  "width": 140, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },
    { "id": "pri",  "type": "microservice", "label": "pricing",    "x": 800, "y": 80,  "width": 140, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },
    { "id": "inv",  "type": "microservice", "label": "inventory",  "x": 980, "y": 80,  "width": 140, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },
    { "id": "pay",  "type": "microservice", "label": "payments",   "x": 440, "y": 230, "width": 140, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },
    { "id": "shp",  "type": "microservice", "label": "shipping",   "x": 620, "y": 230, "width": 140, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },
    { "id": "ntf",  "type": "microservice", "label": "notifications","x": 800, "y": 230, "width": 140, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },
    { "id": "srch", "type": "microservice", "label": "search",     "x": 980, "y": 230, "width": 140, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },

    { "id": "istiod", "type": "component",   "label": "istiod — xDS",      "x": 460, "y": 410, "width": 140, "height": 104, "fill": "#ede9fe", "stroke": "#6d28d9" },
    { "id": "kiali",  "type": "line-chart",  "label": "Kiali — topology",  "x": 630, "y": 410, "width": 140, "height": 104, "fill": "#ede9fe", "stroke": "#6d28d9" },
    { "id": "jaeger", "type": "scatter-chart","label": "Jaeger — traces",  "x": 810, "y": 410, "width": 140, "height": 104, "fill": "#ede9fe", "stroke": "#6d28d9" },
    { "id": "cert",   "type": "certificate", "label": "mTLS cert issuer",  "x": 990, "y": 410, "width": 140, "height": 104, "fill": "#ede9fe", "stroke": "#6d28d9" },

    { "id": "pgo",   "type": "cylinder",   "label": "Postgres — orders",  "x": 1200, "y": 100, "width": 150, "height": 70,  "fill": "#fef3c7", "stroke": "#b45309" },
    { "id": "ddbc",  "type": "aws-dynamo", "label": "DynamoDB — catalogue","x": 1200, "y": 220, "width": 140, "height": 110, "fill": "#fff7ed", "stroke": "#f97316" },
    { "id": "redis", "type": "cache",      "label": "Redis — price cache", "x": 1200, "y": 380, "width": 140, "height": 104, "fill": "#fee2e2", "stroke": "#b91c1c" },
    { "id": "kafka", "type": "event-bus",  "label": "Kafka — domain events","x": 560, "y": 620, "width": 160, "height": 104, "fill": "#fef3c7", "stroke": "#b45309", "bold": true }
  ],
  "edges": [
    { "id": "m1",  "source": "web",  "target": "gw",   "thickness": 2 },
    { "id": "m2",  "source": "mob",  "target": "gw",   "thickness": 2 },
    { "id": "m3",  "source": "part", "target": "gw",   "label": "rate limited" },
    { "id": "m4",  "source": "gw",   "target": "auth", "label": "verify JWT", "style": "dashed" },
    { "id": "m5",  "source": "gw",   "target": "ord",  "label": "/orders",   "thickness": 3 },
    { "id": "m6",  "source": "gw",   "target": "cat",  "label": "/catalogue" },
    { "id": "m7",  "source": "gw",   "target": "srch", "label": "/search" },
    { "id": "m8",  "source": "ord",  "target": "pay",  "label": "authorise" },
    { "id": "m9",  "source": "ord",  "target": "inv",  "label": "reserve stock" },
    { "id": "m10", "source": "cat",  "target": "pri",  "label": "price lookup" },
    { "id": "m11", "source": "ord",  "target": "kafka","label": "OrderPlaced", "thickness": 2 },
    { "id": "m12", "source": "kafka","target": "shp",  "label": "subscribe" },
    { "id": "m13", "source": "kafka","target": "ntf",  "label": "subscribe" },
    { "id": "m14", "source": "ord",  "target": "pgo" },
    { "id": "m15", "source": "cat",  "target": "ddbc" },
    { "id": "m16", "source": "pri",  "target": "redis" },
    { "id": "m17", "source": "istiod","target": "ord", "label": "xDS config",  "style": "dashed" },
    { "id": "m18", "source": "cert", "target": "pay",  "label": "workload cert","style": "dashed" },
    { "id": "m19", "source": "ord",  "target": "jaeger","label": "spans",       "style": "dashed" },
    { "id": "m20", "source": "kiali","target": "istiod","label": "reads config","style": "dashed" }
  ]
}