如何利用OpenNJet动态配置故障注入
NGINX 向云原生演进,All in OpenNJet
中断导致的服务中断可能会造成严重的业务后果,因此构建、运行和测试弹性系统非常重要。系统的弹性源自其各部分的弹性:系统的每个部分都能够处理一定数量的错误或故障。无论是后续的服务不可用、网络延迟还是数据可用性问题,分布式系统都充满了相应的错误处理的隐含非功能性需求。
什么故障注入?
类型
-
Delay: 只注入延迟故障,延迟时间到后,再发起对upstream的连接请求
-
Abort:只注入中止故障,收到客户端请求,直接将注入的状态码返回给客户端,结束请求
-
Delay+Abort:同时注入延迟故障和abort故障,先进行延迟,延迟时间到后,直接返回abort设置的状态码给客户端,结束请求,不再发起对upstream的连接请求
指令(fault_inject):
fault_inject 指令
| 参数 | 类型 | 必填 | 说明 |
| type={type} | string | 是 | delay、abort、delay_abort 三者之一delay:延迟注入类型abort:中止注入类型delay_abort: 延迟+中止注入类型 |
| delay_duration={duration} | string | 是(delay和delay_abort 必填) | delay时间, 1h/1m/1s/1ms, 必须>=1ms |
| status_code={code} | uint | 是 (abort和delay_abort 必填) | code设置注入返回码, [200, 600] |
| delay_percentage={pct} | uint | 可选,默认100 (100%) | 设置注入delay请求的百分比,默认是100%, 范围: [1, 100], eg: 1表示1%, 10表示10% |
| abort_percentage={pct} | uint | 可选,默认100 (100%) | 设置注入abort请求的百分比,默认是100%, 范围: [1, 100], eg: 1表示1%, 10表示10% |
Abort注入类型
| 参数 | 类型 | 必填 | 说明 |
| status_code={code} | uint | 是 | code设置注入返回码, [200, 600] |
| abort_percentage={pct} | uint | 可选,默认100 (100%) | 设置注入abort请求的百分比,默认是100%, 范围: [1, 100], eg: 1表示1%, 10表示10% |
1.3.2 Delay注入类型
| 参数 | 类型 | 必填 | 说明 |
| delay_duration={duration} | string | 是 | delay时间, 1h/1m/1s/1ms, 必须>=1ms |
| delay_percentage={pct} | uint | 可选,默认100 (100%) | 设置注入delay请求的百分比,默认是100%, 范围: [1, 100], eg: 1表示1%, 10表示10% |
Delay+Abort注入类型
| 参数 | 类型 | 必填 | 说明 |
| delay_duration={duration} | string | 是 | delay时间, 1h/1m/1s/1ms, 必须>=1ms |
| status_code={code} | uint | 是 | code设置注入返回码, [200, 600] |
| delay_percentage={pct} | uint | 可选,默认100 (100%) | 设置注入delay请求的百分比,默认是100, 范围: [1, 100], eg: 1表示1%, 100表示100% |
| abort_percentage={pct} | uint | 可选,默认100 (100%) | 设置注入abort请求的百分比,默认是100, 范围: [1, 100], eg: 1表示1%, 100表示100% |
OpenNJet中的声明式API 动态故障注入
接口url
GET http://{ip:port}/config/2/config/http_dyn_fault_inject
PUT http://{ip:port}/config/2/config/http_dyn_fault_inject
Json格式如下:
{
"servers": [
{
"listens": [
"0.0.0.0:92"
],
"serverNames": [
""
],
"locations": [
{
"location": "/",
#此处type可为下面四种
#abort 这个表示中止注入
#delay 这个表示延迟注入
#delay_abort 这个表示延迟+中止注入
#none 这个表示取消故障注入或者不设置故障注入
"fault_inject_type": "delay_abort", #如果该值为none,则其他参数取值无意义
"delay_percentage": 100, #延迟故障注入百分比,如果是abort类型,该值无意义
"abort_percentage": 100, #中止故障注入百分比,如果是delay类型,该值无意义
"status_code": 405, #故障注入状态码,如果是delay类型,该值无意义
"delay_duration": "5s", #故障注入延迟时间,如果是abort类型,该值无意义
"locations": [
{
"location": "/demo",
"fault_inject_type": "none", #子location /demo 故障注入类型
}
]
}
]
}
]
}
OpenNJet 配置文件
load_module modules/njt_http_dyn_fault_inject_module.so; #使用动态故障注入功能需要load该模块
模块编译
功能测试
HTTP1.1 协议测试
abort故障注入测试
server {
listen 80 ;
server_name localhost;
location / {
fault_inject type=abort status_code=405 abort_percentage=100;
proxy_next_upstream_tries 0; #关闭重试
proxy_next_upstream_timeout 0; #关闭超时
proxy_pass http://back/;
}
}
测试效果:
2023/07/17 17:04:51 [debug] 13179#0: *35 fault injet abort 405, client: 192.168.40.205, server: localhost, request: "GET / HTTP/1.1", host: "192.168.40.136"
delay故障注入测试
server {
listen 80 ;
server_name localhost;
location / {
fault_inject type=delay delay_duration=10s delay_percentage=100;
proxy_next_upstream_tries 0; #关闭重试
proxy_next_upstream_timeout 0; #关闭超时
proxy_pass http://back/;
}
}
测试效果:
#等待10s 后正常处理并成功返回页面
2023/07/17 17:02:04 [debug] 13015#0: *28 fault inject start deleay, client: 192.168.40.205, server: localhost, request: "GET / HTTP/1.1", host: "192.168.40.136"
2023/07/17 17:02:14 [debug] 13015#0: *28 fault njet delay success, client: 192.168.40.205, server: localhost, request: "GET / HTTP/1.1", host: "192.168.40.136"
2023/07/17 17:02:14 [debug] 13015#0: *28 fault inject delay timer clean while closing request, client: 192.168.40.205, server: localhost, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8008/", host: "192.168.40.136"
delay_abort故障注入测试
server {
listen 80 ;
server_name localhost;
location / {
fault_inject type=delay_abort delay_duration=10s status_code=405 delay_percentage=100;
proxy_next_upstream_tries 0; #关闭重试
proxy_next_upstream_timeout 0; #关闭超时
proxy_pass http://back/;
}
}
# 先delay等待10s
2023/07/17 16:57:48 [debug] 11894#0: *26 fault inject start deleay, client: 192.168.40.205, server: 192.168.40.136, request: "GET / HTTP/1.1", host: "192.168.40.136"
2023/07/17 16:57:58 [debug] 11894#0: *26 fault njet delay success, client: 192.168.40.205, server: 192.168.40.136, request: "GET / HTTP/1.1", host: "192.168.40.136"
#直接返回 405 abort
2023/07/17 16:57:58 [debug] 11894#0: *26 fault injet abort 405, client: 192.168.40.205, server: 192.168.40.136, request: "GET / HTTP/1.1", host: "192.168.40.136"
2023/07/17 16:57:58 [debug] 11894#0: *26 fault inject delay timer clean while closing request, client: 192.168.40.205, server: 192.168.40.136, request: "GET / HTTP/1.1", host: "192.168.40.136"
HTTP2 协议测试
abort故障注入测试
配置:
server {
listen 81 ssl http2;
server_name 192.168.40.136;
ssl_certificate /root/bug/njet1.0/mycert/www.tmlake.xn--com-7m0aa+3.pem;
ssl_certificate_key /root/bug/njet1.0/mycert/www.tmlake.xn--com-7m0aa+3-key.pem;
location / {
fault_inject type=abort status_code=405 abort_percentage=100;
proxy_next_upstream_tries 0; #关闭重试
proxy_next_upstream_timeout 0; #关闭超时
proxy_pass http://back/;
}
}
#直接返回405
2023/07/17 16:43:54 [debug] 11894#0: *8 fault injet abort 405, client: 192.168.40.205, server: 192.168.40.136, request: "GET / HTTP/2.0", host: "192.168.40.136:81"
delay故障注入测试
server {
listen 81 ssl http2;
server_name 192.168.40.136;
ssl_certificate /root/bug/njet1.0/mycert/www.tmlake.xn--com-7m0aa+3.pem;
ssl_certificate_key /root/bug/njet1.0/mycert/www.tmlake.xn--com-7m0aa+3-key.pem;
location / {
fault_inject type=delay delay_duration=10s delay_percentage=100;
proxy_next_upstream_tries 0; #关闭重试
proxy_next_upstream_timeout 0; #关闭超时
proxy_pass http://back/;
}
}
#delay 10s后成功访问到页面
2023/07/17 16:42:03 [debug] 11783#0: *4 fault inject start deleay, client: 192.168.40.205, server: 192.168.40.136, request: "GET / HTTP/2.0", host: "192.168.40.136:81"
2023/07/17 16:42:13 [debug] 11783#0: *4 fault njet delay success, client: 192.168.40.205, server: 192.168.40.136, request: "GET / HTTP/2.0", host: "192.168.40.136:81"
2023/07/17 16:42:13 [debug] 11783#0: *4 fault inject delay timer clean while sending to client, client: 192.168.40.205, server: 192.168.40.136, request: "GET / HTTP/2.0", upstream: "http://127.0.0.1:8008/", host: "192.168.40.136:81"
delay_abort故障注入测试
server {
listen 81 ssl http2;
server_name 192.168.40.136;
ssl_certificate /root/bug/njet1.0/mycert/www.tmlake.xn--com-7m0aa+3.pem;
ssl_certificate_key /root/bug/njet1.0/mycert/www.tmlake.xn--com-7m0aa+3-key.pem;
location / {
fault_inject type=delay_abort delay_duration=10s status_code=405 delay_percentage=100;
proxy_next_upstream_tries 0; #关闭重试
proxy_next_upstream_timeout 0; #关闭超时
proxy_pass http://back/;
}
}
#先delay 10s
2023/07/17 16:39:10 [debug] 11598#0: *2 fault inject start deleay, client: 192.168.40.205, server: 192.168.40.136, request: "GET / HTTP/2.0", host: "192.168.40.136:81"
2023/07/17 16:39:20 [debug] 11598#0: *2 fault njet delay success, client: 192.168.40.205, server: 192.168.40.136, request: "GET / HTTP/2.0", host: "192.168.40.136:81"
#再直接返回405 abort
2023/07/17 16:39:20 [debug] 11598#0: *2 fault injet abort 405, client: 192.168.40.205, server: 192.168.40.136, request: "GET / HTTP/2.0", host: "192.168.40.136:81"
2023/07/17 16:39:20 [debug] 11598#0: *2 fault inject delay timer clean, client: 192.168.40.205, server: 192.168.40.136, request: "GET / HTTP/2.0", host: "192.168.40.136:81"
OpenNJet中声明式 API 动态故障注入测试
OpenNJet静态配置
...
load_module modules/njt_http_dyn_fault_inject_module.so; #load 动态模块so
...
http{
...
upstream back{
server 127.0.0.1:8008;
}
server{
listen 8008;
location / {
index 8008.html;
add_header Set-Cookie route=8008;
}
}
#8009 为普通server, 返回8008.html文件
server{
listen 8009;
location / {
proxy_pass http://back/;
}
}
...
}
执行get请求
{
"servers": [
{
"listens": [
"0.0.0.0:8009"
],
"serverNames": [
""
],
"locations": [
{
"location": "/",
"fault_inject_type": "none", #8009 静态默认为none,即没有设置故障注入,
#相关参数没有意义
"delay_percentage": 100,
"abort_percentage": 100,
"status_code": 200,
"delay_duration": ""
}
]
},
{
"listens": [
"0.0.0.0:8008"
],
"serverNames": [
""
],
"locations": [
{
"location": "/",
"fault_inject_type": "none",
"delay_percentage": 100,
"abort_percentage": 100,
"status_code": 200,
"delay_duration": ""
}
]
}
]
}
浏览器访问
执行put请求,修改
{
"servers": [
{
"listens": [
"0.0.0.0:8009"
],
"serverNames": [
""
],
"locations": [
{
"location": "/",
"fault_inject_type": "delay_abort", #修改为delay_abort, delay 5s, 然后返回405
"delay_percentage": 100,
"abort_percentage": 100,
"status_code": 405,
"delay_duration": "5s"
}
]
},
{
"listens": [
"0.0.0.0:8008"
],
"serverNames": [
""
],
"locations": [
{
"location": "/",
"fault_inject_type": "none",
"delay_percentage": 100,
"abort_percentage": 100,
"status_code": 200,
"delay_duration": ""
}
]
}
]
}
再次get
{
"servers": [
{
"listens": [
"0.0.0.0:8009"
],
"serverNames": [
""
],
"locations": [
{
"location": "/",
"fault_inject_type": "delay_abort", #与put 修改一致,说明修改成功
"delay_percentage": 100,
"abort_percentage": 100,
"status_code": 405,
"delay_duration": "5s"
}
]
},
{
"listens": [
"0.0.0.0:8008"
],
"serverNames": [
""
],
"locations": [
{
"location": "/",
"fault_inject_type": "none",
"delay_percentage": 100,
"abort_percentage": 100,
"status_code": 200,
"delay_duration": ""
}
]
}
]
}
通过浏览器实际访问
后台日志
#日志也显示delay 5s后,返回abort 405
2023/07/20 15:55:17 [debug] 30305#0: *12 fault inject start deleay,
client: 192.168.40.205, server: , request: "GET / HTTP/1.1", host: "192.168.40.136:8009"
2023/07/20 15:55:22 [debug] 30305#0: *12 fault njet delay success, client: 192.168.40.205,
server: , request: "GET / HTTP/1.1", host: "192.168.40.136:8009"
2023/07/20 15:55:22 [debug] 30305#0: *12 fault injet abort 405, client: 192.168.40.205, server: ,
request: "GET / HTTP/1.1", host: "192.168.40.136:8009"
2023/07/20 15:55:22 [debug] 30305#0: *12 fault inject delay timer clean while closing request,
client: 192.168.40.205, server: , request: "GET / HTTP/1.1", host: "192.168.40.136:8009"=
更多实践案例,查看njet.org.cn
OpenNJet 最早是基于 NGINX1.19 基础 fork 并独立演进,OpenNJet 具有高性能、稳定、易扩展的特点,同时也解决了 NGINX 长期存在的难于动态配置、管理功能影响业务等问题。作为底层引擎,OpenNJet 利用动态加载机制可以实现不同的产品形态,如 API 网关、消息代理、出入向代理,负载均衡,WAF 等等。在云原生架构中,OpenNJet 除了提供南北向通信网关的功能以外,还提供了服务网格中东西向通信、透明流量劫持、熔断、遥测与故障注入等新功能特性。
Gitee 邮件组
邀您开源共建:https://njet.org.cn/
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
1-8 月我国软件业务收入 75178 亿元,同比增长 13.5%
工信部发布公告指出,1-8月份,我国软件和信息技术服务业(以下简称“软件业”)运行态势平稳,软件业务收入保持较快增长,利润总额保持两位数增长,软件业务出口小幅回落。 一、总体运行情况 软件业务收入保持较快增长。1-8月份,我国软件业务收入75178亿元,同比增长13.5%。 利润总额保持两位数增长。1-8月份,软件业利润总额8628亿元,同比增长13.9%。 软件业务出口小幅回落。1-8月份,软件业务出口319.3亿美元,同比下降4.5%,其中,软件外包服务出口同比增长3.4%。 二、分领域运行情况 软件产品收入保持两位数增长。1-8月份,软件产品收入17437亿元,同比增长10.8%,占全行业收入的比重为23.2%。其中,工业软件产品收入1704亿元,同比增长12.5%。 信息技术服务收入较快增长。1-8月份,信息技术服务收入50116亿元,同比增长14.8%,在全行业收入中占比为66.7%。其中,云计算、大数据服务共实现收入7532亿元,同比增长15.7%,占信息技术服务收入的比重为15%;集成电路设计收入1994亿元,同比增长5%;电子商务平台技术服务收入6981亿元,同比增长9...
-
下一篇
Apache Dubbo 首个 Node.js 3.0-alpha 版本正式发布
关于Apache Dubbo3 Apache Dubbo 是一款易用、高性能的 WEB 和 RPC 框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。经过近几年发展,Dubbo3 已在阿里巴巴集团各条业务线实现全面推广,成功取代运行多年的 HSF 框架,同时 Dubbo3 的多语言体系也有了快速发展,目前涵盖的多语言体系有 apache/dubbo[1](java) apache/dubbo-go[2] apache/dubbo-js[3](web、node.js) apache/dubbo-rust[4] 基于 Dubbo3 定义的 Triple 协议,你可以轻松编写浏览器、移动端、gRPC 兼容的 RPC 服务,并让这些服务同时运行在 HTTP/1 和 HTTP/2 上。Dubbo Node.js SDK 支持使用 IDL 或编程语言特有的方式定义服务,并提供一套轻量的 API 来发布或调用这些服务。 关于 Dubbo3 Node.js 首个发布版 Dubbo-js 项目于 9 月份刚刚发布了支持 Dubbo3 协议的首个 alpha 版本...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Thymeleaf,官方推荐html解决方案

微信收款码
支付宝收款码