如何使用OpenResty实现API网关功能

本文涉及的产品
云原生 API 网关,700元额度,多规格可选
AI 网关免费试用,2900元额度,限量100份
简介: 如何使用OpenResty实现API网关功能

首先,openResty采取的是Lua语言,所以首要的是需要掌握必要的Lua语法,最快的方案是找一个OpenResty的开源项目来读源码。这里就使用 orange。

了解OpenResty

openResty官方中文文档openResty基于Nginx和LuaJIT开发,是CDN的技术标准。拥有丰富的lua-resty库,形成了自己的生态体系,在API网关和软WAF等领域被广泛应用。

OpenResty的特性

  • 文档详尽,测试用例比较丰富
  • 自带命令行工具restydoc,通过shell查看文档
  • 同步非阻塞:支持协程,实现了同步非阻塞的编程模式,即对于当前线程中的程序是顺序执行的,但是也可以处理其他程序,而如果被同步掉的代码在等待的时候,会接着执行下面的代码,直到遇到同步部分的结果被使用的时候才会等待结果返回。这个在python多线程编程的时候也遇到过。
  • 动态:由脚本语言 Lua动态修改配置,通过 OpenResty 中 lua-nginx-module 模块中提供的 Lua API,我们可以动态地控制路由、上游、SSL 证书、请求、响应等

由于其可动态修改web服务的特性,使得serverless和边缘计算也可以用OpenResty来做。

需要重点掌握的知识

  • 同步非阻塞的编程模式
  • openResty在一个web请求中的不同阶段的作用
  • LuaJIT和Lua的不同之处
  • OpenResty API的周边库
  • 协程和cosocket
  • 单元测试框架和性能测试工具
  • 火焰图和周边工具链
  • 性能优化

首先,由于windows环境和linux环境有较大差异,所以我不建议使用windows作为开发环境,既然互联网上关于在linux上构建openresty的比较多,最后就只采取linux作为开发环境。

安装OpenResty

centos安装OpenResty官方文档

命令行工具Resty

resty 本质上是启动了一个 NGINX 服务

一个简单的例子

来到一个用户目录下,创建logs目录和conf目录,并在conf目录下创建一个nginx.conf的例子,代码如下:

events {
    worker_connections 1024;
}

http {
    server {
        listen 8080;
        location / {
            content_by_lua '
                ngx.say("hello, world")
            ';
        }
    }
}

然后启动指定该配置文件启动项目

openresty -c conf/nginx.conf

打开浏览器访问的结果如下(在这之前确保你的安全组是打开了的):

openResty的关闭似乎不是很好用,建议使用

netstat -anop | grep port

获取pid,然后kill掉。

然后将ngx.say("hello, world")这一串代码改成放到lua脚本中,那么配置文件改为:

user root;
pid logs/nignx.pid;
events {
    worker_connections 1024;
}

http {
    server {
        listen 8081;
        location / {
            content_by_lua_file lua/demo.lua;
        }
    }
}

我这里使用了user root,是由于我没有新建一个用户来做实验,而nginx的默认用户是nginx,没有lua文件的权限。这里可以考虑新建一个用户来做实验。最终的结果如下: 那么怎么让修改及时生效呢?而不需要每次都kill掉程序?Lua 代码在第一个请求时会被加载,并默认缓存起来。所以在你每次修改 Lua 源文件后,都必须重新加载 OpenResty 才会生效。其实,在 nginx.conf 中关闭 lua_code_cache 就能避免重新加载,这一点你可以自己试试看。不过,特别需要注意的是,这种方法只能临时用于开发和调试,如果是线上部署,一定要记得打开缓存,否则会非常影响性能。

openresty中官方实现了很多不同类型的库,例如包含 18 个 lua-resty-* 库,涵盖 Redis、MySQL、memcached、websocket、dns、流量控制、字符串处理、进程内缓存等常用库。

分析开源项目Orange

首先,了解一下Orange,Orange 是一个基于 OpenResty 的API网关。除 Nginx 的基本功能外,它还可用于API监控、访问控制(鉴权、WAF)、流量筛选、访问限速、AB测试、静/动态分流 等。

说句实在的,它已经实现了绝大部分的功能,

项目目录结构

  • api
  • 目测是提供的接口,官方文档中提到了该项目提供了API接口用于实现第三方服务
  • bin
  • 应该是运行目录,里面主要是lua的一些第三方包
  • conf
  • 配置模板,类比nginx中的配置
  • dashboard
  • 控制台程序
  • docs
  • 运行文档
  • install
  • 安装方法,包含了sql语句和安装执行脚本
  • orange
  • 也是一些Lua的代码,主要是核心代码所在地
  • rockspec
  • 似乎是对该项目的打包,类似于java的jar一样,相当于给别人直接使用
  • test
  • 测试库


核心知识点

需要掌握的Lua代码

我打算以下面的步骤进行学习

  • 首先需要知道其包管理工具为luarocks
  • 同时也需要一个Lua的运行环境
  • ide
  • hello world
  • 线上运行方式:打包、部署
  • 实际的openResty的开发

好了,下一节就详细介绍Lua的各种语法和方法


必须掌握的Lua知识点

构建Lua项目环境

LuaJIT是相对于Lua更为主流的存在

架构设计

  • 首先是存储,你需要设计出一个存储模块,不能所有东西都走缓存:可以考虑仅仅只走文件系统。
  • 旁路监听,不影响网络的性能,只做分析和拦截建议
目录
相关文章
|
2月前
|
存储 缓存 API
实现电商物流API的实时追踪功能
在电商时代,实时物流追踪已成为提升用户体验的核心功能。本文详解如何通过物流API实现包裹位置追踪、ETA计算及数据优化,涵盖API集成、后端处理、前端展示与性能调优,助力构建高效可靠的追踪系统,提升用户信任与满意度。
167 0
|
2月前
|
消息中间件 缓存 监控
电商API接口功能全景图:商品、订单、支付、物流如何无缝衔接?
在数字化商业中,API已成为电商核心神经系统。本文详解商品、订单、支付与物流四大模块的API功能,探讨其如何协同构建高效电商闭环,并展望未来技术趋势。
|
5月前
|
架构师 安全 物联网
Apipost vs Apifox:高效API协作的差异化功能解析
作为企业级API架构师,深度体验APIPost与Apifox后发现几大亮点功能。目录级参数配置避免全局污染;WebSocket消息分组提升长连接管理效率;Socket.IO支持解决特定协议需求;接口锁定保障团队协作安全。大型团队适合APIPost的细粒度管控,复杂物联网项目需WebSocket分组,维护遗留系统离不开Socket.IO支持,初创团队可按需灵活选择。这些特性显著优化开发协作质量。
|
20天前
|
供应链 API 数据安全/隐私保护
电商API数据接口的核心功能
电商API数据接口是电商平台与外部系统通信的核心工具,具备订单管理、库存同步和电子面单获取三大功能。它实现订单信息实时同步、多平台整合与状态更新,提升商家运营效率;通过库存数据双向同步,避免超卖并优化库存成本;同时自动获取电子面单号,加快发货流程。电商API在提升交易效率与用户体验方面具有重要作用。
|
5月前
|
API 开发者 Python
如何在API中实现搜索和过滤功能
本文介绍了如何为API添加搜索和过滤功能,使其更强大灵活。通过Flask示例,展示了按书名搜索、按作者或年份过滤书籍的方法,并结合两者实现复合查询。同时,提供了搜索不区分大小写、支持多过滤器组合、分页和输入验证等最佳实践。最后推荐了Apipost工具,它能简化API调试、负载测试及文档生成,提升开发效率。这些功能帮助用户更好地控制数据,优化API使用体验。
|
2月前
|
Java API
Java API中Math类功能全景扫描
在实际使用时,这些方法的精确度和性能得到了良好的优化。当处理复杂数学运算或高精度计算时,`Math`类通常是足够的。然而,对于非常精细或特殊的数学运算,可能需要考虑使用 `java.math`包中的 `BigDecimal`类或其他专业的数学库。
84 11
|
1月前
|
JSON 算法 API
拼多多API跨店比价功能,选品效率提升60%!
拼多多推出API跨店比价功能,助力商家与消费者高效选品。通过自动化比价与智能算法,实现选品效率提升60%。开发者可快速集成,优化采购与购物体验。智能高效,抢占市场先机。了解详情:https://o0b.cn/evan
162 0
|
1月前
|
安全 API 开发者
Docker Remote API的功能详述及其使用方法。
综上所述,Docker Remote API是管理Docker环境的强大工具,它使得开发者能够更灵活地集成和自动化Docker相关的操作。通过遵循Docker守护进程的安全配置标准和正确使用HTTP请求,可以有效地控制Docker守护进程,实现高效的容器管理和自动化部署。
78 0
|
2月前
|
API
Dataphin功能Tips系列(58)- 支持OAuth2.0认证方式的API数据源
在数据集成过程中,Dataphin需通过API从外部系统获取数据,而这些系统常采用动态令牌鉴权机制。本文介绍如何在Dataphin中配置支持OAuth 2.0认证的API数据源,实现自动获取和刷新访问令牌,确保安全高效地进行数据请求与集成。
|
2月前
|
Java API
深入解析Java API中Object类的功能
了解和合理运用 Object类的这些方法,对于编写可靠和高效的Java应用程序至关重要。它们构成了Java对象行为的基础,影响着对象的创建、识别、表达和并发控制。
55 0