# 面板微服务(panel)开发文档 > 状态:设计稿 v0.1(开发前评审) > 关联:[gateway/README.md](../gateway/README.md)、[docs/dnfs_custom_themes.md](dnfs_custom_themes.md)、[core/services.yaml](../core/services.yaml)、[libhttp/README.md](../libhttp/README.md) ## 1. 背景与目标 ### 1.1 问题 现有前端页面(fsys 托管的 `index.html` / `dnfs.html` 等)都是"整页应用":每个页面由单个服务完整提供。当多个服务都想在首页/工作台展示自己的能力时,只能互相改动前端代码或各自开新页面,服务间耦合、发布相互牵连。 ### 1.2 目标 新增**面板微服务**(panel),提供一张**背景视图**(工作台/仪表盘)。视图内的元素与控件**不由面板自己实现**,而是由各业务微服务以**前端代码片段**的形式提供,面板负责聚合、渲染与托管: - 各服务**自持控件代码**(代码维护在各自模块),通过约定协议暴露片段 - 面板**拉取并聚合**片段,以 iframe 沙箱插入背景视图 - 面板只提供统一外壳(布局 / 主题 / 通信 / 身份透传),**不感知控件业务** ### 1.3 非目标(v1) - 不做控件可视化拖拽编排(v2 候选) - 不做用户自定义控件 / 第三方插件市场(控件仅来自内部服务,白名单) - 不做控件代码的 AI 内容审核——控件是内部服务代码而非用户输入,信任边界与 dnfs2 用户样式节点不同(见 5.3) ## 2. 架构设计 ### 2.1 拓扑 ``` 浏览器 │ https + q4_token Cookie / Authorization ▼ waf:443 ──► ca:8443(验签,注入 X-Auth-User / X-Auth-Admin) │ Target-Url: http://127.0.0.1:9201 ▼ gateway:8445 ──► panel:9201(Proxy.opened 白名单) │ ┌────────────────┼──────────────────────┐ │ 内部 HTTP(--providers 白名单) │ BFF 转发 ▼ ▼ ▼ dnfs2:8006 fsys:9200 其他 provider 服务 /panel-widget/x /panel-widget/y ``` - 面板对浏览器只暴露**一个 origin**(面板自己);控件 iframe 由面板端点在**同一 origin** 下渲染,不存在跨域、自定义头问题(浏览器无法设置 `Target-Url`,因此控件回源统一走面板 BFF,对齐 fsys→dnfs2 的服务端代理先例)。 - 面板加入 `Proxy.opened` 白名单后走 ca 受保护链路:只有登录用户能打开面板;BFF 转发时透传身份头。 ### 2.2 核心概念 | 概念 | 说明 | |---|---| | Panel | 面板服务本身:背景视图 + 聚合 / 渲染 / 托管 | | Widget(控件) | 一个可独立渲染的前端单元,由某微服务提供 | | Provider(提供方) | 拥有控件代码的微服务,实现 `/panel-widget/` 协议 | | Manifest | 控件描述:元数据 + html/css/js 片段 + 布局 / 主题声明 | ### 2.3 控件生命周期 1. **声明**:服务在自身实现 `GET /panel-widget/`(内部 HTTP) 2. **拉取**:面板按 `--widgets` 清单拉取各 manifest(缓存 + TTL) 3. **聚合**:面板把 manifest 渲染为独立子页面 `/widget/`(内联片段 + 白名单 CSP) 4. **插入**:面板页用 `