场景
在使用NGINX做负载均衡进行反向代理的场景中,使用upstream 管理一组有效的上游服务器地址。 地址可以包含两类:server ip 和server name。
其中server name在nginx 启动时,必须统一解析为server ip,在整个运行过程中,upstream 中只包含解析后的server ip,并且数量,以及ip 是不会改变的,即使dns 服务器上相应的server name 对应的ip 地址列表,已经进行了更新,删除,添加。Nginx 也不会进行动态更新,如果要更新,只能重新reload nginx。
启动nginx 前:
upstream backend {
server backend1.example.com;
server 127.0.0.1:888;
}
启动nginx 后:
upstream backend {
server 192.168.40.139;
server 127.0.0.1:888;
}
问题
- 运行过程中,如果域名对应的某个IP的机器或服务出现故障,无法进行动态隔离,必须修改 DNS 服务器上Server Name 对应的 IP 列表,并重新 Reload NGINX,导致业务中断。
- 运行过程中,如果在 DNS 服务器上,对server name 对应的 IP 进行,修改,添加,删除,也无法及时的反应到 NGINX 上来,也必须重新 Reload NGINX。
OpenNJet 解决方案
upstream backend {
resolver 192.168.40.1 valid=10s; //valid失效时间。
server backend1.example.com resolve;//resolve 指明需动态更新
server 127.0.0.1:888;
}
在upstream 里配置resolver 指定 dns 服务器地址,以及域名失效时间valid=10s, 也就是每隔10秒钟,重新请求dns 进行域名解析。域名解析对应的 IP 列表的变化,添加,删除,修改等会及时的同步到upstream 中,这样就可以通过修改dns 服务器上对应server name 的ip 列表,对服务的 IP 进行动态调整。
OpenNJet 最早是基于 NGINX1.19 基础 fork 并独立演进,随着 NGINX 版本迭代,吸收上游 NGINX 的更新,已经同步更新到 NGINX1.23.1 版本,OpenNJet 具有高性能、稳定、易扩展的特点,同时也解决了 NGINX 长期存在的难于动态配置、管理功能影响业务等问题。
作为底层引擎,OpenNJet 利用动态加载机制可以实现不同的产品形态,如 API 网关、消息代理、出入向代理,负载均衡,WAF 等等。在云原生架构中,OpenNJet 除了提供南北向通信网关的功能以外,还提供了服务网格中东西向通信、透明流量劫持、熔断、遥测与故障注入等新功能特性。