第 7 章 / 共 51 章
卷二 · 配置与服务装配

xs.json 全解 · 服务级字段

xs.json 是 XServer 唯一的装配界面。本章把 services[i] 的每一个预设字段讲透——不只讲"怎么写",更讲"写错会发生什么"。

本章导读

站位:卷二从服务级字段开始,因为它决定了"进程里有几个监听、各说什么协议"。本章与 字段参考页 构成一对:教程讲原理与边界,参考页供速查。已跑通 demo 的读者可快读 7.2 / 7.4。

7.1 引入

配置系统的常见病有两种:一是松——拼错的字段被静默忽略,直到线上才发现;二是散——行为散落在配置、环境变量、命令行三处。xs.json 的对策是 fail-fast + 单一来源:所有预设字段非法都在启动时点名退出,所有未预设字段原样进 Custom 留给应用——宿主不认识的字段永远不会被吞掉,也永远不会被猜错含义。

7.2 五类协议(class)

class语义脚本回调
httpHTTP/1.1 + HTTPS(TLS 开关)RequestProc
wsWebSocket + WSSWsOpen/Text/Binary/Ping/Pong/Close
tcp裸流 / TLS 流EventOpen/Data/Close
udp数据报(无 TLS)EventDgram
custom事件驱动自定义服务应用自定(经 Engine 起点)

白名单之外的值直接 fail-fast。选类的判断标准很简单:浏览器能说的用 http/ws,字节流用 tcp,无连接用 udp,其余自己来。

7.3 端点字段

端点字段组合
{
    "ip": "0.0.0.0",        /* 监听地址,默认全网卡 */
    "port": 80,             /* 明文端口,非 custom 必填 */
    "tls": true,            /* 开 TLS 端口;udp 禁止 */
    "port_tls": 443,        /* 默认 443;与明文端口同 IP 冲突即拒 */
    "ip_tls": "0.0.0.0"     /* 缺省复用 ip */
}

刚才发生了什么:一个服务最多两个端点(明文 + TLS)。冲突规则是启动期检查——同 IP 上明文端口与 TLS 端口撞车直接拒绝,不会出现"后者覆盖前者"的静默行为。证书路径不在服务级:它在 host 级(第 8 章展开),服务级只管"要不要 TLS 端口"。

7.4 限额字段

字段作用约束
backlog监听积压队列(直通 xrt)uint32 范围校验
recv_limit单次流读上限≤SIZE_MAX;udp 上 ≤65535

recv_limit 是内存防线:一次读进来的数据量上限。tcp 上它影响单连接的缓冲峰值;udp 上数据报天然 ≤64KB,所以上限收紧到 65535。请求级的 header/body 限额不在服务级预设字段里——它们是 Custom 旋钮(第 9 章),由 http 驱动读取。

7.5 服务级脚本缺省

五个脚本相关字段可以写在服务级,作为所有 host 的缺省:

服务级脚本缺省 → 合成 DefaultHost
{
    "class": "http",
    "name": "my-site",
    "port": 8080,
    "path": "wwwroot",       /* 静态根 */
    "devlang": "c",          /* 脚本语言 */
    "devfile": "main.c",     /* 脚本入口 */
    "dev_inc": "includes",   /* 额外头目录(分号分隔) */
    "dev_lib": "librarys"    /* 额外库目录 */
}

未配置 host_default 时,这五个字段合成出 DefaultHost——这就是第 4 章最小应用不需要写 host_default 的原因。host 级出现同名字段时逐项覆盖。

7.6 契约

  • 校验线:class 白名单、port 1–65535、tls×udp 互斥、端口冲突——全部启动期点名 fail-fast。
  • 缺省线:服务级脚本字段只是 host 级的缺省源,不是第二套配置。
  • 唯一性线:name 全局唯一——它是运行期 xsServerFind 的键,也是 reload 的目标描述。

常见错误

端口冲突被当"环境问题"
症状
启动失败,错误信息指出明文与 TLS 端口冲突。
原因
同 IP 上 port 与 port_tls 相同(或各自撞上其他服务)。
✗ 错误
{ "ip": "0.0.0.0", "port": 8080,
  "tls": true, "port_tls": 8080 }
✓ 正确
{ "ip": "0.0.0.0", "port": 8080,
  "tls": true, "port_tls": 8443 }
给 udp 配了 TLS
症状
启动失败:tls on udp。
原因
UDP 是数据报协议,XServer 不在 UDP 上做 TLS 封装;需要安全 UDP 传输应在应用层处理(如 DTLS 类方案自建)。
✗ 错误
{ "class": "udp", "port": 9000,
  "tls": true }
✓ 正确
{ "class": "udp", "port": 9000 }

编程练习

基础五类各起一个

写一份 xs.json,包含 http(8080)、ws(8081)、tcp(8082)、udp(8083)四个服务,全部 default 变体可运行(脚本可空导出)。

验收:启动日志出现四行 bound;Ctrl+C 优雅退出。
进阶触发全部端点校验

依次制造:port 越界、port 缺失、明密端口冲突、tls on udp 四种错误,记录每条错误信息。

验收:四条信息都能对应到 7.3 的规则描述,无一条是"含糊的失败"。
挑战双端点压测观察

给 http 服务开 TLS 端口并配好证书(可用 home 仓库的测试证书),用 curl 分别打明文与 TLS 端点,观察握手行为差异。

验收:能说明 TLS 端点收到明文请求时的行为(提示:连接被按字节流送入 TLS 解析,第 22 章会用到这个现象)。

小结

要点结论
五类协议http / ws / tcp / udp / custom,白名单 fail-fast
端点明文 + TLS 双端点;同 IP 冲突即拒
限额backlog 直通 xrt;recv_limit udp ≤65535
脚本缺省服务级五字段合成 DefaultHost,host 级逐项覆盖
速查ref-config 字段参考
xrt 延伸阅读