apisix/docs/en/latest/discovery/zookeeper.md

3.9 KiB

title
zookeeper

Service Discovery Via Zookeeper

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

How apisix-seed Works

APISIX-SEED

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