端口与路径
一个进程同时服务多条链,链由路径里的
chainId 区分。十六进制 ID 会被规范化为十进制字符串。
请求生命周期
预处理按固定顺序执行:节点选择
先按区块上下文决定节点池,再在池内按策略选具体节点。
链头高度来自 etcd 的
{chainId}/lastBlockNumber,由 consistency-checker 维护。链高度未知时保守选择 Archive 节点。
两个池会互相兜底:State 池为空时用 Archive 池,反之亦然。每个池内优先使用 Available 的节点。
负载均衡策略
- random(默认)
- round_robin
按权重概率选择。非 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,通用标签为 host、target、chain_id、chain_version。
按方法统计的指标附加
method 标签;jrpcx_rpc_calls_started 附加 sourcedapp;失败指标附加 status_code、upstream_related、reason。
运行
开发
相关文档
docs/architecture_cn.md— 组件边界与运行架构docs/deployment_cn.md— Docker Compose、Kubernetes、systemd 与生产调优