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

news2024/11/25 7:03:26

在这里插入图片描述

文章目录

    • 前言
    • 系统架构介绍
    • 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 main

import (
    "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://www.coloradmin.cn/o/1649051.html

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

相关文章

【QA】Java常见运算符

前言 本文主要讲述Java常见的运算符 运算符的概念 两个基本概念&#xff1a; 运算符&#xff1a;对字面量或者变量进行操作的符号 表达式&#xff1a;用运算符把字面量或者变量连接起来符合java语法的式子就可以称为表达式 示例&#xff1a; int a 10; int b 20; int …

【一看就懂】UART、IIC、SPI、CAN四种通讯协议对比介绍

UART、IIC、SPI、CAN四种通信协议对比 通信方式传输线通讯方式标准传输速度使用场景UARTTX(发送数据线)、RX(接收数据线)串行、异步、全双工115.2 kbit/s(常用)计算机和外部设备通信&#xff08;打印机&#xff09;IICSCL(时钟线)、SDA(数据线)串行、同步、半双工100 kbit/s(标…

HNU-人工智能-实验4-基于Resnet的分类器

前言 本实验是自选实验&#xff0c;可以在给定范围内选择。 我刚刚提交了实验报告&#xff0c;暂时不准备放出我自己的实验报告&#xff0c;大概在截止提交之后我再放。 之所以这么着急写blog&#xff0c;是想便利还没做实验的同学。 如果选择的也是这个“毒蘑菇识别”的分类器…

安卓手机录屏在哪里?教给你3种方法

随着智能手机的普及&#xff0c;录屏功能在日常生活和工作中的需求日益增加。那么安卓手机录屏功能在哪里&#xff1f; 本文将详细介绍3个安卓手机的录屏方法&#xff0c;并分享一些实用技巧&#xff0c;帮助您更好地利用这一功能。 方法一&#xff1a;使用安卓手机自带的录屏…

武汉星起航:自运营团队—亚马逊平台运营典范,优势凸显业绩斐然

武汉星起航电子商务有限公司&#xff0c;作为跨境电商领域的佼佼者&#xff0c;凭借自运营团队多年的深耕经验与对亚马逊市场规则的深刻理解&#xff0c;成功在亚马逊平台开设多家自营店铺&#xff0c;并取得显著成绩。公司月流水达到几百万的辉煌业绩&#xff0c;不仅彰显了其…

基于 OpenHarmony compress 三方件使用指南~

关于 提供了一个轻量级的图像压缩库。将允许您将大照片压缩成小 尺寸的照片&#xff0c;图像质量损失或可以忽略不计 compress 的依赖添加 为你的应用添加 compress-debug.har。将 compress-debug.har 复制到 entry\libs 目录下即可&#xff08;由于 build.gradle 中已经依赖…

笔记---DFS,深度优先搜索

深度优先搜索乃是注重深度&#xff0c;会把一条路径优先全部搜完然后再去回溯&#xff0c;再去搜其他路径 连通性模型 与BFS中的Flood Fill相似 AcWing.1112.迷宫 一天Extense在森林里探险的时候不小心走入了一个迷宫&#xff0c;迷宫可以看成是由 n∗n 的格点组成&#xff…

Java:内存模型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、Java内存模型出现的背景 二、什么是Java内存模型 三、Java内存模型的底层实现 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一…

基于C语言的贪吃蛇小游戏(简易版)

这篇博客会是对学习C语言成果的检测&#xff0c;为了实现贪吃蛇小游戏&#xff0c;我们用到的“工具”有&#xff1a;C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。 目录 1.简易版游戏效果 1.1欢迎界面 1.2游戏规则提示页面 1.3游戏进行页面 …

STM32F407VET6 学习笔记1:GPIO引脚认识分类与开发板原理图

今日学习STM32F407VET6 &#xff0c;首先从基本原理图、引脚方面开始做个初步理解并整理&#xff1a; 这里使用的学习开发板是在嘉立创购买的 立创梁山派天空星&#xff0c;芯片是 STM32F407VET6 主要对这个芯片的引脚做一些归纳认识、对开发学习板原理图设计进行认识理解:最…

恭喜发财!东方第一 MEME 拥抱符文

第 431 号符文 HOPE•YOU•GET•RICH &#x1f9e7;&#xff0c;是 Omnity 首个支持的跨链 Runes 资产&#xff0c;也是TG群里红包小程序支持的第一个 Runes 资产。 大家可以在 Omnity 的 TG 群和 RunesCC 的 TG 群里&#xff0c;不定时的抢到符文红包。 Omnity TG&#xff1a;…

智慧监测IN!计讯物联筑牢高速滑坡预警“安全锁”

在现代社会&#xff0c;高速公路以其高速、便捷的特性&#xff0c;早已成为连接城市与地区之间的重要纽带&#xff0c;承载着日益增长的车流和人流。然而&#xff0c;随着车流量的激增&#xff0c;高速公路面临的运营压力和安全挑战也随之加大&#xff0c;其中滑坡风险尤为突出…

ArrayList线程安全问题解决方案

jdk8 Stream API的出现大大简化了我们对于集合元素的处理代码&#xff0c;对于串行流来说&#xff0c;无需考虑线程安全问题&#xff1b;但是&#xff0c;对于并行流来说&#xff0c;由于它是以多线程的方式并行处理同一个集合中的数据元素的&#xff0c;因此&#xff0c;存在着…

智慧交通系统:未来出行,从这里开始

随着城市化进程的加快&#xff0c;交通拥堵、事故频发、停车难等问题日益凸显&#xff0c;传统交通管理模式已难以满足现代社会的需求。智慧交通系统作为解决这些问题的关键&#xff0c;通过集成创新技术&#xff0c;实现交通管理的智能化、信息化&#xff0c;提高交通系统的运…

Unity射击游戏开发教程:(10)创建主界面

主界面开发 玩游戏时,主菜单是事后才想到要做的。实际上几乎每个游戏都有一个主界面。如果你点击打开游戏并立即开始游戏,你会感到非常惊讶。本文将讨论如何创建带有启动新游戏的交互式按钮的主界面/主菜单。 主菜单将是一个全新的场景。我们将添加一个 UI 图像元素,并在图像…

洗地机什么牌子最好?618高性价比家用洗地机品牌

随着科技的发展&#xff0c;智能智能清洁家电越来越受到消费者的欢迎。洗地机作为其中的佼佼者&#xff0c;已经成为许多家庭清洁的好帮手。然而&#xff0c;面对满目琳琅的洗地机品牌型号&#xff0c;究竟哪一款机型适合家用呢&#xff0c;正好618也临近了&#xff0c;又有哪些…

C++笔记之调用PCL库显示PCD文件的点云

C++笔记之调用PCL库显示PCD文件的点云 —— 2024-05-05 杭州 code review! 文章目录 C++笔记之调用PCL库显示PCD文件的点云1.运行2.点云pcd文件github下载地址2.main.cpp3.CMakeLists.txt1.运行 2.点云pcd文件github下载地址 https://github.com/luolaihua/point-cloud-data-…

5.7代码

1.环境治理 分析&#xff1a;最开始进入了一个误区&#xff0c;觉得都有通路了直接算通路就可以&#xff0c;后来才发现居然是最小路径的总和&#xff0c;所以大概是每减一次都要算一次各点之间的最小路径了&#xff0c;然后是循环&#xff0c;到需要的条件为止 总的来说思路不…

通过颜色学习css

文章目录 1.生成html2.添加css链接3.将h1标签text-align元素4.添加div标签4.1、为类marker添加元素4.2、添加两个新的div标签4.3、修改div标签的类型并修改css元素4.4、为类container添加元素4.5、以数字形式添加颜色4.5、container添加padding属性4.6、组合css中的颜色属性4.7…

SG-8018CE晶体振荡器可编程规格书

SG-8018CE系列晶体振荡器是一个高性能、多功能且具有高度集成性的解决方案&#xff0c;它满足了现代电子系统的严格要求。其广泛的频率范围0.67 MHz到170 MHz&#xff0c;且频率调节精度达到1ppm&#xff0c;1.62 V至3.63V的宽广电源电压&#xff0c;使能&#xff08;OE&#x…