第一次在 OpenResty 下写 lua,十分粗糙,大神们见笑了。
极为简单的一个动态 upstream 的实现,原理大概介绍一下:
1. etcd 存储 upstream 的信息,结构如下:
/.../services/service1/127.0.0.1:8888
/.../services/service1/127.0.0.2:7777
/.../services/service2/127.0.1.1:8888
/.../services/service2/127.0.1.2:7777
...
2. 在 init_worker_by_lua 中,初始化 upstream 数据:如果有 dump file 则从 dump file 中读取。如果没有,则遍历 etcd 中的 /services/ 目录,拿到所有的数据。
3. upstream 数据存在 lua module 实例中。
4. 使用 ngx.timer.at 开启一个循环,利用 etcd 的 watch api 监听 /services/ 目录下的变化,并更新到 module 数据中。
5. worker 之间使用 shared dict 来抢占一个锁,抢到的将最新的变化 dump 到 file 中。以便在 reload 的时候读取。
欢迎 pr……欢迎批评。
https://github.com/rrfeng/lua-resty-dyups-etcd