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
  1. docker run -itd --rm --name=dev-zookeeper -p 2181:2181 zookeeper:3.7.0
  1. Download and compile the apisix-seed project.
  1. git clone https://github.com/api7/apisix-seed.git
  2. cd apisix-seed
  3. go build
  1. Modify the apisix-seed configuration file, config path conf/conf.yaml.
  1. etcd: # APISIX ETCD Configure
  2. host:
  3. - "http://127.0.0.1:2379"
  4. prefix: /apisix
  5. timeout: 30
  6. discovery:
  7. zookeeper: # Zookeeper Service Discovery
  8. hosts:
  9. - "127.0.0.1:2181" # Zookeeper service address
  10. prefix: /zookeeper
  11. weight: 100 # default weight for node
  12. timeout: 10 # default 10s
  1. Start apisix-seed to monitor service changes
  1. ./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.

  1. curl http://127.0.0.1:9080/apisix/admin/routes/1 \
  2. -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
  3. {
  4. "uri": "/zk/*",
  5. "upstream": {
  6. "service_name": "APISIX-ZK",
  7. "type": "roundrobin",
  8. "discovery_type": "zookeeper"
  9. }
  10. }'

Register Service and verify Request

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