构建api gateway之 动态插件
动态插件
之前已经拆解细点逐个介绍了 tcp 、http 代理相关核心点,现在介绍一个让 api gateway 变得很灵活的功能实现: 动态插件。
由于 lua 的动态语言特点,我们可以比较方便做到动态插件机制。
首先我们来了解这一切的基石: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 simple demo
所以我们可以基于这样的动态机制,实现 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 demo的问题
管理以及定位问题
实际环境会有很多机器实例,对应的severless function 在哪几台机器哪几个nginx中的哪些worker 进程上加载,加载多久, 需要完整规划方案
资源隔离
所有的severless function 其实都是在worker内, 所以内存cpu等于是共享,一个特耗性能的代码必然影响其他
安全问题
由于多个函数会同在一个worker 进程,无论性能和资源都会收到相互影响 别人可以在其中轻松加入恶意代码
所以如果在公用的api gateway中,大家还是不要把它当成云计算中的 severless function 使用,只是当成一个 动态filter function 就好。
目录
构建api gateway之 动态插件的更多相关文章
- [转载] 构建微服务:使用API Gateway
原文: http://mp.weixin.qq.com/s?__biz=MzA5OTAyNzQ2OA==&mid=206889381&idx=1&sn=478ccb35294c ...
- 0601-Zuul构建API Gateway-API gateway简介、基础使用、路由配置、负载配置
一.API Gateway简介 参看:http://www.cnblogs.com/bjlhx/p/8794437.html 二.zuul简介[路由器和过滤器:Zuul] 在微服务架构的组成部分进行路 ...
- 谈谈微服务中的 API 网关(API Gateway)
前言 又是很久没写博客了,最近一段时间换了新工作,比较忙,所以没有抽出来太多的时间写给关注我的粉丝写一些干货了,就有人问我怎么最近没有更新博客了,在这里给大家抱歉. 那么,在本篇文章中,我们就一起来探 ...
- 微服务中的 API 网关(API Gateway)
API 网关(API Gateway)提供高性能.高可用的 API 托管服务,帮助用户对外开放其部署在 ECS.容器服务等云产品上的应用,提供完整的 API 发布.管理.维护生命周期管理.用户只需进行 ...
- API Gateway微服务
微服务中的 API 网关(API Gateway) 前言 又是很久没写博客了,最近一段时间换了新工作,比较忙,所以没有抽出来太多的时间写给关注我的粉丝写一些干货了,就有人问我怎么最近没有更新博客了 ...
- 服务中的 API 网关(API Gateway)
我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 Rest Api ...
- Amazon API Gateway Importer整合过程小结
(1)需要将swagger json转换成amazon api gateway 所需要的格式(根据Method Request中 Request PathsURL Query String Param ...
- Qwiklab'实验-API Gateway, AWS Lambda'
title: AWS之Qwiklab subtitle: 2. Qwiklab'实验-API Gateway, AWS Lambda' date: 2018-09-20 17:29:20 --- In ...
- 几种部署Goku API Gateway的方式,最快一分钟可使用上网关
本文将介绍几种部署Goku API Gateway的方式,最快一分钟可使用上为网关,详情请看全文. 什么是Goku API Gateway? Goku API Gateway (中文名:悟空 API ...
- 详解API Gateway流控实现,揭开ROMA平台高性能秒级流控的技术细节
摘要:ROMA平台的核心系统ROMA Connect源自华为流程IT的集成平台,在华为内部有超过15年的企业业务集成经验. 本文分享自华为云社区<ROMA集成关键技术(1)-API流控技术详解& ...
随机推荐
- Java反应式编程(1)
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 前面把Java函数式编程的由来和最主要的核心知识点讲完了.包括比较难懂的Lambda表达式是怎么演变而来的也全部都撸了一遍.Lambda表达式这 ...
- 嵌入式-C语言基础:字符串strlen和sizeof的区别
strlen表示的实际的字符串长度,不会把字符串结束符'\0'计算进去,而sizeof则不是实际的字符串长度,它会把字符串的结束标识符'\0'也包含进去. #include<stdio.h> ...
- 树莓派(香橙派)通过.NET IoT 操作SPI编写屏幕驱动 顺手做个四足机器人(一)
摘要 这片文章主要是记录自己的整活过程,涉及到的技术包括.NET IoT, .NET Web, .NET MAUI,框架采用的也是最新的.NET 7. 本人是用的树莓派Zero 2 W(ubuntu- ...
- .net随笔——Web开发config替换到正式config appSettings
前言(废话) 查了一些资料,总体来说呢,就是坑,而且顺带吐槽下百度,一个内容被copy那么多遍还排在最前面.同一个内容我点了那么多次,淦. 正题: 实现目的:开发的时候使用system.debug.c ...
- ubuntu 22.04安装多个gcc
sudo apt install gcc-9 g++-9 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 - ...
- Aspose.Cells设置单元格背景色不生效
Style.BackgroundColor property 获取或设置样式的背景颜色.public Color BackgroundColor { get; set; } 评论 如果要设置单元格的颜 ...
- esp-01和esp-01s烧录固件和程序
准备工具 USB-TTL 杜邦线若干 esp-01s烧录固件 我烧录的固件是 micropython, 使用的软件是 uPyCraft esp-01s烧录固件接线方法: esp-01s usb-ttl ...
- SDK怎么测试?俺不会啊
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/7bc8d1c8.html 你好,我是测试蔡坨坨. 众所周知,在云产品和SaaS蓬勃发展的当下,企业中有许多系统和环节都是依赖 ...
- 【每日一题】2021年12月14日-82. 删除排序链表中的重复元素 II
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字. 返回同样按升序排列的结果链表. 来源:力扣(LeetCo ...
- 单节锂电池充电管理芯片,IC电路图
PW4054 是一款性能优异的单节锂离子电池恒流/恒压线性充电器.PW4054 适合给 USB 电源以及适配器电源供电.基于特殊的内部 MOSFET 架构以及防倒充电路, PW4054 不需要外接检测 ...