作者:loring8 | 来源:互联网 | 2023-08-16 18:40
原文连接:https:blog.fengjx.comopenrestygateway简介OpenResty(也称为ngx_openresty)是一个全功能的Web应用服务器。它打包
简介
OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。
通过揉和众多设计良好的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以处理一万以上并发请求的极端高性能的 Web 应用。
ngx_openresty 目前有两大应用目标:
- 通用目的的 web 应用服务器。在这个目标下,现有的 web 应用技术都可以算是和 OpenResty 或多或少有些类似,比如 Nodejs, PHP 等等。ngx_openresty 的性能(包括内存使用和 CPU 效率)算是最大的卖点之一。
- Nginx 的脚本扩展编程,用于构建灵活的 Web 应用网关和 Web 应用防火墙。有些类似的是 NetScaler。其优势在于 Lua 编程带来的巨大灵活性。
引用自:OpenResty最佳实践
入门教程
- OpenResty 最佳实践
- 跟我学OpenResty(Nginx+Lua)开发
目前已经有大佬写了很完整的教程,没有必要重复造轮子了,我觉得这两个是最好的。更多openresty相关资料可以看这里https://blog.fengjx.com/awesome/#lua--openresty
网关服务开发
整体架构
服务启动时,将自己的节点信息注册到etcd,包括:服务名称、ip、端口
网关服务从etcd监听服务节点信息变更,保存到缓存中,从客户端请求的url中提取服务名称,通过服务名称查找节点信息,将请求转发到后端服务
> 关于etcd的使用,这里不再阐述
url规范
- 对外api前缀:
/open/api/service_name/**
,后端服务路由:/open/api/**
- 对内api前缀:
/inner/api/service_name/**
,后端服务路由:/**
例如/open/api/user/fav
会转发到user服务的/open/api/fav
接口;/inner/api/user/info
会转发到user服务的/info
接口。通过url规范我们就能很轻易的做api鉴权,而不需要将对外api和对内api部署成2个服务(当然也要考虑实际情况,是否符合实际项目要求)。
源码解析
github: https://github.com/fengjx/resty-gateway
-
init_by_lua_file "lua/init.lua"
初始化项目配置
-
init_worker_by_lua_file "lua/init_worker.lua"
初始化服务发现组件,监听服务节点变更信息
-
rewrite_by_lua_file "lua/rewrite.lua"
- 生成requestId,方便链路跟踪和问题排查
- 解析请求服务名称
- 重写后端请求url,去掉服务名
-
access_by_lua_file "lua/gateway.lua"
通过服务发现组件查询服务节点信息
-
balancer_by_lua_file "lua/server_rr.lua"
通过查询到的节点信息,轮训其中一个节点,将请求转发到后端服务
-
user.conf
模拟用户服务
-
auth.conf
模拟认证服务
运行测试
安装openresty: http://openresty.org/cn/installation.html
启动服务
git clone https://github.com/fengjx/resty-gateway.git
cd resty-gateway
# -g "daemon off;是在前台运行,如果想后台运行可以去掉
openresty -p `pwd` -c conf/nginx.conf -g "daemon off;"
向etcd注册节点信息,当然实际情况是在服务启动的时候自动注册的,这里为了测试,手动模拟的服务注册过程
# 注册user服务
etcdctl put /micros/service/user/127.0.0.1:1024 1
etcdctl put /micros/service/user/127.0.0.1:1025 1
# 注册auth服务
etcdctl put /micros/service/auth/127.0.0.1:1026 1
etcdctl put /micros/service/auth/127.0.0.1:1027 1
发送http请求
# 测试auth服务
curl http://localhost:10000/open/api/auth/login
curl http://localhost:10000/inner/api/auth/has-login
# 测试user服务
curl http://localhost:10000/inner/api/user/fav
curl http://localhost:10000/inner/api/user/info
todo
- [x] 服务发现,动态路由
- [x] 自动生成requestId,方便链路跟踪
- [ ] 动态ip防火墙
- [ ] 限流器
- [ ] 用户登录认证
- [ ] 接口协议加解密
作者:冯小小 原文链接:https://blog.fengjx.com/openresty/gateway/