- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
之前已经拆解细点逐个介绍了 tcp 、http 代理相关核心点,现在介绍一个让 api gateway 变得很灵活的功能实现: 动态插件.
由于 lua 的动态语言特点,我们可以比较方便做到动态插件机制.
首先我们来了解这一切的基石:lua 模块加载机制.
例如: xxxmodule.lua 文件内容 。
local module = {} -- 注意不要使用全局变量,会造成变量污染,导致无法卸载模块
-- 定义一个函数
function module.func1()
io.write("这是一个公有函数!\n")
end
return module
Lua提供了一个名为require的函数用来加载模块。要加载一个模块,只需要简单地调用就可以了。例如:
local a = require("xxxmodule")
a.func1() -- "这是一个公有函数!\n"
require 函数会在模块path列表搜索模块,openresty可以指定如下两种:
lua 库: lua_package_path "./?.lua;/usr/local/openresty/luajit/share/luajit-2.1.0-beta3/?.lua;",
c 库: lua_package_cpath "./?.so;/usr/local/lib/lua/5.1/?.so;",
找到模块文件之后,就会解析执行整个文件的内容(类似函数 loadstring),由于最后是return 模块变量,我们就可以使用这个变量的函数等等一切了 。
如果开启了 lua_code_cache on, require 函数会将第二步拿到的变量存在 package.loaded 这个table 中,达到缓存效果 。
非常简单,只需一句:
package.loaded['xxxmodule'] = nil
所以基于lua的模块管理,我们就可以非常容易实现插件模块的管理 。
所以我们可以基于这样的动态机制,实现 lua severless function 或者动态插件机制,示例如下:
http {
default_type application/json;
lua_code_cache on;
lua_package_path "$prefix/deps/share/lua/5.1/?.lua;$prefix/deps/share/lua/5.1/?/init.lua;$prefix/src/?.lua;$prefix/src/?/init.lua;;./?.lua;/usr/local/openresty/luajit/share/luajit-2.1.0-beta3/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/openresty/luajit/share/lua/5.1/?.lua;/usr/local/openresty/luajit/share/lua/5.1/?/init.lua;";
lua_package_cpath "$prefix/deps/lib64/lua/5.1/?.so;$prefix/deps/lib/lua/5.1/?.so;;./?.so;/usr/local/lib/lua/5.1/?.so;/usr/local/openresty/luajit/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall.so;";
# 简单模拟模块
init_by_lua_block {
MockPackages = {}
}
server {
listen 8222;
server_name localhost;
location /add {
# 比如替换为 request body 去做模块创建,这里为了简单就用写死的代码来模拟
# 内容为通过 loadstring 转换 lua code 字符串为函数
# 并将函数结果 当前时间存在全局变量中
access_by_lua_block {
local lua_src = [[
ngx.update_time()
return tostring(ngx.now())
]]
local f, e = loadstring(lua_src, "module xxxmodule")
MockPackages['xxxmodule'] = f()
ngx.say('add function success')
}
}
location /run {
# 这里获取缓存结果并输出出来
access_by_lua_block {
if MockPackages['xxxmodule'] then
ngx.say(MockPackages['xxxmodule'])
else
ngx.say('no function')
end
}
}
}
}
启动并测试 。
mkdir -p logs && /usr/bin/openresty -p ./ -c nginx.conf -g 'daemon off;'
call http://127.0.0.1:8222/run return no function
call http://127.0.0.1:8222/add return add function success
call http://127.0.0.1:8222/run return 1624022896.703
call http://127.0.0.1:8222/add return add function success
call http://127.0.0.1:8222/run return 1624022918.674
可以看到值已经被改变了 。
管理以及定位问题 。
实际环境会有很多机器实例,对应的severless function 在哪几台机器哪几个nginx中的哪些worker 进程上加载,加载多久, 需要完整规划方案 。
资源隔离 。
所有的severless function 其实都是在worker内, 所以内存cpu等于是共享,一个特耗性能的代码必然影响其他 。
安全问题 。
由于多个函数会同在一个worker 进程,无论性能和资源都会收到相互影响 别人可以在其中轻松加入恶意代码 。
所以如果在公用的api gateway中,大家还是不要把它当成云计算中的 severless function 使用,只是当成一个 动态filter function 就好.
最后此篇关于构建apigateway之动态插件的文章就讲到这里了,如果你想了解更多关于构建apigateway之动态插件的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我们正在使用 AWS API Gateway,我正在使用 CloudFormation 注册域和 A 记录,如下所示: Domain: Type: AWS::ApiGateway::Dom
我有以下 CF 模板 { "Conditions":{ "CreatedProdStage" : {...} } ... "Resources":{
我目前正在将 AWS Lambda 用于我的内部应用程序到使用 jreSTLess 实现的 spring 框架的应用程序调用。 应用程序调用的应用程序完美运行,延迟适中(理想情况下约为 10-15 毫
我们有一个返回 gzip 编码的端点。我们想要缓存该值,我们正在使用 ApiGateway 来为我们做到这一点。资源方法定义如下, GetManifestApiGatewayMethod: # ver
我正在处理swagger文件,要在aws apigateway中创建授权者。但是这次我会在swagger文件中提到一些函数和api。但是它不会在Apigateway中生效。一旦我删除了堆栈,它就会生效
在使用 Cognito 和 API Gateway 访问我们的 REST API 时遇到问题 我这辈子都找不到一个简单的例子来说明如何在我们的 AWS 服务器上调用安全的 REST API。 我打电话
我正在使用 AWS CDK 构建我的 lambda,我想从 lambda 的 CDK 堆栈注册端点。 我发现我可以使用 fromRestApiId(scope, id, restApiId) 获取现有
我使用此配置部署到“Prod”阶段: "ApiGatewayApi": { "Type": "AWS::Serverless::Api", "Properties": {
我有一个 API 网关集成,其中数据直接发送到 dynamodb。 x-amazon-apigateway-integration 定义了响应代码映射,因此我的目的是在客户端获取 dynamodb 抛
下面是我的cloudformation模板。我想将 aws:SourceVpc 转换为资源策略文档中的列表。我尝试了溢出但低于错误。 政策文件无效。请检查策略语法并确保主体有效。 (服务:Amazon
我有一个由多个 lambda 组成的状态机,我使用 Cloudformation 模板设置了这些 lambda,该模板执行一些处理并最终将文件保存到 S3;除非有要求,否则我不会在这里添加它,因为它可
我正在使用 vert.x 和 RxJava 开发 Apigateway。我想发送 2 个 Api 的响应式(Reactive)请求,从它们那里获取响应并通过 HttpServer 发送组合的 JSON
我正在使用 AWS SignV4 签署调用 AWS API Gateway 的请求。使用带 header 的请求不适合我的用例,因此主动使用签名网址和查询字符串。 我用过AWS Sample Pyth
我正在为我的电子商务应用程序创 build 计。它将拥有由 AWS Lambda 支持的多项服务。 Orderservice、InventoryService、PaymentService、Loggi
我能够使用 Cloudformation/无服务器应用程序模型定义和部署我的 API 网关 + Lambda 堆栈,并希望向我的 API 添加模型。 我已在 YAML 中创建了模型,但它似乎无法引用我
我看不到更新 AWS APIGateway 自定义域上的证书的方法。如果我使用新证书创建新的自定义域,则无法使用现有的 *.cloudfront.net 域。我将不得不更新 DNS 以指向新域。 有没
刚刚通过 AWS 学习 - 我有一个 APIGateway REST API 设置与 Lambda 代理集成。 API 定义了一个模型,并使用该模型在主体上请求验证设置。 假设模型是 { "$
没有找到任何有关如何实现 Cloudfront + MTLS 或 Api Gateway + MTLS 的资料。可能吗?如果没有,是否有其他方法可以使用 CloudFront + ApiGateway
我在 ApiGateway 中使用 Lambda 代理和 Cognito 用户池授权器。在 Lambda 函数中,我可以通过事件对象访问路径等变量。除此之外,我想访问经过身份验证的用户的声明。在它写的
如何使用 AWS-CDK 从 apigateway 迁移到 apigatewayv2? 具体来说:我正在使用 LambdaRestApi和 restApiId和 deploymentStage从那个资
我是一名优秀的程序员,十分优秀!