NJet动态VS支持新增端口

🙈 By 李崇民 2025-10-22

简介

动态监听是NJet核心需求,在NJet4.0中,在7层(http)与4层(stream)均实现了该能力。在新版本NJet中,无需重启NJet服务,即可实时调整监听配置。适配云原生环境动态特性。目前先支持SSL协议,可满足HTTPS服务动态调优需求(如大促流量应对、负载灵活调整)。团队计划后续支持完整的Listen选项,实现与静态配置的完全兼容。

主要实现思路

实现此功能,需要处理好如下问题:

检查新增监听端口的可用性

新增端口的VS,可以是在http块中,也有可能是stream块中。在静态配置情况下,会由master进程来检测端口的可用性,如果端口不可用,就直接报错返回,再由用户修改配置。在新实现中,在特权进程中实现的这一检查。对一个新端口,需要检查在http及stream中是否用到了该端口,同时还要尝试新端口能否进行监听。为了简化系统设计与实现,目前对新增端口,不考虑为一个新端口同时增加tcp, udp监听。 这样,在检查时,只要检查端口(port)号是否存在。如果存在该端口,则按照在老端口上增加VS的流程进行。

多个worker监听同一端口

对于静态配置的VS,这个问题的解决方法是由master进程先打开端口,再fork出多个worker进程,worker进程从master进程继承打开的所有端口。在动态增加新端口时,各个worker进程已经都独立存在了。为实现打开同一端口监听,要为新端口对应的socket上设置了REUSEPORT属性。

删除端口时的内存释放

在删除VS时,如果是新增加了监听端口,且在删除这个VS后,没有VS在监听这个端口,需要将与新增端口相关的数据结构进行释放。要避免内存泄露,需要为新增端口配置一个单独的内存池,与新端口相关的数据结构都由这个内存池来分配和释放。

现有限制

如果增加新的监听端口,必须要保证对应的http或stream块中必须存在一个静态的VS。

与静态配置的端口相比,动态增加的端口目前在listen_option中只支持ssl属性的配置。这个限制在后续的版本中会逐步去除。

支持版本

从NJet4.0版本开始,支持该功能。

具体使用

新功能是在原有的动态VS基础上进行扩展,基本使用请求参考NJet使用手册https://docs.njet.org.cn/docs/v3.3.1/reference/http/dyn_vs/index.html。下面给出在新增端口下的使用,

以在stream块中新增端口为例,http块使用方式相同。可通过下图界面上的这两个swagger接口增加VS。

img

增加一个udp端口(这个只有stream block支持,http block不支持)

{
  "type": "add",
  "addr_port": "0.0.0.0:9003 udp",
  "server_name": "server-9003",
  "server_body": "return server-9003"
}

增加一个tcp端口

{
  "type": "add",
  "addr_port": "0.0.0.0:9003",
  "server_name": "server-9003",
  "server_body": "return server-9003"
}

增加一个tcp端口,支持ssl, 标黄部分必须加上,同时需要在server_body中增加相应配置,如证书等。

{
  "type": "add",
  "addr_port": "0.0.0.0:9999",
  "server_name": "server-9999",
  "listen_option": "ssl",
  "server_body": "ssl_certificate ../ecc-first.crt; ssl_certificate_key ../ecc-first.key; return 200 server-9999"
}

如果通过API方式增加,可参考使用文档,并对相应的json数据进行修改。