OmniNRF
OmniNRF 实现了 网络库功能 (NRF) 的 5G 核心。NRF 是基于服务架构 (SBA) 的中央注册表和服务目录:每个网络功能 (NF) 在启动时将其配置文件注册到 NRF,定期发送心跳以保持该注册,查询 NRF 以发现它需要通信的 NF 的端点。
OmniNRF 暴露了两个 SBI 服务。 Nnrf_NFManagement (nnrf-nfm/v1) 处理 NF 配置文件的注册、更新、心跳、注销、检索和 NF 状态变化的订阅/通知。 Nnrf_NFDiscovery (nnrf-disc/v1) 处理按类型、服务、S-NSSAI、DNN 和 PLMN 解析目标 NF 实例。所有 NF 配置文件和订阅都保存在内存 (ETS) 存储中;没有外部数据库,因此在 NRF 重启后,注册表会在 NF 重新注册时重建。后台清理会持续清除停止发送心跳的 NF 实例,因��注册表只会宣传那些明显存活的 NF。
文档
- 操作指南 - 3GPP 角色、SBI 端点,以及关键的注册、发现和订阅程序及其序列图。
- 配置参考 - 完整的运行时配置参考、参数表、管理/OAM API 和日志记录。
- 指标 - 用于注册、发现、心跳和 BEAM VM 健康的 Prometheus 指标,以及示例 PromQL。
- 故障排除 - 常见问题及其解决方案。
架构概述
NRF 位于 SBA 的中心。生产者 (UDM、AUSF、PCF 等) 注册以便被找到;消费者 (AMF、SMF、NSSF 等) 发现它们。任何 NF 都可以是两者,并且它们都发送心跳。
功能概述
- Nnrf_NFManagement:注册 (PUT)、心跳和 JSON-Patch 更新 (PATCH,RFC 6902,带嵌套 JSON-Pointer 路径)、注销 (DELETE)、单次检索和列表 (GET)。NF 实例列表以
3gppHal+jsonUriList 返回,带有nf-type过滤和limit/page-number/page-size分页。 - Nnrf_NFDiscovery:按 NF 类型、服务名称、PLMN、S-NSSAI 和 DNN 过滤;按优先级/容量/负载排序结果;带有
Link: rel="next"头的offset/limit分页。 - 心跳老化:持续的后台清理会过期静默超过
heartbeat_timeout的 NF,并通知订阅者。 - 状态订阅:
subscrCond.nfType过滤,NF_REGISTERED通知携带完整的nfProfile,可选的基于validityTime的自动过期。 - 并发控制:NF 实例响应上的
ETag;PUT/PATCH 上的条件If-Match(不匹配时返回 412)。 - 内容类型强制:PATCH 主体必须是
application/json-patch+json(否则返回 415);简单心跳客户端可以容忍缺失的 Content-Type。 - 结构化 JSON 日志记录,带有每个请求的元数据 (NF 实例 ID、过程)。
- Prometheus 指标,用于注册、发现、心跳和 BEAM VM 健康。
快速开始
OmniNRF 从 config/runtime.exs 读取其操作员配置,该配置将环境变量映射到 :omninrf 应用程序环境。
import Config
config :omninrf,
sbi_addr: System.get_env("SBI_ADDR", "127.0.0.1"),
sbi_port: String.to_integer(System.get_env("SBI_PORT", "7777")),
mcc: System.get_env("MCC", "999"),
mnc: System.get_env("MNC", "70"),
heartbeat_timeout: String.to_integer(System.get_env("HEARTBEAT_TIMEOUT", "30000")),
prometheus_metrics_port: String.to_integer(System.get_env("PROMETHEUS_PORT", "9568"))
config :logger, :default_formatter,
format: {OmniLogger.JsonFormatter, :format},
metadata: :all
SBI_ADDR默认为127.0.0.1(回环)。在任何多主机或容器化部署中,必须将其覆盖为其他 NF 可以访问的地址,否则将无法注册或发现任何 NF。
完整的参数参考,包括每个环境变量和默认值,详见 配置参考。