CoPilot 产品体验:提升 OpenNJet 的控制管理和服务提供能力

文章目录
- 前言
- 系统架构介绍
- CoPilot 配置
- CoPilot 插件规范
- 体验 CoPilot 实例
- CoPilot: Broker 实例
- CoPilot: Ctrl 实例
- 开发其他语言编写的 CoPilot
- 目标
- 主要思路
- 具体实现
- 执行 go 程序代码
- 功能扩展
- 总结
前言
CoPilot 是 OpenNJet 的一个重要组成部分,它在 Master-Workers 进程架构的基础上进行了扩展,提升了 OpenNJet 的控制管理和提供服务的能力。通过 CoPilot,可以实现诸如运行 Controller、作为消息中间件的 Broker 等多种功能,极大地扩展了 OpenNJet 的应用范围和灵活性。
系统架构介绍
OpenNJet 最早是基于 NGINX1.19 基础,fork 并独立演进的开源应用引擎,并随着 NGINX 版本迭代,吸收上游 NGINX 的更新,已经同步更新到 NGINX1.23.1 版本。OpenNJet 的目标在于适应国内特定的技术规范及标准,如国密算法套件支持,并构建安全可控的云原生数据面,支撑我国云原生产业生态。作为底层引擎,OpenNJet 利用动态加载机制可以实现不同的产品形态,如 API 网关、消息代理、出入向代理,负载均衡,WAF等等。

相比市面其他类型的API网关,高性能是NGINX主要的优点,但动态配置能力的缺乏一直受到业界的诟病。OpenNJet在NGINX的架构上进行了扩充,对其框架进行了改写,增加了 C 及可持久化的动态存储能力,解决了指令配置变更动态生效的关键问题,扩展了OpenNJet的应用场景。
CoPilot 配置
在配置项目之前,首先需要将项目下载到本地。在终端执行如下命令:
git clone git@github.com:OpenNJet/OpenNJet.git
运行如下图:

CoPilot 的配置十分简单,只需在主配置文件中使用 helper 指令即可完成。这种简洁的配置方式使用户能够快速地部署和管理 CoPilot 插件,提高了系统的可维护性和易用性。
helper ctrl modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf;
helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
以上示例配置了一个 Controller 和一个 Broker,分别运行在不同的 CoPilot 进程中。配置文件的路径可以根据实际情况进行调整,使其符合用户的需求。
CoPilot 插件规范
CoPilot 插件是以动态链接库(so文件)的形式存在的,用户需要按照规范实现一系列接口以确保插件的正确运行。
插件接口
njt_helper_check_version(): 检查插件的版本号,确保与CoPilot的兼容性。njt_helper_run(helper_param param): 插件的主函数,负责处理命令和执行相应的操作。njt_helper_ignore_reload(): 指定插件在重新加载配置时是否重启。
体验 CoPilot 实例
CoPilot: Broker 实例
功能介绍
Broker 是一个 CoPilot 插件,提供消息服务端功能,使用 mqtt 协议进行通信。
配置示例
helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
CoPilot: Ctrl 实例
功能介绍
Ctrl 是一个 CoPilot 插件,提供了强大的控制能力,可以作为 OpenNJet 的控制平面,用于管理和监控系统的运行状态。
配置示例
helper ctrl modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf;
开发其他语言编写的 CoPilot
目标
为了方便其他语言实现的独立功能向 CoPilot 迁移,提供了 Go 语言实现的 CoPilot POC。这个实现可以启动和停止一个简单的 Web 服务器。
主要思路
参考现有的模块,用C语言实现一个新的Helper模块,在初始化阶段调用Go程序启动Web服务器,并等待接收命令进行操作。
具体实现
通过调用Go程序启动Web服务器,并在Helper模块中监控命令,进行相应的操作。以下是一个简化的示例代码:
#include <stdio.h>
#include "njt_helper.h"unsigned int njt_helper_check_version(void) {return NJT_HELPER_VER;
}void njt_helper_run(helper_param param) {// 在事件循环中处理命令unsigned int cmd;while (1) {cmd = param.check_cmd_fp(param.ctx);switch (cmd) {case NJT_HELPER_CMD_STOP:// 执行停止操作break;case NJT_HELPER_CMD_RESTART:// 执行重新启动操作break;default:// 处理其他命令break;}}
}unsigned int njt_helper_ignore_reload(void) {return 1; // 在重新加载配置时不重启
}
这段示例代码是一个简单的 CoPilot 插件,用于启动和停止一个 Web 服务器。让我们逐行解释和扩展这段代码:
#include <stdio.h>:包含标准输入输出头文件,用于后续的输出和调试。#include "njt_helper.h":包含CoPilot插件的头文件,其中定义了接口函数和常量。unsigned int njt_helper_check_version(void):这个函数是一个接口函数,用于检查插件的版本号。在实际开发中,可以在这里检查插件的版本号,确保与CoPilot的兼容性。void njt_helper_run(helper_param param):这个函数是插件的主函数,负责处理命令和执行相应的操作。在这里,通过一个无限循环来不断检查命令,并根据不同的命令执行相应的操作。unsigned int njt_helper_ignore_reload(void):这个函数指定插件在重新加载配置时是否重启。在这个示例中,返回值为1,表示在重新加载配置时不重启。
对于这段示例代码的扩展,可以从以下几个方面入手:
- 具体操作的实现:在
njt_helper_run函数中,可以扩展具体的操作实现。比如,在NJT_HELPER_CMD_STOP对应的分支中实现停止Web服务器的操作,在NJT_HELPER_CMD_RESTART对应的分支中实现重新启动Web服务器的操作。 - 命令处理的优化:可以考虑优化命令处理逻辑,使得代码更加健壮和高效。例如,可以引入状态机来管理命令的处理流程,或者使用事件驱动的方式来处理命令。
- 错误处理和日志记录:可以添加错误处理和日志记录功能,以便及时发现和解决问题。可以在适当的位置添加错误检查和日志输出语句,帮助定位问题并进行排查。
- 参数配置和灵活性:可以考虑添加参数配置功能,使得插件的行为可以根据配置文件进行调整。可以定义一些参数,并提供相应的接口函数来读取和设置这些参数,以实现插件的灵活性和可配置性。
- 性能优化和资源管理:可以进行性能优化和资源管理,提高插件的运行效率和资源利用率。可以考虑采用异步IO、线程池等技术来提高性能,或者实现资源的自动回收和释放功能,避免资源泄露和内存溢出问题。
通过对示例代码的解释和扩展,可以更好地理解CoPilot插件的开发和运行原理,从而为实际项目的开发和部署提供参考和指导。
执行 go 程序代码
为了展示如何在 Go 语言中实现 CoPilot 插件,要先启动一个 Web 服务器,用于接收到特定命令时
停止服务器。并在checkCommand函数中模拟了检查命令的操作。然后,在一个无限循环中不断地检查命令,并根据不同的命令执行相应的操作。
执行代码如下:
package mainimport ("fmt""net/http"
)// CoPilot插件的主函数,负责处理命令和执行相应的操作
func main() {// 在初始化阶段启动Web服务器go startServer()// 监听命令,并根据不同的命令执行相应的操作for {// 检查命令cmd := checkCommand()// 根据不同的命令执行相应的操作switch cmd {case "stop":stopServer()fmt.Println("Web服务器已停止")default:fmt.Println("未知命令:", cmd)}}
}// 启动Web服务器
func startServer() {http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, World!")})fmt.Println("Web服务器已启动")http.ListenAndServe(":8080", nil)
}// 停止Web服务器
func stopServer() {// 实现停止Web服务器的操作// 这里省略具体实现,可以根据实际需求来编写
}// 检查命令
func checkCommand() string {// 实现检查命令的操作// 这里省略具体实现,可以根据实际需求来编写return "stop" // 这里只是一个示例,实际可以根据情况返回不同的命令
}
在这个示例中,我们只实现了停止 Web 服务器的操作,实际中还可以根据需要扩展其他操作。
功能扩展
CoPilot 的功能扩展并不仅限于运行 Controller 和 Broker,这只是两种典型的用法。只要遵守了 CoPilot 插件开发规范,用户可以根据自己的需求开发各种自定义的功能,并且在 OpenNJet 的基础上运行,从而实现更多样化的服务。
Master 进程负责创建和管理 CoPilot 进程,保证其正常运行。在 OpenNJet 的生命周期中,Master 进程会监控 CoPilot 进程的状态,并在需要时启动、停止或重新加载。这种自动化的进程管理保证了 OpenNJet 系统的稳定性和可靠性。
总结
本文对 CoPilot 作为 OpenNJet 重要组成部分的详细介绍,让读者了解了其架构、功能、配置方法以及开发实例。希望通过阅读文章,读者能对 CoPilot 有更深入的了解,并且对其在 OpenNJet 中的作用和优势有了清晰的认识。我相信,CoPilot 的引入将极大地提升 OpenNJet 的控制管理和服务提供能力,为用户提供更加灵活和强大的解决方案。
相关文章:
CoPilot 产品体验:提升 OpenNJet 的控制管理和服务提供能力
文章目录 前言系统架构介绍CoPilot 配置CoPilot 插件规范 体验 CoPilot 实例CoPilot: Broker 实例CoPilot: Ctrl 实例 开发其他语言编写的 CoPilot目标主要思路具体实现执行 go 程序代码 功能扩展总结 前言 CoPilot 是 OpenNJet 的一个重要组成部分,它在 Master-Wo…...
Leetcode 第396场周赛 问题和解法
问题 有效单词 有效单词需要满足以下几个条件: 至少包含3个字符。 由数字0-9和英文大小写字母组成。(不必包含所有这类字符。) 至少包含一个元音字母。 至少包含一个辅音字母。 给你一个字符串word。如果word是一个有效单词,则…...
OC foudation框架(上)学习
foundation框架 文章目录 foundation框架字符串(NSString && NSMutableString)NSString的其他功能NSMutableString 日期与时间 (NSDate)2.1 日期与时间(NSDate)2.2日期格式器日历与日期组件定时器&…...
【机器学习300问】83、深度学习模型在进行学习时梯度下降算法会面临哪些局部最优问题?
梯度下降算法是一种常用的优化方法,用于最小化损失函数以训练模型。然而,在使用梯度下降算法时,可能会面临以下局部最优问题。 (一)非凸函数的局部极小值 问题描述:在复杂的损失函数中,如果目…...
基于springboot的校园管理系统源码数据库
基于springboot的校园管理系统源码数据库 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,校园管理系统当然也不能排除在外。校园管理系统是以实际运用为开发背景,…...
图形网络的自适应扩散 笔记
1 Title Adaptive Diffusion in Graph Neural Networks(Jialin Zhao、Yuxiao Dong、Ming Ding、Evgeny Kharlamov、Jie Tang)【NIPS 2021】 2 Conclusion The neighborhood size in GDC is manually tuned for each graph by conductin…...
vue基础配置
vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from "path"; //引入svg需要用到的插件 import { createSvgIconsPlugin } from vite-plugin-svg-icons //mock插件提供方法 import { viteMockServe } from vite-…...
C++基础中的存储类别
存储的类别是变量的属性之一,C语言定义了4种变量的存储类别,分别是auto变量、static变量、register变量和extern变量。以下重点介绍这几种类型。 一、auto变量 auto变量是C默认的存储类型。函数内未加存储类型说明的变量均被称为自动变量,即…...
【NPM】Nginx Proxy Manager 一键申请 SSL 证书,自动续期,解决阿里云SSL免费证书每3个月失效问题
文章目录 1、NPM 简介2、实战Step 1:环境搭建 也可以看作者安装笔记 Step 2:创建容器 2.1 在系统任意位置创建一个文件夹,此文档以~/nginx-proxy-manager为例。2.2 创建docker-compose.yaml2.3 启动NPM服务 Step 3:配置反向代理3…...
教你解决PUBG绝地求生游戏中闪退掉线无法重连回去的问题
《绝地求生》(PUBG),作为一款在全球范围内掀起热潮的战术竞技游戏,以其栩栩如生的战场环境和令人心跳加速的生存冒险博得了广大玩家的青睐。然而,一些玩家在经历了一场惊心动魄的对局后,却面临了一个不大不…...
24 Debian如何配置Apache2(4)LAMP+phpMyAdmin部署
作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何配置Apache2(4)LAMP+phpMyAdmin部署 《傅老师Debian小知识库系列之24》——原创 ==前言== 傅老师Debian小知识库特点: 1、最小化拆解Debian实用技能; 2、所有操作在VM虚拟机实测完成;…...
centos安装paddlespeech各种报错解决方案
背景 windows系统安装paddlespeech一路顺利 centos安装之前也是正常 今天centos再次安装各种报错,避免以后遇到浪费时间,记录下来,也给大家节约时间 报错 报错1 module numpy has no attribute complex. 解决方案 降低numpy # 1. 卸载当前numpy库 pip uninstall numpy…...
谈基于ATTCK框架的攻击链溯源
引言 网络安全在当今数字化时代变得尤为关键,而MITRE公司开发的ATT&CK框架则成为了安全专业人员的重要工具。ATT&CK是一种广泛使用的攻击行为分类和描述框架。其目的在于提供一个共同的语言,使安全专业人员能够更好地理解攻击者的行为和目标&…...
在Ubuntu下搭建自己的以太坊私有链
最近要对链及链上应用进行压测,为了方便操作及分析问题,就自己搭建了一个eth私链。当前版本安装官方指引发现有卡点,于是决定整理一个文档,为其他有需要的朋友提供便捷操作,节约时间。 一、环境配置 linux操作系统:Ubuntu 20.04.6 LTS (Focal Fossa) go version: go1…...
巩固学习4
python中函数逆置的几种方法 s input()for i in range(len(s)-1,-1,-1):#从最后一位开始,步长为-1print(s[i],end)用for语句循环逆置 s input() s list(s) n len(s) for i in range(n//2):s[i],s[n-1-i] s[n-1-i],s[i]#从中间反转字符串 res "".j…...
Conda安装rasterio报错
Conda安装rasterio报错 文章目录 Conda安装rasterio报错问题解决参考 问题 在conda环境中安装rasterio包之后,本来可以正常运行的,但是之后又重新安装了一个gdal,导致原来的引用rasterio的包的程序不可正常运行了 conda install rasterio c…...
linux安装 mysql
环境:centOS8 一、安装 1 安装wget库 sudo yum -y install wget 2. 安装 mysql 换yum源 亲测成功!!!!!! 换yum源 1.下载对应版本的repo文件 wget -O CentOS-Base.repo http://mirrors…...
暴力法解决最近对问题和凸包问题-实现可视化
目录 最近对问题 凸包问题 最近对问题 顾名思义就是采用蛮力法求出所有点之间的距离,然后进行比较找出第一个最近对,一个一个进行比较。 大概思路就是如图(每个圈代表一个数对) 第一个和其他四个比较 第二个和其他三个比较 …...
[Kubernetes] Rancher 2.7.5 部署 k8s
server: 192.168.66.100 master: 192.168.66.101 node1: 192.168.66.102 文章目录 1.rancher server 安装docker2.部署k8s3.kubeconfig4.测试集群 1.rancher server 安装docker 所有主机开通ipv4 vi /etc/sysctl.conf#加入 net.ipv4.ip_forward 1#配置生效 sysctl -prancher…...
码题杯 世界警察 思想:双指针
https://www.matiji.net/exam/brushquestion/4/4446/16A92C42378232DEB56179D9C70DC45C 双指针 思路是这样的,首先r指针向右走,如果r指针遇到了和l指针一样的,那么l指针就,一直加到r指针的位置,此时a[l]a[r]࿰…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
Java中栈的多种实现类详解
Java中栈的多种实现类详解:Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...
AWS vs 阿里云:功能、服务与性能对比指南
在云计算领域,Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商,各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5],我将从功能、服务和性能三个方面进行结构化对比分析&#…...
