一种轻量的openresty路由设计

在使用openresty开发接口的过程会发现一个问题,那就是接口的地址问题怎么解决,最好一个接口地址对应一个lua文件,也可以在nginx.conf 配置中使用content_by_lua 来编写接口逻辑,显然后者并不合适团队开发,为了解决这个问题,所以出现了很多类似的框架,一个比较好用的就是lusty框架,他可以将url中的某段值自动定义成变量,但是耦合性有点高,当多个接口站点部署在同一个nginx上时,你只能通过修改lusty的目录结构和app.lua文件,显然这不是我想要的结果,在网上找到一段很犀利的ngx配置,简单粗暴,但非常有效。

但出于安全性考虑,决定给访问的接口地址加个白名单功能,不在白名单的地址不允许访问。

将白名单功能抽象成一个app_route.lua文件,在初始化的时候需要载入一个白名单列表,具体的ngx配置如下:

这里加载了一个对应目录的route_config.lua,由于这个config文件内容较小,所以我把内容直接列了出来:

--白名单列表
local whitelist = {
    ‘test1‘,
    ‘user/login‘,
    ‘user/register‘
}
--路由重写列表
local rewritelist = {
    [‘user/([-_a-zA-Z0-9]+)/login‘] = ‘user/login‘,
    [‘user/([a-zA-Z0-9]+)/register‘] = ‘user/register‘
}
return {
    whitelist = whitelist,
    rewritelist = rewritelist
}

然后在content_by_lua_file 前面加这么一句代码:

你会发现白名单功能就这么完成了,而且多次测试后发现单纯的路由查找功能会比lusty快一倍以上。

当然也支持简单的路由重定向功能,本文只是单纯的技术分享,如果你有更好的建议也可以单独讨论。

文本是原创作品,转载记得写明出处

app_route.lua

 1 local _M = { _VERSION = ‘0.1‘ }
 2 local mt = { __index = _M}
 3 local tinsert = table.insert
 4 local tconcat = table.concat
 5 local tonumber = tonumber
 6 local function uritoken(uri)
 7     local ret = {}
 8     for token in uri:gmatch("[^/.]+") do
 9         tinsert(ret,token)
10     end
11     return ret
12 end
13
14 function _M.new(self,rconfig)
15     local tab = {}
16     local routeMap = require(rconfig)
17     local route_data = {}
18     local whitelist = routeMap.whitelist
19     for i=1,#whitelist do
20         local ret = uritoken(whitelist[i])
21         if #ret > 0 then
22             tinsert(route_data,tconcat({‘^‘,tconcat(ret,‘/‘),‘$‘}))
23         end
24     end
25     local rewritelist = routeMap.rewritelist
26     local x = 1
27     local rewrite_data = {}
28     local rewrite_urls = {}
29     for k,v in pairs(rewritelist) do
30         tinsert(rewrite_data,tconcat({‘^(?<z‘,x,‘z>‘,k,‘)$‘}))
31         tinsert(rewrite_urls,v)
32         x = x + 1
33     end
34     tab.rewrite_urls = rewrite_urls
35     tab.rewrite_pattern = tconcat(rewrite_data,‘|‘)
36     tab.route_pattern = tconcat(route_data,‘|‘)
37     return setmetatable(tab, mt)
38 end
39
40 function _M.route_verify(self)
41     local uri = ngx.var.api_path
42     local ret = uritoken(uri)
43     uri = tconcat(ret,‘/‘)
44     ngx.var.api_path = uri
45     local m = ngx.re.match(uri,self.route_pattern)
46     if m == nil then
47         m = ngx.re.match(uri,self.rewrite_pattern)
48         if m == nil then
49             ngx.exit(404)
50         else
51             local locant = ngx.re.match(next(m,#m), "^z(\\d+)z")
52             ngx.var.api_path = self.rewrite_urls[tonumber(locant[1])]
53         end
54     end
55 end
56 return _M
时间: 2024-10-17 10:49:39

一种轻量的openresty路由设计的相关文章

Metricbeat 轻量型指标采集器

一.介绍 用于从系统和服务收集指标.从 CPU 到内存,从 Redis 到 Nginx,Metricbeat 能够以一种轻量型的方式,输送各种系统和服务统计数据. 1.系统级监控,更简洁(轻量型指标采集器) 将 Metricbeat 部署到您所有的 Linux.Windows 和 Mac 主机,并将它连接到 Elasticsearch 就大功告成啦:您可以获取系统级的 CPU 使用率.内存.文件系统.磁盘 IO 和网络 IO 统计数据,以及获得如同系统上 top 命令类似的各个进程的统计数据.

Rocket Training: 一种提升轻量网络性能的训练方法 by leona

Rocket Training: 一种提升轻量网络性能的训练方法 参考博客: https://www.jianshu.com/p/ec28185510b7 https://blog.csdn.net/cskywit/article/details/78987500 https://mp.weixin.qq.com/s/UkqwPBYgYQuIB9_jGMt2QQ 论文及代码: paper: https://arxiv.org/abs/1708.04106 code: https://github

一种简单,轻量,灵活的C#对象转Json对象的方案

简单,是因为只有一个类 轻量,是因为整个类代码只有300行 灵活,是因为扩展方式只需要继承重写某个方法即可 首先我将这个类称之为JsonBuilder,我希望它以StringBuilder的方式来实现Json字符串的转换 public class JsonBuilder { protected StringBuilder Buff = new StringBuilder(4096);//字符缓冲区 public string ToJsonString(object obj) { .......

OWIN轻量型框架介绍

OWIN轻量型框架介绍 阅读目录 引言 框架的特色 如何启动 各项功能 静态路由的3种写法 伪静态路由的支持 处理Form表单提交的文件 流式处理Post请求的数据 多种请求类型自动识别 响应处理 请求响应上下文 自定义默认处理函数 内置各种便捷函数 复合类型的请求处理 框架的扩展 静态内容的支持 跨域Post的支持 基础类型继承灵活处理 尾声 回到顶部 引言 什么是OWIN,我就不介绍了,请自行搜索,这里主要是介绍自行开发的OWIN框架的特点和用法.由于.NET的web框架都比较庞大,导致性能

Bourbon – 简单、轻量的 Sass 混入库

Bourbon 是一个简单易用的 Sass 混入(Mixin)库,无需配置.该混入包含用于支持所有现代浏览器的 CSS3 属性前缀.前缀需要确保在旧的浏览器支持优雅降级.Bourbon 使用 SCSS 语法. 您可能感兴趣的相关文章 真是好东西!13种非常动感的页面加载动画效果 你见过吗?9款超炫的复选框(Checkbox)效果 超赞!基于 Bootstrap 的响应式的后台管理模板 太赞了!超炫的页面切换动画效果[附源码下载] 创意无限!一组网页边栏过渡动画[附源码下载] 立即下载      

Android轻量缓存框架--ASimpleCache

[转] 大神真面目 稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! 编辑推荐: 做Android应用开发的同学们相信对“缓存”这个词不陌生,缓存可能有多方面的概念,这里大概列举下程序开发的缓存大概有哪些: 1.服务端控制缓存 如volley请求库,便是通过服务端的“Cache-Control”和“max-age”来告诉客户端有没有缓存以及缓存的时间,也是推荐的使用

Skippr – 轻量、快速的 jQuery 幻灯片插件

Skippr 是一个超级简单的 jQuery 幻灯片插件.只是包括你的网页中引入 jquery.skippr.css 和 jquery.skippr.js 文件就能使用了.Skippr 能够自适应窗口宽度,而且导航是独特的条形导航. 您可能感兴趣的相关文章 太赞了!超炫的页面切换动画效果[附源码下载] 创意无限!一组网页边栏过渡动画[附源码下载] 好东西!动感的页面加载动画效果[附源码下载] 使用 CSS3 实现3D图片滑块效果[附源码下载] 时尚设计!三种奇特网格加载效果[附源码下载] 源码下

faked 一个用于 mock 后端 API 的轻量工具

一.简介 faked 是一个在前端开发中用于 mock 服务端接口的模块,轻量简单,无需要在本地启动 Server 也无需其它更多的资源,仅在浏览器中完成「请求拉截」,配合完整的「路由系统」轻而易举的 mock 后端 API. GitHub Rep 地址:https://github.com/Houfeng/faked 二.安装 faked 有两种可选安装方式,你可以通过传统的 sciprt 方式引入 faked,如果你采用了 CommonJs 或 ES6 Modules 模块方案,也可通过安装

五款轻量型bug管理工具横向测评

最近正在使用的本地bug管理软件又出问题了,已经记不清这是第几次了,每次出现问题都要耗费大量的时间精力去网上寻找解决方案,劳心劳力.为了避免再次出现这样的情况,我决定从线下转到线上,使用轻量型的在线bug管理工具,在选择工具时有以下几个要求: 1.不用在本地安装部署,配置环境,即开即用: 2.方便bug管理,bug属性设置: 3.可以跨团队沟通,方便和开发协作: 4.随时掌握bug状态,修复进展等. 花费了一个星期的时间试用了五款在线bug管理工具,其评测结果如下: 1.   Teambitio