Skip to main content
nodex-proxy 把一个 leafage-evm 集群收敛成单一 RPC 端点。它按请求的区块上下文决定该发往 State、Archive 还是 Native 节点,并承担限流、镜像、可观测性等流量治理职责。

端口与路径

一个进程同时服务多条链,链由路径里的 chainId 区分。十六进制 ID 会被规范化为十进制字符串。
管理接口和 JSON-RPC 共用端口,且能改变路由状态。这个端口不应暴露到内网之外,或需要放在外部认证层之后。

请求生命周期

预处理按固定顺序执行:
后处理:

节点选择

先按区块上下文决定节点池,再在池内按策略选具体节点。 链头高度来自 etcd 的 {chainId}/lastBlockNumber,由 consistency-checker 维护。链高度未知时保守选择 Archive 节点。 两个池会互相兜底:State 池为空时用 Archive 池,反之亦然。每个池内优先使用 Available 的节点。

负载均衡策略

按权重概率选择。非 batch 请求会先按方法路由规则过滤候选节点,再按权重选。没有显式权重的节点默认 100

自动重试

服务发现

监听 etcd 前缀(etcd_prefix 可配置),下列键后缀会被解释为运行时数据: 代理通过 watch PUT / DELETE 事件实时增删节点、更新配置,不需要重启。

健康检查

etcd 中出现新节点时不会立刻加入节点池:
1

探测

向节点发送 RPC 调用验证可达性。State / Archive 节点用 getLatestBlock,Native 节点用 eth_blockNumber
2

重试

失败则每 5 秒重试一次,直到 node_health_check_max_wait(默认 300 秒)。
3

加入

通过检查后才进入负载均衡池。

版本路由

请求使用基础链 ID 且没有显式版本后缀时,代理读取 etcd 的 {chainId}/version,把请求改写到 {chainId}-{version} 的节点池。这让版本切换对客户端透明。

流量治理

用量上报

配置 usage 后,RPC 耗时按 client-id 请求头在本地聚合,达到 10000 个聚合键或 report_interval(默认 5s)时写入 Kafka。
usage 是聚合耗时的毫秒数,最小为 1;缺失的 client-id 记为 unknown。发送是 best-effort:优雅退出时发送最后一批,进程崩溃或 Kafka 异常时允许丢失。当前聚合键数量由 jrpcx_usage_aggregation_keys 反映。

管理接口

debug_chooseOneNode 在排查路由问题时很有用:它返回当前请求条件下会被选中的节点,不实际转发。

指标

暴露在 :8664/metrics,通用标签为 hosttargetchain_idchain_version 按方法统计的指标附加 method 标签;jrpcx_rpc_calls_started 附加 sourcedapp;失败指标附加 status_codeupstream_relatedreason

运行

多个实例可以连接同一个 etcd 集群水平扩展,各自维护本地 selector 状态。

开发

相关文档