Skip to main content
Version: 2.14

zookeeper

Service Discovery Via Zookeeper#

Zookeeper service discovery needs to rely on the apisix-seed project.

How apisix-seed Works#

apisix-seed completes data exchange by watching the changes of etcd and zookeeper at the same time.

The process is as follows:

  1. APISIX registers an upstream and specifies the service discovery type as zookeeper to etcd.
  2. apisix-seed watches the resource changes of APISIX in etcd and filters the discovery type and obtains the service name.
  3. apisix-seed binds the service to the etcd resource and starts watching the service in zookeeper.
  4. The client registers the service with zookeeper.
  5. apisix-seed gets the service changes in zookeeper.
  6. apisix-seed queries the bound etcd resource information through the service name, and writes the updated service node to etcd.
  7. The APISIX worker watches etcd changes and refreshes the service node information to the memory.

Setting apisix-seed and Zookeeper#

The configuration steps are as follows:

  1. Start the Zookeeper service
docker run -itd --rm --name=dev-zookeeper -p 2181:2181 zookeeper:3.7.0
  1. Download and compile the apisix-seed project.
git clone https://github.com/api7/apisix-seed.git
cd apisix-seed
go build
  1. Modify the apisix-seed configuration file, config path conf/conf.yaml.
etcd:                            # APISIX ETCD Configure
host:
- "http://127.0.0.1:2379"
prefix: /apisix
timeout: 30

discovery:
zookeeper: # Zookeeper Service Discovery
hosts:
- "127.0.0.1:2181" # Zookeeper service address
prefix: /zookeeper
weight: 100 # default weight for node
timeout: 10 # default 10s
  1. Start apisix-seed to monitor service changes
./apisix-seed

Setting APISIX Route and Upstream#

Set a route, the request path is /zk/*, the upstream uses zookeeper as service discovery, and the service name is APISIX-ZK.

curl http://127.0.0.1:9080/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{
"uri": "/zk/*",
"upstream": {
"service_name": "APISIX-ZK",
"type": "roundrobin",
"discovery_type": "zookeeper"
}
}'

Register Service and verify Request#

  1. Service registration using Zookeeper CLI
  • Register Service
# Login Container
docker exec -it ${CONTAINERID} /bin/bash
# Login Zookeeper Client
oot@ae2f093337c1:/apache-zookeeper-3.7.0-bin# ./bin/zkCli.sh
# Register Service
[zk: localhost:2181(CONNECTED) 0] create /zookeeper/APISIX-ZK '{"host":"127.0.0.1:1980","weight":100}'
  • Successful Response
Created /zookeeper/APISIX-ZK
  1. Verify Request
  • Request
curl -i http://127.0.0.1:9080/zk/hello
  • Response
HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Date: Tue, 29 Mar 2022 08:51:28 GMT
Server: APISIX/2.12.0
Transfer-Encoding: chunked

hello