一文了解云原生应用引擎的领跑者: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源:
- 执行以下指令:
sudo yum --enablerepo=extras install -q -y epel-release centos-release-scl-rh https://repo.ius.io/ius-release-el7.rpm
- 执行以下指令:
sudo curl -o /etc/yum.repos.d/mercurial.repo https://www.mercurial-scm.org/release/centos7/mercurial.repo
- 上面步骤完成后,文件系统的目录
/etc/yum.repos.d
将生成对应的repo
文件 - 执行以下指令:
[root@CDN102 home]# ls -al /etc/yum.repos.d/mercurial.repo
- 执行以下指令:
-rw-r--r--. 1 root root 267 3月 7 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 编译代码
-
把
OpenNJet 1.0.zip
包上传到 /home 目录下。 并解压unzip njet1.0.zip
,如图:
-
执行
sh build_cc.sh conf
-
执行
make
如果make
后,有如下提示:则继续执行make
指令。
-
正确编译完成:
-
最后执行
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