写点什么

NJet 动态 VS 支持新增端口

作者:通明湖
  • 2025-10-28
    北京
  • 本文字数:1271 字

    阅读完需:约 4 分钟

简介

动态监听是 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 数据进行修改。

发布于: 刚刚阅读数: 3
用户头像

通明湖

关注

让应用永远在线! 2022-10-13 加入

持续科技创新,信创应用交付领域的排头兵

评论

发布
暂无评论
NJet动态VS支持新增端口_通明湖_InfoQ写作社区