🙈 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。

增加一个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数据进行修改。