动态配置Lua脚本及应用
NGINX 向云原生演进,All in OpenNJet
OpenNJet 是基于Nginx fork并独立演进的应用引擎,提供的Lua脚本运行能力移植自OpenResty 社区开源的lua-nginx-module 模块,该开源的Lua模块可以将Lua脚本通过内嵌的方式直接写在配置文件中,或者通过 *_by_lua_file 的指令(如content_by_lua_file, access_by_lua_file) 写在外部文件中。
Nginx 上难于进行动态化配置的问题,同样存在于Lua脚本的修改上。一旦完成初始配置,脚本内容进行修改后,需要生效一般只能通过两种方式。其一是服务进程重新加载配置(reload),另一种方案是将脚本放置于外部文件,并通过配置 lua_code_cache off的方式关闭代码缓存机制,但这种方式只适用于开发阶段,生产环境并不适用。
OpenNJet 架构设计已经考虑了动态配置的问题,Lua 脚本内容的修改上,使用架构提供的能力,在兼顾性能的情况下,实现了无需重启或重加载,实时更新Lua脚本的功能。
功能说明
Lua动态配置能力,通过模块 ”njt_http_dyn_lua_module”实现,使用时需要在数据面的配置文件中加载该模块。
在文件njet.conf中,首先配置测试的server及location, 接下来的功能演示测试中将用到, 配置如下:
worker_processes auto; cluster_name njet; node_name node1; error_log logs/error.log error; helper ctrl modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf; helper broker modules/njt_helper_broker_module.so; load_module modules/njt_http_location_module.so; load_module modules/njt_http_lua_module.so; load_module modules/njt_http_dyn_lua_module.so; events { worker_connections 1024; } http { include mime.types; access_log off; lua_package_path "$prefix/lualib/lib/?.lua;/usr/local/njet/modules/?.lua;;"; lua_package_cpath "$prefix/lualib/clib/?.so;;"; upstream weba { server 127.0.0.1:8888; } server { listen 8888; location / { return 200 "return from server8888\n"; } } server { listen 8080; location / { root html; } location /lua { content_by_lua_block { njt.say("lua test") } } } }
该配置文件使用内嵌的方式,在location /lua 下, 配置了content_by 脚本。服务进程启动后, 访问该测试地址,可以看到输出的内容。
通过查询接口,获取当前配置。
通过Restful 接口提交新的Lua脚本内容,变更将实时生效,不需要重加载配置。
除了修改content_by 脚本内容,还可以添加或修改access 阶段的脚本。
进阶场景
结合OpenNJet 的动态Location 配置能力,可以实现更为复杂的场景。
例如设计如下场景:
-> 动态添加一个location, location 中使用proxy_pass 代理到后端服务
->使用动态Lua设置,覆盖掉proxy_pass的配置,输出Lua 脚本中的内容
->动态删除location
->重新添加location
场景验证如下:
动态Lua 配置,目前实现了最为常用的content_by, access_by 两个阶段,能够实时替换当前服务进程使用的Lua脚本内容,后续也可以逐步将动态配置能力扩展到其它阶段(如log_by, header_filter, body_filter)。
NJet 应用引擎通过内核重构实现了独特的运行时动态配置加载能力,是新一代高性能 Web 应用引擎。NJet 拥有高性能数据面处理能力,将集群、高可用、主动健康检查、声明式 API 等多种辅助功能,通过 NJet 独特的副驾驶 CoPilot 服务框架调度,从而方便功能扩展,隔离管理 / 控制功能对数据面的影响,NJet 应用引擎性能超过 CNCF 推荐 Envoy 应用引擎的三倍。 邮件组 官网

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
GreatSQL优化技巧:半连接(semijoin)优化
何为半连接? 半连接是在GreatSQL内部采用的一种执行子查询的方式,semi join不是语法关键字,不能像使用inner join、left join、right join这种语法关键字一样提供给用户来编写SQL语句。 两个表t1表和t2表进行半连接的含义是:对于t1表的某条记录来说,我们只关心在t2表中是否存在与之匹配的记录,而不关心有多少条记录与之匹配,最终的结果集中只保留t1表的记录。 前面文章也提到过,含in、exists子查询的语句通常会采用半连接方式执行查询,但这不绝对,也有一些情况不适用半连接。比如: (1)外查询的where子句中,存在其他搜索条件使用OR操作符与IN子查询的条件连接起来 (2)IN子查询位于Select子句中 (3)IN子查询中含有union的情况 (4)IN子查询中含group by、having或聚合函数的情况 GreatSQL执行半连接的优化策略 本文实验使用数据库版本为GreatSQL 8.0.32-25。 创建两张实验表来说明。 greatsql> create table t1( c1 varchar(30), c2 i...
- 下一篇
架构设计|基于 raft-listener 实现实时同步的主备集群
背景以及需求 线上业务对数据库可用性可靠性要求较高,要求需要有双 AZ 的主备容灾机制。 主备集群要求数据和 schema 信息实时同步,数据同步平均时延要求在 1s 之内,p99 要求在 2s 之内。 主备集群数据要求一致 要求能够在主集群故障时高效自动主备倒换或者手动主备倒换,主备倒换期间丢失的数据可找回。 为什么使用 Listener Listener:这是一种特殊的 Raft 角色,并不参与投票,也不能用于多副本的数据一致性。 原本的 NebulaGraph 中的 Listener 是一个 Raft 监听器,它的作用是将数据异步写入外部的 Elasticsearch 集群,并在查询时去查找 ES 以实现全文索引的功能。 这里我们需要的是 Listener 的监听能力,用于快速同步数据到其他集群,并且是异步的执行,不影响主集群的正常读写。 这里我们需要定义两个新的 Listener 类型: Meta Listener:用于同步表结构以及其他元数据信息 Storage Listener:用于同步 storaged 服务的数据 这样 storaged 服务和 metad 服务的 pa...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境