Skip to main content

Version: 3.9.x

Upstreams and Load Balancing

An Upstream defines the backend target(s) for a Service. It specifies the destination nodes, how the gateway distributes traffic among them (load balancing), and how it monitors their availability (health checks).

In API7 Enterprise, Upstreams are typically configured within a Service's upstream field, or can be managed as standalone objects referenced by multiple Services.

Load balancing algorithms

API7 Gateway supports multiple algorithms to distribute traffic across backend nodes.

AlgorithmDescriptionBest for...
roundrobinDistributes requests sequentially across nodes based on their weights.Most general-purpose applications.
chashUses consistent hashing (by URI, cookie, etc.) to map requests to the same node.Stateful applications requiring session affinity.
least_connRoutes requests to the node with the fewest active connections.Workloads with varying request processing times.
ewmaExponentially Weighted Moving Average (Peak EWMA). Selects nodes with the lowest predicted latency.Dynamically responding to backend performance fluctuations.

Consistent Hashing Keys

When type is set to chash, the gateway hashes an attribute of each request and uses that hash to pick a backend node. Requests that produce the same value are consistently routed to the same node. Two fields control this:

  • hash_on: where the value is read from. Defaults to vars.
  • key: which field to read from that source.

The format that key accepts depends on hash_on. The gateway validates the combination when the upstream is saved and rejects an invalid key with a 400 error.

hash_onkey refers toAccepted key valuesExample
varsAn NGINX variableOnly one of: uri, server_name, server_addr, request_uri, remote_port, remote_addr, query_string, host, hostname, mqtt_client_id, or a query argument in the form arg_<name>. Write the name without the leading $.remote_addr, arg_device_id
headerA request headerThe header name only, without the http_ prefix (letters, digits, -, and _; case-insensitive).X-Api-Key
cookieA request cookieThe cookie name only, without the cookie_ prefix (letters, digits, -, and _).session_id
consumerThe authenticated consumerNot applicable — omit key. The gateway hashes on the consumer's name.
vars_combinationsOne or more variablesAny string of $-prefixed variable references, resolved per request.$request_uri$remote_addr
note

hash_on: vars accepts only the fixed set of variables listed above — not the full list of built-in variables. To hash on a variable outside that set, or on a combination of values, use hash_on: vars_combinations. Reference each variable with a $ prefix, for example $request_uri$remote_addr.

If key cannot be resolved for a request (for example, the named header or argument is absent), the gateway falls back to hashing on remote_addr.

Key fields

FieldTypeDescription
typestringLoad balancing algorithm: roundrobin (default), chash, least_conn, or ewma.
nodesarrayList of {host, port, weight, priority} objects for static backend targets.
schemestringProtocol for communicating with the backend: http, https, grpc, or grpcs.
retriesintegerNumber of retries when a request fails. Range: 0-65535.
timeoutobjectTimeout settings: {connect, send, read} in seconds. Default: 60 for each.
retry_timeoutnumberTimeout to continue retries. Default: 0 (disabled).
pass_hoststringpass (service host), node (node host), or rewrite (custom host).
keepalive_poolobjectConnection pool settings: {size, idle_timeout, requests}.
hash_onstringUsed with chash to select the hash source: vars (default), header, cookie, consumer, or vars_combinations. See Consistent Hashing Keys.
keystringThe value to hash on when type is chash. Required unless hash_on is consumer; its accepted format depends on hash_on. See Consistent Hashing Keys.

Service discovery

Instead of defining static nodes, you can use Service Discovery to dynamically fetch backend targets from a registry.

FieldDescription
service_nameThe service identifier in the registry (e.g., <registry_id>/public/group/my-service).
discovery_typeThe discovery mechanism: kubernetes, nacos, or consul.

Health checks

The gateway performs health checks to identify and remove unhealthy nodes from the load balancing rotation.

  • Active Health Checks: The gateway periodically sends heartbeat requests (HTTP or TCP) to the backend.
  • Passive Health Checks: The gateway monitors real-time traffic to identify failing nodes (e.g., observing consecutive 5xx errors).

TLS to upstream

If your backend requires secure communication, you can configure the following fields:

  • client_certificate: ID of the certificate used for client authentication (mTLS).
  • ca_certificates: List of CA certificate IDs to verify the backend's certificate.
  • tls_verify: If true, the gateway verifies the backend's certificate against the ca_certificates.

Next steps

API7.ai Logo

The digital world is connected by APIs,
API7.ai exists to make APIs more efficient, reliable, and secure.

Sign up for API7 newsletter

Product

API7 Gateway

SOC2 Type IIISO 27001HIPAAGDPRRed Herring

Copyright © APISEVEN PTE. LTD 2019 – 2026. Apache, Apache APISIX, APISIX, and associated open source project names are trademarks of the Apache Software Foundation