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

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 系统目录结构及功能说明

  ├── 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          主要是对各种不同体系统结构所提供的系统函数的封装,对外提供统一的系统调用接口

3.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}

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

4.1 安装 OpenNJet

1. 安装 Ubuntu 发行版本的 OpenNJet

  1. 添加gpg 文件​
sudo apt-get update

在这里插入图片描述

sudo apt-get install ca-certificates curl gnupg

在这里插入图片描述

sudo install -m 0755 -d /etc/apt/keyrings

在这里插入图片描述

curl -fsSL https://njet.org.cn/download/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/njet.gpg

这里正确的话应该是可以看到一些下载情况的,我之前已经下载过一次了,所以这里就没有内容了

在这里插入图片描述

sudo chmod a+r /etc/apt/keyrings/njet.gpg

在这里插入图片描述

  1. 添加APT 源​
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/njet.gpg] https://njet.org.cn/download/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/njet.list > /dev/null

在这里插入图片描述

sudo apt-get update

在这里插入图片描述

  1. 安装及启动
sudo apt-get install njet

在这里插入图片描述

sudo systemctl start njet

在这里插入图片描述

  1. 验证

浏览器访问:localhost:8080
在这里插入图片描述

curl http localhost:8080/

在这里插入图片描述

能够看到上述页面,说明 OpenNJet 安装成功了!!!

4.2 配置 OpenNJet

OpenNJet 的主要配置文件为 njet.conf。可以通过修改该文件来配置 OpenNJet。
njet.conf/usr/local/njet/conf 目录下
在这里插入图片描述

例如,以下是一个简单的 OpenNJet配置文件示例,用于将所有请求重定向到一个 HTML 文件:
在这里插入图片描述

http {
    include mime.types;
    access_log off;
    vhost_traffic_status_zone;
    #lua_package_path "$prefix/lualib/lib/?.lua;/usr/local/njet/modules/?.lua;;";
    #lua_package_cpath "$prefix/lualib/clib/?.so;;";
    server {
        #modsecurity on;       
        #modsecurity_rules_file /usr/local/njet/conf/modsec/main.conf;

        listen       8080;
        location / {
           root html;
        }
    }

}

4.3 自定义配置文件

  1. 修改 njet.conf 文件的权限
sudo apt install gedit
cd /usr/local/njet/conf
sudo chmod a+w njet.conf
gedit njet.conf

在这里插入图片描述

  1. 修改 njet.conf 文件的端口为 9090
    在这里插入图片描述

  2. 更改 html 文件内容

/usr/local/njet/html

cd /usr/local/njet/html
sudo chmod a+w index.html
gedit index.html

在这里插入图片描述
在这里插入图片描述

更改后
在这里插入图片描述

<!DOCTYPE html>
<html>
<head>
    <title>黑客帝国代码雨</title>
</head>
<body> <canvas id="canvas"></canvas>
    <style type="text/css">
        body {
            margin: 0;
            padding: 0;
            overflow: hidden;
        }
    </style>
    <script type="text/javascript">
        var canvas = document.getElementById('canvas');
        var ctx = canvas.getContext('2d');
 
 
        canvas.height = window.innerHeight;
        canvas.width = window.innerWidth;
 
        var texts = '156dsfcac'.split('');
 
        var fontSize = 16;
        var columns = canvas.width / fontSize;
        // 用于计算输出文字时坐标,所以长度即为列数
        var drops = [];
        //初始值
        for (var x = 0; x < columns; x++) {
            drops[x] = 1;
        }
 
        function draw() {
            //让背景逐渐由透明到不透明
            ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';
            ctx.fillRect(0, 0, canvas.width, canvas.height);
            //文字颜色
            ctx.fillStyle = '#0F0';
            ctx.font = fontSize + 'px arial';
            //逐行输出文字
            for (var i = 0; i < drops.length; i++) {
                var text = texts[Math.floor(Math.random() * texts.length)];
                ctx.fillText(text, i * fontSize, drops[i] * fontSize);
 
                if (drops[i] * fontSize > canvas.height || Math.random() > 0.95) {
                    drops[i] = 0;
                }
 
                drops[i]++;
            }
        }
        setInterval(draw, 33);
    </script>
</body>
</html>

4.4 重启 NJet

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

sudo systemctl stop njet
sudo systemctl start njet

在这里插入图片描述

4.5 访问 Web 应用程序

访问地址:localhost:9090
在这里插入图片描述

5. 总结

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在人间负债^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值