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,表示在重新加载配置时不重启。

对于这段示例代码的扩展,可以从以下几个方面入手:

  1. 具体操作的实现:在 njt_helper_run 函数中,可以扩展具体的操作实现。比如,在 NJT_HELPER_CMD_STOP 对应的分支中实现停止Web服务器的操作,在 NJT_HELPER_CMD_RESTART 对应的分支中实现重新启动Web服务器的操作。
  2. 命令处理的优化:可以考虑优化命令处理逻辑,使得代码更加健壮和高效。例如,可以引入状态机来管理命令的处理流程,或者使用事件驱动的方式来处理命令。
  3. 错误处理和日志记录:可以添加错误处理和日志记录功能,以便及时发现和解决问题。可以在适当的位置添加错误检查和日志输出语句,帮助定位问题并进行排查。
  4. 参数配置和灵活性:可以考虑添加参数配置功能,使得插件的行为可以根据配置文件进行调整。可以定义一些参数,并提供相应的接口函数来读取和设置这些参数,以实现插件的灵活性和可配置性。
  5. 性能优化和资源管理:可以进行性能优化和资源管理,提高插件的运行效率和资源利用率。可以考虑采用异步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 的控制管理和服务提供能力,为用户提供更加灵活和强大的解决方案。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习之基于Python多种混合模型的糖尿病预测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 糖尿病是一种慢性代谢性疾病&#xff0c;其发病率在全球范围内逐年上升&#xff0c;已成为影响人类健…

xmind的13个快捷方式

1.新建导图 CtrlshiftN 2.编辑文字 空格键 3.插入图片 Ctrli 4. 插入主题 Enter键 5. 插入主题之前 ShiftEnter键 6. 插入子主题 Tab键 7. 放大导图 “Ctrl”“” 8. 缩小导图 “Ctrl”“-” 9. 复制 CtrlInsert 10. 粘贴 Shift Insert 11. 剪切 ShiftDelete 12. 截图 F7 13. 保…

【论文阅读笔记】MAS-SAM: Segment Any Marine Animal with Aggregated Features

1.论文介绍 MAS-SAM: Segment Any Marine Animal with Aggregated Features MAS-SAM&#xff1a;利用聚合特征分割任何海洋动物 Paper Code(空的) 2.摘要 最近&#xff0c;分割任何模型&#xff08;SAM&#xff09;在生成高质量的对象掩模和实现零拍摄图像分割方面表现出卓越…

9.4.k8s的控制器资源(job控制器,cronjob控制器)

目录 一、job控制器 二、cronjob控制器 一、job控制器 job控制器就是一次性任务的pod控制器&#xff0c;pod完成作业后不会重启&#xff0c;其重启策略是&#xff1a;Never&#xff1b; 简单案例 启动一个pod&#xff0c;执行完成一个事件&#xff0c;然后pod关闭&#xff1b;…

基于Flask的岗位就业可视化系统(一)

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 前言 本项目综合了基本数据分析的流程&#xff0c;包括数据采集&#xff08;爬虫&#xff09;、数据清洗、数据存储、数据前后端可视化等 推荐…

(40)4.30数据结构(队列)

1.队列的基本概念 2.队列的顺序 #define MaxSize 10 #define ElemType int typedef struct { ElemType data[MaxSize]; int front, rear; }SqQueue;//1.初始化操作 void InitQueue(SqQueue& Q) { //初始化 队头&#xff0c;队尾指针指向0 Q.rear Q.fron…

单细胞|GeneTrajectory·基因轨迹

跑完了&#xff0c;记录一下&#xff0c;顺便写写我在使用中遇到的问题&#xff0c;欢迎讨论&#xff5e; 声明&#xff1a;我是用自己数据跑的&#xff0c;因为还未发表所以就还是借用官网的图啦&#xff5e; 1.准备 library(GeneTrajectory) library(Seurat) library(dply…

有哪些软件可以使用云渲染?

随着技术的发展&#xff0c;云渲染已成为动画制作人员与设计师重要的渲染助手。它可结合云端强大的计算机能力&#xff0c;帮助渲染人员高速的完成渲染任务&#xff0c;大幅度节省时间和本地计算资源。它们以用户友好的界面、强大灵活的渲染能力&#xff0c;满足了各类专业渲染…

XSS漏洞---XSS-labs通关教程

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 Level-1 过滤源码&#xff1a;无 pyload&#xff1a; name<script>alert(1)</script> Level-2 过滤源码&#xff1a;利用转译函数将特殊字符转译为实体字符 $str $_GET["…

翻译《The Old New Thing》 - Double-clicking radio buttons

Double-clicking radio buttons - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050804-10/?p34713 Raymond Chen 在 2005年08月04日 让对话框单选按钮支持双击确定 提示 本文提供了一种让对话框窗口上的控件支持双击确定窗口返回的方法 …

git-新增业务代码分支

需求 使用git作为项目管理工具管理项目&#xff0c;我需要有两个分支&#xff0c;一个分支是日常的主分支&#xff0c;会频繁的推送和修改代码并推送另外一个是新的业务代码分支&#xff0c;是一个长期开发的功能&#xff0c;同时这个业务分支需要频繁的拉取主分支的代码&#…

oracle试用期过期,解决办法

过期重置方法&#xff0c;删除注册表&#xff0c;相当于无限试用&#xff0c;缺点每30天都要重置一次 1. window r 输入 regedit 确定&#xff0c;打开注册表 2.删除下图里的两个文件夹 3.重启 plsql,登录成功

react antd table 自定义表头功能实现

react antd table 自定义表头功能 Ⅰ- 壹 - 功能展示和使用需求 需求描述 基于antd table 实现 自定义 table 的表头 内容 排序 宽度和顺序等 , 可根据自己的需求自己扩展 github:https://github.com/whqgo/ReactAntdTableCustomHeader 功能展示 Ⅱ - 贰 - 封装思路 Task…

2024年4月17日华为春招实习试题【三题】-题目+题解+在线评测,2024.4.17,华为机试

2024年4月17日华为春招实习试题【三题】-题目题解在线评测 &#x1f52e;题目一描述&#xff1a;扑克牌消消乐输入描述输出描述样例一样例二Limitation解题思路一&#xff1a;模拟&#xff0c;遇到连续3张相同牌号的卡牌&#xff0c;直接删除解题思路二&#xff1a;栈解题思路三…

软考网络工程师 第六章 第二部分 第二节 IP分片与计算

IP定义 IP报文最大65535字节&#xff0c;而以太网MTU为1500字节。 相当于货轮能载重65535&#xff0c;而火车载重1500&#xff0c;那么必须把货轮上的货物分装给多个火车运输 例题精选解析 以太网主机发送一个IP分组&#xff0c;长度3000字节&#xff0c;头长度为标准长度&a…

【北京迅为】《iTOP-3588开发板源码编译手册》-第三章 编译 Linux源码包

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

C语言 函数概述

好 接下来 我们来讲函数 构建C程序的最佳方式 就是模块化程序设计 C语言中 最基本的程序模块被称为 函数 所以 这个知识点的重要性不言而喻 这里 我们讲个故事 诸葛亮六出祁山时 为了逼司马懿出战 派人送给力司马懿一件女人衣服 司马懿只是为使者 诸葛亮的饮食起居 使者感叹…

AI论文速读 |2024[IJCAI]TrajCL: 稳健轨迹表示:通过因果学习隔离环境混杂因素

题目&#xff1a; Towards Robust Trajectory Representations: Isolating Environmental Confounders with Causal Learning 作者&#xff1a;Kang Luo, Yuanshao Zhu, Wei Chen, Kun Wang(王琨), Zhengyang Zhou(周正阳), Sijie Ruan(阮思捷), Yuxuan Liang(梁宇轩) 机构&a…

leetcode-字符串的排列-100

题目要求 思路 1.因为只涉及到字符&#xff0c;因此可以进行排序 2.创建临时字符串&#xff0c;当临时字符串temp的长度等于str的长度&#xff0c;作为判出条件。 3.创建一个标记的数组&#xff0c;每次在temp中插入一个字符&#xff0c;便在对应的数组下标设置为1&#xff0c…

国家电网某地电力公司网络硬件综合监控运维项目

国家电网某地电力公司是国家电网有限公司的子公司&#xff0c;负责当地电网规划、建设、运营和供电服务&#xff0c;下属多家地市供电企业和检修公司、信息通信公司等业务支撑实施机构。 项目现状 随着公司信息化建设加速&#xff0c;其信息内网中存在大量物理服务器、存储设备…