nginx向云原生演进,All in OpenNJet!


1. 应用门户简介

NJet 应用引擎是基于 Nginx 的面向互联网和云原生应用提供的运行时组态服务程序,作为底层引擎,NJet 实现了NGINX 云原生功能增强、安全加固和代码重构,利用动态加载机制可以实现不同的产品形态,如Web服务器、流媒体服务器、负载均衡、代理(Proxy)、应用中间件、API网关、消息队列等产品形态等等。NJet使用现有的API Gateway及各动态配置模块提供的能力,实现了一个Portal管理模块。通过该模块,对外提供应用门户的功能,以此来简化应用的开发及部署过程。应用可以只专注于业务逻辑的实现,将通用的安装配置及权限认证功能统一交给NJet应用门户管理模块。逻辑架构如下图所示:

2. 应用部署流程

用户使用管理员账号登录Portal门户,上传应用,添加用户/组/角色,最后进行应用的授权。完成上述操作后,使用普通用户账号登录门户,即可使用应用。

a. 管理员登录

在部署包含Portal 管理模块的环境上,使用api gateway的管理员账号登录后,将显示Portal 的管理界面,在该界面中可以进行应用的部署,及相关的授权。

b. 上传应用

应用管理中点击“新增”,选择Portal 应用的相应npk 文件(应用的结构在后续章节进行说明)。点击确认后,Portal管理模块将自动创建应用需要的Location/Upstream, 由于使用了NJet的动态配置功能,所有的改动将实时生效,不需要重启或重加载NJet。

应用如果需要连接第三方组件,门户管理模块也提供了通用组件的配置能力。

c. 创建访问应用需要的用户/组/角色

应用门户使用Api Gateway提供的授权能力,其模型是“用户->组->角色”的授权模型,一个用户可以归属于不同的用户组,一个用户组可以分配多个角色,API 授权将授权到角色上。

应用门户的 UI上可以对用户/组/角色及相互间的关系进行维护。

d. 对应用进行授权

在应用管理中,选择应用授权,对应用不同的访问路径可以授予不同的角色。

e. 普通用户登录

使用普通用户账号登录后,将显示应用一览页面,在改列表页面中点击对应的图标,将跳转至具体的应用中。

3. Portal 应用结构

使用Portal 管理模块部署的应用,需要使用Portal模块可以识别的格式进行目录规划及应用打包,文件类型是npk (NJet Package)。 典型的目录结构如下图所示:

  • META-INF 目录
    manifest.json: 应用的基本信息,包括入口地址,配置地址,及location / upstream 信息。
    图标文件: jpg 或 jpg 格式的文件
    app_openapi.json: openapi 3.0 格式的文件,其中path 支持 通配符*, 例如 /setting/*
    app_schema.json: 应用需要的组件配置项 (可选,非必须)

  • scripts 目录
    应用使用的脚本

  • static 目录
    静态页面,资源文件,javascript 脚本, css

manifest.json 示例
该文件中定了入口地址(entry_point), 应用配置地址(cfg_url), 及应用需要的 location, upstream servers, \proxy_pass。Location 中可以直接配置属性("__access_control": “true” ) 来标识该访问地址需要使用门户提供的用户授权功能。

{"manifest_version": "1.0.0","app": {"name": "ollamaApp","version": "1.0.0","arch": "x86_64","description": "Ollma Chat application","icon_file": "ollama.jpg","api_file": "app_openapi.json" },"deployment": {"type": "location","server_name": "","entry_point": "/ollama-app/open/chat","cfg_url": "/ollama-app/open/config","locations": [{"path": "/ollama-app/conversation","properties": {" content_by_lua_file": "${APP_PREFIX}/scripts/chat_api.lua"}},{"path": "/ollama-app/setting","properties": {"__access_control": "true", " content_by_lua_file": "${APP_PREFIX}/scripts/chat_api.lua"}},{"path": "/ollama-app/chat","properties": {"access_by_lua_file": "${APP_PREFIX}/scripts/access.lua",  "proxy_set_header": ["Host 192.168.0.206","Origin http://192.168.0.206"],"proxy_pass": {"schema": "http","servers": [{"server":"192.168.40.206:11434"}],"url": "/api/chat"}}},{"path": "/ollama-app","properties": {"__access_control": "true", "alias": "${APP_PREFIX}/static/","try_files": "$uri $uri/ /ollama-app/index.html"}}]}
}

app_schema.json 示例
应用需要连接第三方组件时,组件的配置通过json文件描述配置项,门户管理模块将根据json内容动态生成配置页面。该配置使用 formily (阿里巴巴表单框架 https://formilyjs.org/)定义的格式。 以下示例文件为连接redis 组件时需提供的json文件。

{"redis_host": {"type": "string","x-component": "Input","x-component-props": {"placeholder": "请输入ip地址"},"x-decorator": "Form.Item","x-decorator-props": {"label": "Redis IP","tooltip": "请输入ip地址"}},"redis_port": {"type": "number","x-component": "InputNumber","x-component-props": {"placeholder": "请输入端口号","min": 0,"max": 65535},"x-decorator": "Form.Item","x-decorator-props": {"label": "Redis Port","tooltip": "请输入端口号"}},"redis_password": {"type": "string","x-component": "Input.Password","x-component-props": {"placeholder": "请输入 密码"},"x-decorator": "Form.Item","x-decorator-props": {"label": "Redis密码","tooltip": "请输入密码"}}
}

4. Demo 应用完整实例

a. 通过ftp 获取到 demo 应用包

地址: ftp.tmlake.com
目录: /OpenNjet/Software/v3.2.2-portal
文件: demo_app_1.0.2.npk

b. 使用默认管理员账号 agw_admin /****** 登录 /portal


c. 添加demo应用

在应用管理中,选择新增,添加获取的 demo_app_1.0.2.npk, 并点击确认

成功后,应用管理页面将出现 demo 应用的条目

d. 为用户添加用户/组/角色

添加一个demo用户角色

添加一个demo用户组

为这个组分配角色

添加一个 user1 用户,并指定 domain 为 “demo”

为这个用户分配组

e. 编辑应用的授权

在应用管理列表中点击 demo 的授权该应用只有一个访问地址,选择后点击授权,在弹出的窗口下拉框中选择"demoUserRole"

f. 使用刚创建的普通用户账号登录 /portal

应用列表中显示出我们刚刚部署的demo 应用 

点击应用图标后,跳转到应用的页面

该demo应用只是简单的一些页面Tab, 展示的也只是一些测试数据

5. 后续改进

目前部署的应用有新版本需要升级时,需要在应用管理中删除应用后,重新上传。后续将继续优化门户管理模块,提供应用的版本管理及回滚功能。

6. 参考

a. 使用到的API

API Gateway: 用户/组/权限的增删改查,api group 创建,oas3.0 格式文档导入,应用部署接口
doc/swagger/helper_api_gateway.yaml · OpenNJet/OpenNJet - Gitee.com
动态Location API: 动态添加及删除Location
doc/swagger/helper_dy_loc.yaml · OpenNJet/OpenNJet - Gitee.com
动态Upstream API: 动态添加及删除 Upsteam
doc/swagger/helper_dyn_http_ups.yaml · OpenNJet/OpenNJet - Gitee.com\

b. Demo 应用包的下载

地址: ftp.tmlake.com \
目录: /OpenNjet/Software/v3.2.2-portal
文件: demo_app_1.0.2.npk

c. NJet版本及Portal 获取及安装

NJet 版本需要 > 3.2.2
Portal 门户管理模块获取:
地址: ftp.tmlake.com

目录: /OpenNjet/Software/v3.2.2-portal/
文件: portal_1.0.2.npk , ssh_remote_mod.so
Portal 门户管理模块安装:
修改配置 /usr/local/njet/conf/njet.conf

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_agent_dynlog_module.so;  
load_module modules/njt_dyn_ssl_module.so;
load_module modules/njt_http_vtsc_module.so;
load_module modules/njt_http_location_module.so;
load_module modules/njt_http_lua_module.so;
load_module modules/njt_http_dyn_upstream_module.so;
load_module modules/njt_http_dyn_server_module.so;  
load_module modules/njt_http_token_sync_module.so;
load_module modules/njt_http_upstream_member_module.so;
load_module modules/njt_http_dyn_lua_module.so;events {worker_connections  1024;
}shared_slab_pool_size  100m;   
http {token_sync zone=token:4M sync_time=5s clean_time=10s;dyn_kv_conf conf/iot-work.conf;include mime.types;access_log off;vhost_traffic_status_zone;lua_package_path "$prefix/lualib/lib/?.lua;$prefix/modules/?.lua;$prefix/apps/?.lua;;";lua_package_cpath "$prefix/lualib/clib/?.so;;";init_by_lua_block {local _=require("lor.index")local _=require("lsqlite3complete")}server {listen       8080;error_page 401 =302 /portal;client_max_body_size 1000m; location / {root html;}location /icons/ {alias /usr/local/njet/apps/__icons/;try_files $uri =404;}}
}
load_module modules/njt_http_sendmsg_module.so;
load_module modules/njt_ctrl_config_api_module.so; 
load_module modules/njt_helper_health_check_module.so;
load_module modules/njt_http_upstream_api_module.so; 
load_module modules/njt_http_location_api_module.so;
load_module modules/njt_doc_module.so;
load_module modules/njt_http_vtsd_module.so;
load_module modules/njt_http_lua_module.so;
load_module modules/njt_http_dyn_upstream_module.so;
load_module modules/njt_http_dyn_upstream_api_module.so;
load_module modules/njt_http_dyn_server_api_module.so; 
load_module modules/njt_http_upload_module.so;error_log logs/error_ctrl.log error;events {worker_connections  1024;
}http {dyn_kv_conf conf/ctrl_kv.conf;lua_package_path "$prefix/lualib/lib/?.lua;$prefix/modules/?.lua;;";lua_package_cpath "$prefix/lualib/clib/?.so;;";init_by_lua_block {local _=require("lor.index")local _=require("lsqlite3complete")}include mime.types;access_log off;server {client_max_body_size 1000m;  listen       8081;location / {return 200 "njet control panel\n";}location /api {dyn_module_api;  }location /doc {doc_api;}location /metrics {vhost_traffic_status_display;vhost_traffic_status_display_format html;}location /api_gateway {access_by_lua_block {local ac=require("api_gateway.access.control")local access=ac.new("/api_gateway")access:check()}content_by_lua_block {local api_gateway=require("api_gateway")api_gateway.main()}}}
}

拷贝 ssh_remote_mod.so

sudo cp ssh_remote_mod.so /usr/local/njet/lualib/clib/

重启 njet

sudo systemctl stop njet
sudo systemctl start njet     

将下载后的 portal_1.0.2.npk 文件上传到 njet 主机上,并且主机上安装 curl 及 jq 命令行工具

NJET_SITE="http://localhost:8081"PORTAL_FILE=$(curl -k -s -F "file=@portal_1.0.2.npk"  "$NJET_SITE/api/v1/upload" |jq -r '.file')TOKEN=$(curl -k -X POST -d '{"login_data":{"username": "agw_admin", "password": "********"}}' -s "$NJET_SITE/api_gateway/auth/login" | jq -r '.token')curl -X 'POST' \"$NJET_SITE/api_gateway/deploy/app" \-H "Authorization: Bearer $TOKEN" \-H "Content-Type: application/json" \-d "{\"uploaded_file\": \"$PORTAL_FILE\"}"

NJet 应用引擎通过内核重构实现了独特的运行时动态配置加载能力,是 新一代高性能 Web 应用引擎 。NJet 拥有高性能数据面处理能力,将集群、高可用、主动健康检查、声明式 API 等多种辅助功能,通过 NJet 独特的副驾驶 CoPilot 服务框架调度,从而方便功能扩展,隔离管理 / 控制功能对数据面的影响,NJet 应用引擎性能超过 CNCF 推荐 Envoy 应用引擎的三倍。 

官网:https://njet.org.cn/ 

邮件组:https://njet.org.cn/mailman/listinfo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909510.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909510.shtml
英文地址,请注明出处:http://en.pswp.cn/news/909510.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app学习笔记三十六--分段式选项卡组件的使用

先来看效果: 上图有3个选项卡(PS:uniapp官方称之为分段器,我还是习惯叫选项卡),需要实现点击不同的选项卡时下方切换显示对应的数据。 下面介绍下实现的过程。 1.在uniapp官方文档下载并安装该扩展组件:u…

Qt:Qt桌面程序正常退出注意事项

一般情况下,Qt窗体的创建和显示命令如下: Main_window main_window; main_window.show(); 主窗体中设置属性Qt::WA_DeleteOnClose setAttribute(Qt::WA_DeleteOnClose); 则在main.cpp中可以将窗体创建为指针,这样在退出时可以正确释放指针…

【arXiv2024】时间序列|TimesFM-ICF:即插即用!时间序列预测新王者!吊打微调!

论文地址:https://arxiv.org/pdf/2410.24087 代码地址:https://github.com/uctb/TSFM 为了更好地理解时间序列模型的理论与实现,推荐参考UP “ThePPP时间序列” 的教学视频。该系列内容系统介绍了时间序列相关知识,并提供配套的论…

从0开始学习语言模型--Day02-如何最大化利用硬件

如何利用硬件 这个单元分为内核、并行处理和推理。 内核(Kernels) 我们说的内核一般指的就是GPU,这是我们用于计算的地方,一般说的计算资源就指的是GPU的大小。我们模型所用的数据和参数一般存储在内存里,假设把内存…

ElasticSearch配置详解:设置内存锁定的好处

什么是内存锁定 "bootstrap": {"memory_lock": "true" }内存锁定是指将Elasticsearch的JVM堆内存锁定在物理内存中,防止操作系统将其交换(swap)到磁盘。 内存交换是操作系统的虚拟内存管理机制,当…

成功解决 ValueError: Unable to find resource t64.exe in package pip._vendor.distlib

解决问题 我们在本地的命令行中运行指令"python -m pip install --upgrade pip"的时候,报了如下的错误: 解决思路 我们需要重新安装一下pip。 解决方法 步骤1: 通过执行下面的指令删除本地的pip: python -m pip uninstall pip…

仓库物资出入库管理系统源码+uniapp小程序

一款基于ThinkPHPuniapp开发的仓库物资出入库管理系统,适用于单位内部物资采购、发放管理的库存管理系统。提供全部无加密源码,支持私有化部署。 更新日志: 新增 基于UNIAPP开发的手机端,适配微信小程序 新增 字典管理 新增页面…

基于机器学习的逐巷充填开采岩层运动地表沉降预测

基于机器学习的逐巷充填开采岩层运动地表沉降预测 1. 项目概述 本报告详细介绍了使用Python和机器学习技术预测逐巷充填开采过程中地表沉降的方法。通过分析地质参数、开采参数和充填参数,构建预测模型评估地表沉降风险。 # 导入必要的库 import numpy as np import pandas…

MotleyCrew ——抛弃dify、coze,手动搭建多agent工作流

1. MotleyCrew 核心组件 - 协调器: Crew MotleyCrew 的核心是一个 “Crew” 对象,即多代理系统的指挥者。Crew 持有一个全局的知识图谱(使用 Kuzu 图数据库),用于记录所有任务、任务单元和其执行状态。 Cr…

掌握这些 Python 函数,让你的代码更简洁优雅

在 Python 编程世界里,代码的简洁性与可读性至关重要。简洁优雅的代码不仅便于自己后期维护,也能让其他开发者快速理解逻辑。而 Python 丰富的内置函数和一些实用的第三方库函数,就是实现这一目标的有力武器。接下来,就为大家介绍…

简说ping、telnet、netcat

简说 ping 和 telnet 命令的作用、用法和区别,方便理解它们在网络诊断中的用途。 🌐 ping 命令 ✅ 作用: ping 用于检测网络连通性。它通过向目标主机发送 ICMP Echo 请求 并等待回应,从而判断目标主机是否可达,并测…

基于STM32的超声波模拟雷达设计

一、雷达概述 雷达(Radio Detection and Ranging,无线电探测与测距)是一种利用电磁波探测目标位置、速度等信息的主动式传感器系统。其基本原理是发射电磁波并接收目标反射的回波,通过分析回波的时间差、频率变化等参数&#xff0…

飞书多维表格利用 Amazon Bedrock AI 能力赋能业务

背景 飞书多维表格是一款功能强大的在线数据管理与协作工具。它打破传统表格局限,将电子表格与数据库特性融合,支持看板、甘特图、表单等多种视图自由切换,可根据项目进度、任务管理等不同场景灵活展示数据。其丰富的字段类型能精准适配各类…

表格对比工具推荐,快速比对Excel文件

软件介绍 今天为大家推荐一款专为Excel用户设计的表格比较工具,简单易用,零基础也能快速掌握。 轻量高效的办公助手 Excel比较工具体积仅为11MB,占用空间小,运行流畅,适合各类电脑配置使用。 简洁明了的操作界面 软…

深入探究其内存开销与JVM布局——Java Record

Java 14引入的Record类型如同一股清流,旨在简化不可变数据载体的定义。它的核心承诺是:​​透明的数据建模​​和​​简洁的语法​​。自动生成的equals(), hashCode(), toString()以及构造器极大地提升了开发效率。 当我们看到这样的代码: …

Vue 3 九宫格抽奖系统,采用优雅的 UI 设计和流畅的动画效果

九宫格抽奖 预览地址 项目简介 这是一个基于 Vue 3 开发的现代化九宫格抽奖系统,采用优雅的 UI 设计和流畅的动画效果,为用户提供极致的抽奖体验。系统支持多种奖品配置,实时抽奖记录展示,以及完整的活动说明功能。 核心功能 …

无缝对接大疆算力平台:基于Coovally的无人机AI模型端到端优化方案

【导读】 随着无人机应用场景的快速拓展,企业对于定制化AI解决方案的需求日益迫切。大疆算力开放平台为开发者提供了专业的模型量化与部署环境,帮助开发者将训练好的AI模型高效部署至大疆无人机平台。 然而,要实现完整的AI开发闭环&#xf…

ubuntu下载CUDA cuDNN

nivida-smi查看显卡驱动版本 (一)安装CUDA cuda官网 cuda官网 下载对应版本的cuda 这个官网真不错啊,下面附上了指令 wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-ubuntu2404.pin sudo mv c…

FreeRTOS定时器

目录 1.特性2.运行环境2.1 守护任务2.2 回调函数2.3 内部源码 3.和Linux对比4.ID5.数据传输6.操作函数6.1 创建6.2 删除6.3 启动6.4 停止6.5 复位(重置)6.6 修改周期6.7 注意事项 7.示例:一般使用8.示例:定时器防抖 1.特性 定时器…

JavaScript中的迭代器模式:优雅遍历数据的“设计之道”

JavaScript中的迭代器模式:优雅遍历数据的“设计之道” 一、什么是迭代器模式? 在编程世界中,迭代器模式(Iterator Pattern)是一种经典的设计模式,它的核心思想是:为集合对象提供一种统一的访…