X4G 是什么?凭什么突然霸榜 GitHub Trending?
打开 2026-07-09 的 GitHub Trending 榜单,x4gKing/X4G 几乎是一夜之间杀到 ⭐2203 的位置。仓库作者 x4gKing 在国内开发者圈子里并不算”明星”,但 X4G 本身定位极简——一个用 Go 写的轻量级四层网关/代理框架,目标是把传统 Nginx + Lua + 一堆 sidecar 才能搞定的事情,压缩到单一二进制里。
它爆火的原因很直接:最近两年”边缘网关”和”AI 流量调度”的需求暴涨,但 OpenResty 太重、Envoy 学习曲线陡、Traefik 配置又啰嗦。X4G 反其道而行,核心代码只有几千行,配置用 YAML 一把梭,热加载、metrics、mTLS 全打包。社区里有人形容它是”Nginx 的简洁 + Caddy 的体验 + Envoy 的协议面”,这种”刚好够用”的甜点位,让它被多个独立博主推荐后迅速出圈。
问题一:X4G 跟 Nginx/Envoy 到底有什么本质区别?
现象:很多第一次看到 X4G 的人会问,“又是一个网关?我已经有 Nginx 了为什么要换?”
根因:X4G 的核心差异不在”能不能反代”,而在”四层 + 热配置 + 单文件”的取舍。它默认工作在 L4,但向上暴露了 L7 的最小子集(HTTP/1.1、HTTP/2、WebSocket),向下又支持 raw TCP/UDP 转发,所以像 MQTT 接入、游戏长连接、AI 推理的 gRPC 都能直接吃下,而 Nginx 要靠 stream 模块还得自己拼配置。
解法:先用 X4G 跑一个最常见的 HTTP 反向代理对比一下:
# x4g.yaml
listeners:
- name: web
bind: "0.0.0.0:8080"
protocol: http
routes:
- match: { host: "api.example.com" }
upstream: backend
upstreams:
backend:
targets:
- "127.0.0.1:9001"
- "127.0.0.1:9002"
healthcheck:
path: /healthz
interval: 5s
x4g run -c x4g.yaml
跑起来你会发现:它比 Nginx 少 70% 配置,比 Envoy 少 90% YAML。
问题二:热加载会不会丢连接?
现象:生产环境最怕 reload 那一刻长连接被切断,HN 上有运维吐槽”每次 reload 都要等 30 秒,监控全是红”。
根因:Nginx 默认 reload 是 worker 平滑退出,但 stream 模块下的 TCP 长连接经常因为 SO_REUSEPORT 的 socket 漂移被掐断。X4G 的解法是把”配置变更”和”监听 socket”解耦——listener 在 reload 时保持不重建,只把路由表换成新版本,旧的 in-flight 连接继续走旧路由直到自然关闭。
解法:用 SIGHUP 触发热加载:
kill -HUP $(pidof x4g)
# 观察日志
tail -f /var/log/x4g.log | grep -i "route swapped"
你会看到类似 route swapped for listener=web, version=12->13, in-flight=4821 的输出,意味着 4821 个长连接没被强制断开。如果想更激进地切流量,可以加 --drain-timeout=2m,让旧连接在 2 分钟内自然消化。
问题三:在 K8s 里怎么部署才不掉链子?
现象:Reddit r/kubernetes 上有人问”X4G 有没有官方 Helm chart?”——答案目前是没有,但社区已经有 3 个非官方版本。
根因:X4G 是单二进制 + 配置文件,非常适合用 emptyDir + ConfigMap 方式部署,但要解决两个坑:① liveness probe 写错路径导致 Pod 反复重启;② hostNetwork 开不开——开了丢 Pod 网络隔离,不开 service mesh 又连不上 upstream。
解法:推荐 ConfigMap + Deployment 模式,sidecar 不要:
apiVersion: apps/v1
kind: Deployment
metadata:
name: x4g
spec:
replicas: 2
template:
spec:
containers:
- name: x4g
image: ghcr.io/x4gking/x4g:v0.7.2
args: ["run", "-c", "/etc/x4g/x4g.yaml"]
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /__x4g/health
port: 9090
initialDelaySeconds: 3
volumeMounts:
- name: cfg
mountPath: /etc/x4g
volumes:
- name: cfg
configMap:
name: x4g-config
注意 management port 默认开在 9090,health 端点是 /__x4g/health,很多人写成 /health 就会一直 404 触发重启。
问题四:性能真能扛住 10 万 QPS 吗?
现象:issue 区有用户拿 wrk 测出来单机 18 万 QPS,但同时又有人报告 2 万 QPS 就 CPU 打满。
根因:差异几乎全在 GOMAXPROCS 和 upstream.keepalive 配置上。X4G 默认走 Go net/http 的连接池,但当 upstream 是 HTTP/1.1 时,per-host 的 idle 连接数被锁在 DefaultMaxIdleConnsPerHost=2,这把并发直接卡死。
解法:生产配置里手动把 keepalive 调大:
upstreams:
backend:
keepalive:
max_idle: 1024
idle_timeout: 90s
targets:
- "10.0.0.10:9001"
- "10.0.0.11:9001"
runtime:
gomaxprocs: 0
reuse_port: true
打开 reuse_port 后多核利用率明显提升,社区基准在 8C/16G 机器上能稳定跑到 22-25 万 QPS(P99 < 8ms)。
写在最后
X4G 不是一个颠覆性项目,它解决的是”我想 5 分钟搭一个能上生产的网关”这种真实痛点。它的爆火也提醒我们:在云原生和 AI 中间件越来越臃肿的今天,“刚好够用”本身就是一种强需求。如果你正愁 Nginx 配置维护成本,又觉得 Envoy 太重,X4G 值得花一个下午试试。
Sources
- GitHub Trending 2026-07-09 榜单
- x4gKing/X4G 仓库 README 与 issue #87、#142
- r/kubernetes: “Lightweight gateway for K8s ingress” 讨论串
- HN: “X4G — a 4-layer gateway that fits in a single binary”
- 作者博客:x4g.dev/posts/why-x4g