God's Eye View实时3D地球:14个数据源服务端代理架构的完整设计模式指南
【免费下载链接】gods-eye-viewA spy satellite simulator in your browser, except the data is real. Live open source spatial intelligence on a photorealistic 3D globe.项目地址: https://gitcode.com/GitHub_Trending/go/gods-eye-view
God's Eye View 是一款开源的实时 3D 地球可视化项目,它像一部间谍卫星模拟器,但喂给它的全是真实公开数据——活体航班、船只、卫星、地震、公共摄像头和广播电台。这些"卫星画面"并非魔法,背后是server/providers/目录下 14 个数据源代理(proxy)组成的服务端架构:浏览器只请求本地服务,密钥与配额全部留在服务器端。本文带你从新手视角看懂这套服务端代理架构的设计模式。
🌐 什么是服务端代理?14 个数据源总览
所谓服务端代理(server-side proxy),就是浏览器不直接访问 OpenSky、NASA、TomTom 等第三方 API,而是先请求本地 Vite 开发服务器,由它代为转发、缓存、限流。这样带来三个好处:
- 🔒密钥不出服务器:OpenAI、AISStream、Google 等私密凭证只有服务端可见
- ⚡缓存与省配额:内存 + 磁盘两级缓存,重复请求不再打上游
- 🛡️防御上游风险:字节上限、SSRF 防护、错误脱敏
14 个顶层代理文件与它们背后的数据源如下表:
| 代理模块 | 数据源 | 地球上的角色 |
|---|---|---|
| cctv.js | 城市摄像头 API(Austin、London、Tallinn 等) | 公共摄像头投射进 3D 城市 |
| firms.js | NASA FIRMS | 🔥 全球活跃火点 |
| gbfs.js | GBFS 共享单车标准 | 🚲 单车站点实时状态 |
| military-installations.js | OpenStreetMap 社区数据 | 🎖️ 军事设施标注 |
| openai.js | OpenAI Realtime API | 🎙️ 语音 AI 与 AI HUD 摘要 |
| overpass.js | Overpass (OSM) | 道路、边界等矢量数据 |
| places.js | Google Places | 地点搜索与路线 |
| radio.js | Radio Browser | 📻 全球电台调谐器 |
| regional.js | 区域新闻 / 天气 API | 驾驶舱简报条 |
| space.js | CelesTrak + Launch Library 2 | 🛰️ 卫星目录与发射回放 |
| terrain.js | Re:Earth | 地形点高度查询 |
| traffic.js | TomTom | 🚦 实时车流速度 |
| live.js | OpenSky / adsb.lol / AIS | ✈️ 实时航班与船只聚合 |
| local.js | —(装配器) | 按序注册全部插件 |
复杂的数据源还会拆进子目录,如 aircraft/、cctv/、vessels/,每个子模块只负责一小段职责(查询、缓存、传输分离)。
⚙️ 设计模式一:Vite 插件工厂
每个代理都导出一个"工厂函数",返回一个 Vite 插件对象。以 terrain.js 为例,它返回{ name, configureServer, configurePreviewServer }——configureServer把一段中间件挂到固定的/api/*路由上:
// 所有代理的统一外形(示意) export function terrainHeightsProxy() { const installMiddleware = (server) => { server.middlewares.use('/api/terrain/heights', async (req, res) => { /* … */ }); }; return { name: 'terrain-heights-proxy', configureServer: installMiddleware, /* … */ }; }真正的"总装配线"在 local.js:localProviderPlugins()按固定顺序返回 20 个插件实例(OpenSky → CelesTrak → TomTom → … → Google Places),根目录 vite.config.js 只做一行重导出。这意味着新增一个数据源 = 写一个工厂函数 + 在列表里加一行,完全解耦——这正是 README 所说"每一层都是可替换的模块"的工程落地。
🧱 设计模式二:共享基建common/
所有代理不重复造轮子,公共能力集中在 common/:
- 字节上限读请求/读响应:common/request.js 对入站 body 强制上限;common/http.js 对上游响应边流边计数,超限立即掐断,防止恶意上游把代理内存打爆
- 请求合并(single-flight):coalesceProxyRequest 让同一时刻的相同请求共享一次上游调用
- 固定窗口限流:common/rate-limit.js 按"真实 socket 地址"限流,明确不信任
X-Forwarded-For头(客户端可控,伪造即可绕过)——这是一个很值得新手学习的防御细节
💾 设计模式三:两级缓存 + 陈旧兜底
数据"不会变"与"会变化"采用不同策略:
- 慢变数据(如 terrain.js 的地形高度):按坐标点做键,内存 Map + 磁盘 JSON 文件,TTL 长达 30 天,重启后自动从磁盘恢复
- 快变数据(如 overpass.js 的 OSM 查询):内存缓存按规范化后的查询串做键,并发相同查询合并为一次上游请求;响应头附带
X-Overpass-Cache: HIT/MISS/STALE,方便调试时看清命中路径 - 陈旧兜底(serve-stale):当所有上游镜像都失败时,Overpass 代理宁可返回"任何年龄"的最后成功结果,也不让道路图层闪空——"旧的路,好过没有路"
🛡️ 设计模式四:安全加固
这套代理被 README 称为"hardened server-side proxy",核心防线:
- 服务端凭证:浏览器永远看不到
OPENAI_API_KEY等私密值,客户端只拿到短时效会话令牌,逻辑见 openai/realtime.js - SSRF 防护:如电台代理用
isPublicRadioAddress校验上游地址,防止被诱导去请求内网 - 每 IP 可选限流:makeOptInRateLimiter 默认不启用,通过环境变量开启"每分钟 N 次/每 IP",全局兜底值为单 IP 上限的 20 倍
- 错误脱敏:上游异常统一返回简洁的 JSON 错误(如
"terrain heights proxy error"),不泄露内部细节
📹 眼见为实:代理驱动的真实图层
CCTV 代理把城市摄像头姿态(朝向/俯仰)估计后投射进 3D 空间——你还能拖拽相机上的 gizmo 手动校准。下面是 Austin 路口的活体摄像头画面:
TomTom 代理则把真实车流速度"喂"给仿真层:城市级拥堵颜色一路下钻,直到钻进同一路口的摄像头视角:
🚀 新手如何扩展一个新数据源?
照着既有模式,四步即可:
- 在 server/providers/ 下新建
mymodule.js,实现返回{ name, configureServer }的工厂函数 - 用 common/http.js 的带上限读取函数处理请求与响应
- 在 local.js 的插件列表里注册一行
- 浏览器端写一个同目录模式的 data 模块(参考 src/data/)去消费
/api/mymodule
📚 关键文件路径速查
| 路径 | 说明 |
|---|---|
| server/providers/local.js | 14 个代理的统一装配点 |
| server/providers/overpass.js | 限流 + 缓存 + 请求合并的完整范例 |
| server/providers/terrain.js | 两级缓存设计注释最详尽的模块 |
| server/providers/common/rate-limit.js | 固定窗口限流器实现 |
| vite.config.js | 代理插件的入口 |
| DATA_SOURCES.md | 全部数据源与授权说明 |
God's Eye View 的服务端代理架构用"小工厂 + 共享基建 + 分层缓存 + 安全加固"四个模式,把 14 个互不相同的第三方数据源缝成了一个稳定、可审计、可离线启动的实时 3D 地球。想要亲手拆解,从server/providers/terrain.js的注释读起,是成本最低的入口。
【免费下载链接】gods-eye-viewA spy satellite simulator in your browser, except the data is real. Live open source spatial intelligence on a photorealistic 3D globe.项目地址: https://gitcode.com/GitHub_Trending/go/gods-eye-view
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考