一文了解云原生应用引擎的领跑者:OpenNJet

news2024/10/7 16:21:33

一文了解云原生应用引擎的领跑者:OpenNJet

  • 1. 什么是应用引擎
  • 2. NGINX 架构与 NJet架构的区别
  • 3. OpenNJet 编译与安装步骤
    • 3.1 配置编译环境-CentOS 编译环境配置
    • 3.2 编译代码
  • 4. OpenNJet 的基本使用
    • 4.1 系统目录结构及功能说明
    • 4.2 基础命令
  • 5. 快速上手-如何通过 OpenNJet 部署 WEB SERVER
    • 5.1 安装 OpenNJet
    • 5.2 配置 OpenNJet
    • 5.3 部署 Web 应用程序
    • 5.4 启动 NJet
    • 5.5 访问 Web 应用程序
  • 6 快速上手-如何使用 OpenNJet 的动态配置功能
    • 6.1 直接通过 curl 的方式
    • 6.2 通过 Swagger 的进行动态配置
    • 6.3 通过 GUI 的进行动态配置
  • 7. 总结

1. 什么是应用引擎

OpenNJet 官网地址:https://njet.org.cn/
在这里插入图片描述

应用引擎,作为互联网和云原生应用的运行时服务程序,拥有多种功能特性。它具备环境感知能力,能够灵活应对不同的运行环境;同时,它也具备安全控制功能,确保应用的安全稳定运行。此外,应用引擎还能进行加速优化,提升应用的运行效率。在实际应用中,它通常表现为Web服务、流媒体服务、代理(Proxy)、应用中间件、API网关、消息队列等多种形式。

在云原生架构中,应用引擎除了提供南北向通信网关的基础功能外,还扩展了众多新特性。它支持服务网格中的东西向通信,实现透明流量劫持、熔断、遥测与故障注入等功能,这些特性使其在云原生架构中的地位和作用愈发凸显。

OpenNJet作为一款开源应用引擎,最初基于NGINX1.19版本进行fork和独立演进。随着NGINX版本的迭代更新,OpenNJet也同步更新到NGINX1.23.1版本,确保了技术的先进性和兼容性。OpenNJet的目标是适应国内特定的技术规范及标准,如支持国密算法套件,构建安全可控的云原生数据面,从而支持我国云原生产业生态的发展。作为底层引擎,OpenNJet利用动态加载机制,可以灵活实现多种产品形态,如API网关、消息代理、出入向代理、负载均衡、WAF等,满足不同的应用需求。

2. NGINX 架构与 NJet架构的区别

在这里插入图片描述
相比于市面上的其他API网关,NGINX因其卓越的高性能表现而备受赞誉。然而,它在动态配置能力方面的不足也一直是业界关注的焦点。为了解决这一问题,OpenNJet在NGINX的基础上进行了重大改进。它不仅对原有框架进行了重写,还新增了C语言支持和可持久化的动态存储能力。这些创新使得OpenNJet在指令配置变更后能够立即生效,极大地拓宽了其应用场景。

此外,随着应用引擎的普及,对可观测性的需求也日益增强。应用引擎需要持续采集性能指标、日志数据并注入跟踪信息,但这些操作往往会对性能产生一定影响。OpenNJet巧妙地利用Copilot framework,成功地将业务处理、配置变更以及指标采集隔离开来,从而消除了遥测对性能的潜在影响。

作为云原生的应用引擎,OpenNJet还积极支持业界广泛使用的Ingress及Sidecar的API规范。基于其独特的动态配置+ Copilot framework架构,OpenNJet能够通过不断更新独立的Copilot模块,迅速适应并支持各种新兴的标准规范。这一特性使得OpenNJet在云原生领域具有更强的灵活性和适应性。

3. OpenNJet 编译与安装步骤

3.1 配置编译环境-CentOS 编译环境配置

OpenNJet 支持的环境有 CentOS Linux release 7.9.2009 (Core)Ubuntu 18.04.6 LTS (Bionic Beaver)
下面以 CentOS Linux release 7.9.2009 (Core) 为例。

配置yum源:

  1. 执行以下指令:
sudo yum --enablerepo=extras install -q -y epel-release centos-release-scl-rh https://repo.ius.io/ius-release-el7.rpm
  1. 执行以下指令:
sudo curl -o /etc/yum.repos.d/mercurial.repo https://www.mercurial-scm.org/release/centos7/mercurial.repo
  1. 上面步骤完成后,文件系统的目录 /etc/yum.repos.d 将生成对应的 repo 文件
  2. 执行以下指令:
[root@CDN102 home]# ls -al /etc/yum.repos.d/mercurial.repo
  1. 执行以下指令:
-rw-r--r--. 1 root root 267 37 11:26 /etc/yum.repos.d/mercurial.repo

yum 安装软件包:

sudo yum install -y devtoolset-8-make devtoolset-8-toolchain ca-certificates mercurial zlib-devel cmake3 ninja-build libunwind-devel pcre-devel openssl-devel libtool libtool-ltdl

创建符号连接:

sudo ln -s /opt/rh/devtoolset-8/root/usr/bin/gcc /usr/local/bin/gcc
sudo ln -s /opt/rh/devtoolset-8/root/usr/bin/c++ /usr/local/bin/c++
sudo ln -s /opt/rh/devtoolset-8/root/usr/bin/cc /usr/local/bin/cc
sudo ln -s /opt/rh/devtoolset-8/root/usr/bin/make /usr/local/bin/make

3.2 编译代码

  1. OpenNJet 1.0.zip 包上传到 /home 目录下。 并解压 unzip njet1.0.zip,如图:
    在这里插入图片描述

  2. 执行 sh build_cc.sh conf
    在这里插入图片描述

  3. 执行 make
    如果 make 后,有如下提示:则继续执行 make 指令。
    在这里插入图片描述

  4. 正确编译完成:
    在这里插入图片描述

  5. 最后执行 make install

4. OpenNJet 的基本使用

4.1 系统目录结构及功能说明

  ├── build           编译rpm/deb脚本
  ├── auto            自动检测系统环境以及编译相关的脚本
  │   ├── cc          关于编译器相关的编译选项的检测脚本
  │   ├── lib         njet编译所需要的一些库的检测脚本
  │   ├── os          与平台相关的一些系统参数与系统调用相关的检测
  │   └── types       与数据类型相关的一些辅助脚本
  ├── conf            存放默认配置文件,在make install后,会拷贝到安装目录中去
  ├── contrib         存放一些实用工具,如geo配置生成工具(geo2njet.pl)
  ├── html            存放默认的网页文件,在make install后,会拷贝到安装目录中去
  ├── repos           存放yum数据源
  ├── doc             njet的api文档
  │   ├── swagger     openapi 接口网页文档
  │   ├── gui         前端展示页面文档
  │   └── manual      njet文档手册
  ├── luajit          luajit
  ├── lualib          lualib
  ├── modules         njet动态模块以及util模块
  └── src             存放njet的源代码
      ├── core        njet的核心源代码,包括常用数据结构的定义,以及njet初始化运行的核心代码如main函数
      ├── event       对系统事件处理机制的封装,以及定时器的实现相关代码
      │   └── modules 不同事件处理方式的模块化,如select、poll、epoll、kqueue等
      ├── http        njet作为http服务器相关的代码
      │   └── modules 包含http的各种功能模块
      ├── ext/lua     lua模块
      ├── mail        njet作为邮件代理服务器相关的代码
      ├── stream      tcp/  udp   四层网络代理服务器相关的代码
      ├── misc        一些辅助代码,测试c++头的兼容性,以及对google_perftools的支持
      └── os          主要是对各种不同体系统结构所提供的系统函数的封装,对外提供统一的系统调用接口

4.2 基础命令

显示帮助信息

​ njet -h

启动

​ njet -p /tmpr/njet/ -c conf/njet.conf

​ 常见启动参数:

-p 指定prefix配置文件路径,不指定,默认/etc/njet

-c 指定配置文件,不指定,默认njet.conf

-e 指定error 日志文件

测试配置信息是否有错误

​ njet -t

显示版本

​ njet -v

显示编译阶段的参数

​ njet -V

快速停止

​ njet -s stop 或者 kill -TERM {进程id}

优雅停止服务

​ njet -s quit 或者 kill -QUIT {进程id}

重新加载配置

​ njet -s reload 或者 kill -HUP {进程id}

5. 快速上手-如何通过 OpenNJet 部署 WEB SERVER

5.1 安装 OpenNJet

按照上述的安装教程安装即可

5.2 配置 OpenNJet

OpenNJet 的主要配置文件为 njet.conf。可以通过修改该文件来配置 OpenNJet。 例如,以下是一个简单的 OpenNJet配置文件示例,用于将所有请求重定向到一个 HTML 文件:

Go
http {
    server {
       listen 80;
       server_name example.com;
       location / {
           root /var/www/html;
           index index.html;
       } 
    }
}

上述配置中,我们在 HTTP 块中定义了一个名为“server”的服务器块。该服务器块监听 80 端口,并将请求的根目录设置为 /var/www/html。如果请求的路径不存在,默认会返 回 index.html 文件。

5.3 部署 Web 应用程序

在配置 NGINX之前,需要将 Web 应用程序部署到服务器上。可以将 Web 应用程序放置在服务器上的任何位置,只要在 NGINX 配置文件中正确设置 root 目录即可。

5.4 启动 NJet

在完成 OpenNJet 配置后,可以通过以下命令启动 OpenNJet:

Bash
  njet -p /tmpr/njet/ -c conf/njet.conf 
  常见启动参数:
      -p 指定 prefix 配置文件路径,不指定,默认/etc/njet 
      -c 指定配置文件,不指定,默认 njet.conf
      -e 指定 error 日志文件

5.5 访问 Web 应用程序

现在,可以使用 Web 浏览器访问 Web 应用程序。只需输入服务器的 IP 地址或域名即 可访问 Web 应用程序。如果您按照上述示例配置 OpenNJet,则应将 Web 应用程序放置在 /var/www/html 目录中,并使用服务器的 IP 地址或域名访问它。
在这里插入图片描述
总之,上述步骤为您提供了一个基本的示例,您可以根据需要进行修改和定制。在实际部署 Web 应用程序时,可能需要更复杂的 OpenNJet 配置,例如反向代理、负载平衡等。

6 快速上手-如何使用 OpenNJet 的动态配置功能

6.1 直接通过 curl 的方式

以动态黑白名单为示例,执行命令:

Plaintext
curl -X GET http://127.0.0.1:8081/config/1/config/http_dyn_bwlist

可以得到当前包括动态和静态的黑白名单配置:

JSON
{
  "servers": [
    {
     "listens": [
       "0.0.0.0:90"
     ],
     "serverNames": [
       "localhost"
     ],
     "locations": [
       {
         "location": "/"
       }, 
       {
         "location": "/test_bwlist"
       }
      ] 
     }
   ] 
}

此时 OpenNJet 中没有添加任何的黑白名单。

如果需要在某一路径下添加一个黑白名单,执行命令:

HTTP
curl -X PUT http://192.168.40.119:8081/config/1/config/http_dyn_bwlist \ -d '{
       "servers": [
         {
           "listens": [
             "0.0.0.0:90"
           ],
           "serverNames": [
             "localhost"
           ],
           "locations": [
             {
               "location": "/"
             },
             {
               "location": "/test_bwlist",
               "accessIpv4":
                      {
                      "rule": "deny",
                      "addr": "192.168.40.118",
                      "mask": "255.255.255.255"
                 }
              } 
            ]
           } 
         ]
}'

6.2 通过 Swagger 的进行动态配置

通过 swagger 的 url,http://njetaddr:8081/doc/swagger/ 进入 swagger 页面
在这里插入图片描述

以 helper 进程主动健康检查为例,按照下图示例中内容,编辑好需要配置的 json 内容。
在这里插入图片描述

点击 execute,使用编辑好的 Json 数据调用该 API。
在这里插入图片描述

6.3 通过 GUI 的进行动态配置

通过 GUI 页面,url:http://njetServIP:8081/doc/gui/ 进入 GUI 页面。

按照下图示例中,以 http_split_clients_2 为例,修改参数后点击保存,配置即可生效。

在这里插入图片描述

7. 总结

OpenNJet是一款高性能、轻量级的云原生应用引擎,它为互联网和云原生应用提供了强大的运行时组态服务。以下是我认为的OpenNJet一些主要优点:

轻量级与灵活性:OpenNJet具有轻量级的特性,这意味着它占用的资源相对较少,使得开发者能够更轻松、高效地进行应用开发。这种轻量级的特性还提高了应用的部署灵活性,使得应用可以在各种云环境中快速部署和运行。
快速开发:OpenNJet为开发者提供了丰富的开发工具和友好的开发环境,有助于开发者快速构建和调试应用。这种快速开发的能力可以显著缩短开发周期,提高开发效率,从而加速将创新转化为商业价值。
高性能:OpenNJet的性能表现优异,其性能甚至达到了CNCF推荐的Envoy的三倍。这种高性能使得OpenNJet能够处理大量的请求和数据,满足高并发、低延迟的应用需求。
动态配置与扩展性:OpenNJet具有动态配置加载的能力,可以实时更改配置而无需重新启动服务器,解决了NGINX等传统工具的长期痛点。此外,它还通过CoPliot副驾驶服务框架实现了高可扩展性,可以在隔离控制面和数据面的情况下进行灵活的扩展。
功能丰富:OpenNJet不仅实现了NGINX的云原生功能增强、安全加固和代码重构,还提供了多种产品形态,如Web服务器、负载均衡、代理、应用中间件、API网关等。同时,它还增加了透明流量劫持、熔断、遥测与故障注入等新功能特性,为应用提供了更全面的保护和管理能力。
环境感知与安全控制:OpenNJet具备环境感知和安全控制的能力,可以根据不同的云环境和应用需求进行智能调整和优化。同时,它还提供了强大的安全控制功能,确保应用的安全性和稳定性。
个人看法,OpenNJet 作为一款高性能、轻量级的云原生应用引擎,具有诸多优点,能够助力企业实现云原生技术的平滑升级并大幅降低IT运营成本。

由于文章篇幅有限,更多功能和实战可以查看官方:https://njet.org.cn/

参考文章:
开源地址:https://github.com/OpenNJet/OpenNJet【可以点个 start 多支持一下】
官方文档:https://njet.org.cn/、https://gitee.com/njet-rd/docs/tree/master/zh-cn
开发指南:https://gitee.com/njet-rd/docs/blob/master/zh-cn/CoPilot%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97.md
使用手册:https://gitee.com/njet-rd/docs/blob/master/zh-cn/OpenNJet%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8Cv2.1.0.md

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

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

相关文章

4.Docker本地镜像发布至阿里云仓库、私有仓库、DockerHub

文章目录 0、镜像的生成方法1、本地镜像发布到阿里云仓库2、本地镜像发布到私有仓库3、本地镜像发布到Docker Hub仓库 Docker仓库是集中存放镜像的地方,分为公共仓库和私有仓库。 注册服务器是存放仓库的具体服务器,一个注册服务器上可以有多个仓库&…

IP纯净度对跨境电商有什么直接影响?

IP纯净度对跨境电商具有直接且深远的影响。在跨境电商的运作中,IP地址扮演着至关重要的角色,而IP纯净度则直接关系到跨境电商的网络安全性、访问效果以及业务竞争力。 第一点,纯净的IP地址对于提升跨境电商的网络安全性具有关键作用&#xf…

AI项目二十:基于YOLOv8实例分割的DeepSORT多目标跟踪

若该文为原创文章,转载请注明原文出处。 前面提及目标跟踪使用的方法有很多,更多的是Deepsort方法。 本篇博客记录YOLOv8的实例分割deepsort视觉跟踪算法。结合YOLOv8的目标检测分割和deepsort的特征跟踪,该算法在复杂环境下确保了目标的准…

信创 | 信创产品行业有哪些?已取得了哪些进展?

信创产业是一条庞大的产业链,涉及IT基础设施产品(如CPU芯片、服务器、存储、交换机、路由器等),以及基础软件、应用软件、网络安全等领域。信创产业的核心目标是建立自主可控的信息技术底层架构和标准,全面推进国产替代…

Models_M1

a1 Hugging Face a2 openai/whisper-large-v3 示 a3 ByteDance/Hyper-SD 示​​​​​​​ a4 OpenGVLab/InternV…

LeetCode-旋转链表

每日一题,很久没做链表的题了,今天做l一道相对简单的力扣中等难度题。 题目要求 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1: 输入:head [1,2,3,4,5], k 2 输出&…

FPGA 以太网概念简单学习

1 MAC和PHY 从硬件的角度来说,以太网接口电路主要由 MAC ( Media Access Control )控制器和物理层接口 PHY(Physical Layer , PHY )两大部分构成。 MAC 指媒体访问控制子层协议,它和 PHY 接…

使用yolov8+QT+onnrunxtime进行开发的注意事项

1、本来想尝试做一个C的yolov8在QT5.15.2的应用; 因此,在实现这个目标的时候,我先用了yolov8自带的export进行导出,使用的代码很简单,如下所示: import os from ultralytics import YOLO# model YOLO(&q…

优卡特脸爱云一脸通智慧平台 UpLoadPic.ashx 文件上传致RCE漏洞复现

0x01 产品简介 脸爱云一脸通智慧管理平台是一套功能强大,运行稳定,操作简单方便,用户界面美观,轻松统计数据的一脸通系统。无需安装,只需在后台配置即可在浏览器登录。功能包括:系统管理中心、人员信息管理中心、设备管理中心、消费管理子系统、订餐管理子系统、水控管理…

uniapp分包,以及通过uni-simple-router进行分包

先说一下uniapp的直接分包方式,很简单: 配置分包信息 打开manifest.json源码视图,添加 “optimization”:{“subPackages”:true} 开启分包优化 我们在根目录下创建一个pagesA文件夹,用来放置需要分包的页面 然后配置路由 运行到…

OpenNMS安装

环境要求 硬件要求 Just Testing 1Minimum Server Specification 2Minimum Server Specification 2CPU2GHz dual core x86_643GHz quad core x86_64 and aboveRAM4GB (physical)16GB (physical) and aboveStorage (disk space)50-GB HDD, SSD1TB with SSD and above You can i…

Python并发编程:揭开多线程与异步编程的神秘面纱

第一章:并发编程导论 1.1 并发与并行概念解析 1.1.1 并发性与并行性的区别 想象一下繁忙的厨房中多位厨师同时准备不同的菜肴——即使他们共享有限的空间和资源,也能协同工作,这就是并发性的一个生动比喻。并发性意味着多个任务在同一时间…

基于 dockerfile 编写LNMP

目录 一. 环境准备 二. 部署 nginx 2.1 建立工作目录,并上传需要的安装包 2.2 配置 nginx.conf 文件 2.3 编写 dockerfile 2.4 构建一个新的镜像 2.5 启动一个新的容器 三. 部署MySQL 3.1 建立工作目录,并上传安装包 3.2 编写 Dockerfile 3.…

ROS学习笔记(14)拉普拉斯变换和PID

0.前提 近些时间在对睿抗的ROS仿真赛进行小组安排,对小组成员进行了一些安排,也要求他们以本次比赛写下自己的比赛经历博客,他们的培训由我来安排和负责,因此我得加吧油,起码保证我的进度得快过他们,才能安…

源码编译安装curl _ 统信UOS _ 麒麟KOS _ 中科方德

原文链接:源码编译安装curl | 统信UOS | 麒麟KOS | 中科方德 Hello,大家好啊!今天我们来探讨一个非常实用的话题:在统信UOS、麒麟KOS以及中科方德桌面操作系统上如何从源码编译安装curl。Curl是一个广泛使用的命令行工具和库&…

【Kafka】Kafka高性能之道(六)

Kafka高性能之道 Kafka高性能原因 高效使用磁盘 1)顺序写磁盘,顺序写磁盘性能高于随机写内存。 2)Append Only 数据不更新,无记录级的数据删除(只会整个segment删s除)。读操作可直接在page cache内进行。如果进程重启,JVM内的cache会失效&a…

Pandas dataframe 中显示包含NaN值的单元格

大部分教程只讲如何打印含有NA的列或行。这个函数可以直接定位到单元格,当dataframe的行和列都很多的时候更加直观。 # Finding NaN locations for df.loc def locate_na(df):nan_indices set()nan_columns set()for col, vals in df_descriptors.items():for in…

grafana监控模板 regex截取ip地址

查看prometheus的node服务启动指标up,也可以查看其他的服务 配置监控模板 配置正则截取ip regex截取ip地址 /.*instance"([^"]*):9100*/ #提取(instance")开头,(:9001)结束字段

Qt Creator中变量与函数的注释 - 鼠标悬浮可显示

Qt Creator中变量与函数的注释 - 鼠标悬浮可显示 引言一、变量注释二、函数注释三、参考链接 引言 代码注释在软件开发中起着至关重要的作用。它们不仅有助于开发者理解和维护代码,还能促进团队协作,提高代码的可读性和可维护性。适当的注释应该是简洁明…

头脑风暴式会议设计6步法

头脑风暴是一种常用的会议讨论工具,可以释放参与者的思想,让参与者更加有创意地思考,产生新的想法和见解。引导者在设计会议时,遵循一定的步骤和流程,便能高效激发创新思维,共创出有效的问题解决方案。下图…