Skip to main content

Version: 3.11.0

Load Balancing

Load balancing is a technique used to distribute network request loads. It is a key consideration in designing systems that need to handle a large volume of traffic, allowing for improved system performance, scalability, and reliability

Apache APISIX supports a number of load balancing algorithms, one of which is the weighted round-robin algorithm. This algorithm distributes incoming requests over a set of servers in a cyclical pattern.

In this tutorial, you will create a route with two upstream services and uses the round-robin load balancing algorithm to load balance requests.

Prerequisite(s)

  1. Complete Get APISIX to install APISIX in Docker or on Kubernetes.
  2. Understand APISIX routes and upstreams.

Start Sample Upstream Services

If you are running APISIX in Kubernetes, you will be deploying two services to your cluster in this section for load balancing. Otherwise, skip to the next section where you will be using the hosted upstream services as the load balancing target nodes.

Start and expose a sample httpbin service:

kubectl run httpbin --image kennethreitz/httpbin --port 80
kubectl expose pod httpbin --port 80

Similarly, start and expose a sample NGINX service:

kubectl run nginx --image nginx --port 80
kubectl expose pod nginx --port 80

To see if services are running, check for these resources in the namespace:

kubectl get all | grep -e httpbin -e nginx

You should see a similar output:

pod/httpbin                                      1/1     Running   0          8m
pod/nginx 1/1 Running 0 9m
service/httpbin ClusterIP 10.96.189.45 <none> 80/TCP 8m
service/nginx ClusterIP 10.96.121.40 <none> 80/TCP 9m

Enable Load Balancing

Create a route with two upstream services, httpbin.org and mock.api7.ai, to distribute requests across. Both services respond with the request headers when receiving request at /headers:

curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
"id": "getting-started-headers",
"uri": "/headers",
"upstream" : {
"type": "roundrobin",
"nodes": {
"httpbin.org:443": 1,
"mock.api7.ai:443": 1
},
"pass_host": "node",
"scheme": "https"
}
}'

type: use roundrobin as the load balancing algorithm.

nodes: upstream services.

pass_host: use node to pass the host header to the upstream.

scheme: use https to enable TLS with upstream.

You should receive an HTTP/1.1 201 Created response if the route was created successfully.

Verify

Generate 50 consecutive requests to APISIX /headers route to see the load-balancing effect:

resp=$(seq 50 | xargs -I{} curl "http://127.0.0.1:9080/headers" -sL) && \
count_httpbin=$(echo "$resp" | grep "httpbin.org" | wc -l) && \
count_mockapi7=$(echo "$resp" | grep "mock.api7.ai" | wc -l) && \
echo httpbin.org: $count_httpbin, mock.api7.ai: $count_mockapi7

The command keeps count of the number of requests that was handled by the two services respectively. The output shows that requests were distributed over to the two services:

httpbin.org: 23, mock.api7.ai: 27

The distribution of requests across services should be close to 1:1 but might not always result in a perfect 1:1 ratio. The slight deviation is due to APISIX operates with multiple workers.

What's Next

You have learned how to configure load balancing. In the next tutorial, you will learn how to configure key authentication.


API7.ai Logo

API Management for Modern Architectures with Edge, API Gateway, Kubernetes, and Service Mesh.

Product

API7 Cloud

SOC2 Type IIISO 27001HIPAAGDPRRed Herring

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

Apache Software Foundation