上面是我们的nginx配置,引入了redis模块,用于存储API请求数量,接下来,我们在gateway/intercept.lua中实现API请求数量统计的处理逻辑:
- local function increseNum(key)
- -- get key from rediskey
- local _redis = require "resty.redis"
- local redis = _redis:new()
- redis:set_timeout(100)
- local ok, err = redis:connect(ngx.var.redis_host, ngx.var.redis_port)
- if not ok then
- ngx.log(ngx.ERR, "failed to connect to redis: ", err)
- return nil
- end
- if ngx.var.redis_auth then
- local ok, err = redis:auth(ngx.var.redis_auth)
- if not ok then
- ngx.log(ngx.ERR, "failed to authenticate: ", err)
- return nil
- end
- end
- if ngx.var.redis_db then
- local ok, err = redis:select(ngx.var.redis_db)
- if not ok then
- ngx.log(ngx.ERR, "failed to select db: ", ngx.var.reddb, " ", err)
- return nil
- end
- end
- local res, err = redis:incr(key)
- if not res then
- ngx.log(ngx.ERR, "failed to incr key: ", key ,", ", err)
- return nil
- end
- if res == ngx.null then
- ngx.log(ngx.ERR, "key ", key, " not found")
- return ngx.null
- end
- local ok, err = redis:close()
- if not ok then
- ngx.log(ngx.ERR, "failed to close: ", err)
- end
- return res
- end
- increseNum(ngx.var.redis_incrkey)
就这样,我们实现了API网关的一个小功能,其他功能实现,就靠大家去摸索了。目前市面上成熟的API网关实现方案有很多,采用openresty 开发出的api网关,比如比较流行的kong、orange等, 大家可以自行了解。 (编辑:青岛站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|