OpenNJet 概述

OpenNJet 是基于 NGINX 的一款应用引擎,旨在为互联网和云原生应用提供高性能和多样化的运行时组态服务程序,作为底层引擎,OpenNJet 实现了NGINX 云原生功能增强、安全加固和代码重构,OpenNJet 通过动态加载机制可以实现不同的产品形态,如Web服务器流媒体服务器负载均衡代理(Proxy)应用中间件API网关消息队列等产品形态等等。
在这里插入图片描述

更多特性可以查看官网:https://njet.org.cn/

比NGINX更加强大

在这里插入图片描述
OpenNJet最早是基于NGINX1.19基础,fork并独立演进的开源应用引擎,并随着NGINX版本迭代,吸收上游NGINX的更新,已经同步更新到NGINX1.23.1版本。
相比市面其他类型的API网关,高性能是NGINX主要的优点,但动态配置能力的缺乏一直受到业界的诟病。OpenNJet在NGINX的架构上进行了扩充,对其框架进行了改写,增加了 C 及可持久化的动态存储能力,解决了指令配置变更动态生效的关键问题,扩展了OpenNJet的应用场景。此外,业界对应用引擎可观测性的需求,需要应用引擎持续不断的采集性能指标、日志数据以及注入跟踪信息,但这对应用引擎的性能造成了不可忽视的影响,OpenNJet利用Copilot framwork隔离了业务处理及配置变更和指标采集,避免了遥测对性能的影响。作为云原生的应用引擎,OpenNJet需要支持业界流行的Ingress及Sidecar的api规范,基于动态配置+ Copilot framework架构,NJet可以通过不断更新独立的相关Copilot module,实现对响应标准规范的及时支持
话不多说我们接下来实操体验一波。

CentOS 编译环境配置

首先需要准备一台可以访问外网的机器,我这里使用的是CentOS7环境。

  1. 如果本机已配置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

1.1 如果没有配置yum源则执行以下命令配置yum源后再执行上面的命令安装软件包:

  1. 执行以下指令:sudo yum --enablerepo=extras install -q -y epel-release centos-release-scl-rh [https://repo.ius.io/ius-release-el7.rpm](https://gitee.com/link?target=https%3A%2F%2Frepo.ius.io%2Fius-release-el7.rpm)
  2. sudo curl -o /etc/yum.repos.d/mercurial.repo [https://www.mercurial-scm.org/release/centos7/mercurial.repo](https://gitee.com/link?target=https%3A%2F%2Fwww.mercurial-scm.org%2Frelease%2Fcentos7%2Fmercurial.repo)
  3. 上面步骤完成后,文件系统的目录/etc/yum.repos.d 将生成对应的repo文件,可以通过ls -al /etc/yum.repos.d/mercurial.repo查看。

二、创建符号链接

  1. sudo ln -s /opt/rh/devtoolset-8/root/usr/bin/gcc /usr/local/bin/gcc
  2. sudo ln -s /opt/rh/devtoolset-8/root/usr/bin/c++ /usr/local/bin/c++
  3. sudo ln -s /opt/rh/devtoolset-8/root/usr/bin/cc /usr/local/bin/cc
  4. sudo ln -s /opt/rh/devtoolset-8/root/usr/bin/make /usr/local/bin/make

三、编译代码

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

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

  3. 执行命令:make

如果make 后,有如下提示:则继续 执行 make 指令。

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

  1. 最后执行:make install安装完成。

常用命令

显示帮助信息: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}

Upstream API实现动态添加、删除、修改http模块和stream模块的 upstream server

比原有的nginx更强大,可以实现态添加、删除、修改http模块和stream模块的 upstream server ,要开启该功能, 需在 ctrl.conf 配置文件的 main 块中加载该模块:

load_module modules/njt_http_upstream_api_module.so;

并在 http 块下,指定该模块的配置文件:

http {
     access_log logs/access_ctrl.log combined;
     server {
         listen         8081  ;
         location /api {
            dyn_module_api;
        }
     }
}

Upstream api,配置ACL控制

load_module modules/njt_http_upstream_api_module.so; 

 server {
        listen       8081;
        
        
         location /api {
             dyn_module_api;
             limit_except GET {
               auth_basic "NGINX plus API";
               auth_basic_user_file /etc/njet/htpasswd;
            }
        }
  }

更多具体操作细节可以查看官方文档:https://gitee.com/njet-rd/docs

高可用部署支持

为了简化部署及配置,NJet 通过Copilot 扩展机制实现了VRRP协议的HA模块,只要加载HA Copilot 并提供相应的配置文件,即可实现高可用功能。
开启HA功能需在njet.conf的 main block 中添加如下指令

helper ha modules/njt_helper_ha_module.so conf/vrrp.conf;

并在conf目录下提供vrrp配置文件,配置项的说明如下。

配置项必填配置说明
vrrp_instancevrrp_instance的string为设置的VRRP的实例名。
state设置当前节点的初始化状态,状态为MASTER或者BACKUP
interface可以绑定vip的接口名称,比如eth0,bond0,br0。
通过IP -a查看自己的网卡信息
nopreempt设置是否抢占虚拟IP,添加即为不抢占
virtual_router_id设置虚拟路由器惟一标识,范围:0-255,同属一个集群的多个njet节点该id相同,不同的njet集群该值必须不同,务必要确认在同一网络中此值必须唯一。
priority设置当前njet节点的优先级,范围:[1-254],值越大优先级越高
virtual_ipaddress设置虚拟IP对应的子网掩码

测试验证

  • 配置三台服务器测试机,IP分别是:
  1. 192.168.100.66
  2. 192.168.100.67
  3. 192.168.100.68
  • 使用虚拟IP:
  1. 192.168.100.50

192.168.100.66服务器vrrp.conf配置如下:

vrrp_instance m{
 state MASTER
 interface eth192
 virtual_router_id 32 
 priority 200 
 virtual_ipaddress {
 192.168.100.50/24 
 }
}

192.168.100.67服务器vrrp.conf配置如下:

vrrp_instance m{
 state BACKUP
 interface eth192
 virtual_router_id 32 
 priority 10 
 virtual_ipaddress {
 192.168.100.50/24 
 }
}

192.168.100.68服务器vrrp.conf配置如下:

vrrp_instance m{
 state BACKUP
 interface eth192
 virtual_router_id 32 
 priority 100 
 virtual_ipaddress {
 192.168.100.50/24 
 }
}

三台服务器上的NJet都启动时,由于100.66是MASTER,该主机将获取到VIP;
停止100.66主机上的NJet实例后,由于100.68主机的优先级priority 较高,100.68将获得VIP;
重新启动100.66主机上的NJet实例后,100.66将重新获得VIP。

OpenNJet 作为基于 NGINX 的应用引擎,为互联网和云原生应用提供了多样化、灵活和高性能的解决方案。其动态加载机制和模块化设计使得其在多种产品形态中都能表现出色。无论是 Web 服务器、流媒体服务器、负载均衡、代理,还是 API 网关和消息队列,OpenNJet 都能够轻松适应。这种灵活性和可扩展性使其成为各种应用场景中的理想选择。
对于寻求高性能和灵活性的开发者和企业,OpenNJet 是一个值得考虑的解决方案。无论是作为核心应用引擎,还是作为云原生架构的一部分,OpenNJet 都能提供强大的支持和稳定的性能。
由于文章篇幅有限,更多功能和实战可以查看官方:https://njet.org.cn/

参考:
开源地址:

官方提供版本使用手册:https://gitee.com/njet-rd/docs/tree/master/zh-cn

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位指出。
主页共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐