使用openresty构建的外部测试网关

需求

H5 游戏研发公司
需要将 H5 项目的 URL 给合作方进行测试,

问题

避免游戏地址被外部传播

方案

使用 openrestry 作为反向代理
在后台通过对项目地址, 过期时间等信息进行对称加密.
生成一个 url 链接,然后发送给合作方

合作方使用浏览器打开 url 时, openresty 会收到 http 请求
并对 url 参数中的加密信息进行解密, 获取项目地址,过期时间等相关的信息

如果当前时间大于过期时间则返回相应过期提示
如果当前时间小于过期时间则通过 proxy_pass 进行代理请求

大致的情况就是这样了

client—-gateway url—->openresty—-project url—->project
client<—-response data—-openresty<—-response data—-project

续期

一直相安无事, 突然有了一个需求
过期时间在生成链接时是确定的
但是合作方可能还想在体验一下

简单的方法就是直接重新生成一个新链接
但是体验很不好, 因为合作方可能有多个人在测试
这样的话, 就需要将新链接通知到 N 个人
麻烦且低效

方案 1

所以我们需要找到一个方法能对发出去的 url 进行续期操作
先想到了一个方法, 对每个生成的 url 都有一个 id
续期时直接传送一个参数 id 来定位一个 url, 然后进行相应的操作
这样 openresty 这边就需要构建一个数据库将所有的 url 记录下来

原本 openresty 这只是一个过期的判断
如果这样修改则需要生成一堆的数据信息
能不能简单点

方案 2

我们可以直接将 url 的加密信息作为 key
存在 redis 中, 然后设置这个 key 的过期时间
这样既能满足需求,逻辑简单,改动也少

请求 url 代理的逻辑

1
2
3
4
5
6
7
8
9
10
在redis中查找是否有以"加密信息"为key的value
如果存在
进行代理
否则
将加密信息解密
对过期时间进行判断
如果过期
返回过期提示
否则
进行代理

设置 url 续期逻辑

直接将 url 的加密信息作为 redis 的 key 存储起来,并设置相应的 ttl

openresty 请求阶段问题

4b3e6bc0d0331001c26567cfcc68a8b9.png

因为需要使用 pass_proxy 对项目 url 进行代理
所以我们在 set_by_lua 阶段对请求的 url 进行解密来获取项目的 URL 地址
并且直接在 set_by_lua 中进行判断是否过期(本质上是个时间比较)

但是在 set_by_lua 阶段不能访问 redis 的外部服务(因为性能)
所以最后我们先在 set_by_lua 阶段生成代理的 url
然后在 access_by_lua 阶段判断请求的 url 是否过期

以上是我们在外部测试网关管理的问题和总结