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]࿰…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...