系统架构与请求链路
公开教程 · 无需登录

系统架构与请求链路

浏览器仅访问本站。静态页面与 /api 请求统一由 Nginx 入口进入;认证、授权、数据隔离与上传校验全部在 Go 服务端完成。数据库不向宿主机映射端口。

1分层架构与信任边界

docker compose 内部网络 浏览器 前端 SPA(不可信) 只暴露 :8080 web · Nginx 静态资源 + 反代 /api 反代 /api 信任边界:进入 Go 后全部校验 api · Go 认证 · 授权 · 隔离 上传校验 db · MySQL 不映射宿主机端口 上传目录 仅挂载到 api 数据卷 volume down 后数据仍在
请求链路:浏览器只与 web 通信;认证、授权、隔离与上传校验全部发生在信任边界之后(Go)。

上传目录仅挂载到 api 容器,不得被 Nginx 配置为静态资源目录。开发环境中前端代理的 /api 路径与生产环境保持一致,Cookie 因此无需处理跨域问题。

2各模块的职责边界

学生应能指出:本次请求终止在哪一层,下一层接收到的输入是什么。下表覆盖第 3 课的全部模块。第 4 课将在 Go 之后追加切分、向量嵌入、Qdrant 与对话模块。

模块职责范围不在职责内
浏览器 渲染页面;登录后自动携带 Cookie;将文件提交至 /api 不判定身份,不决定班级归属;隐藏入口不构成访问拒绝
Nginx 直接返回静态页面文件;路径以 /api 开头的请求原样反向代理至 Go 不查询会话,不访问 MySQL,不将上传目录暴露为静态目录
认证模块 登录时比对口令哈希并换发新会话;此后每次请求依据 Cookie 解析用户、角色与班级 不接受请求头或请求体中自行声明的角色与班级
材料模块 按会话班级提供列表、详情与下载;教师上传时写入文件并更新两张表 本课不执行切分、向量嵌入或问答
MySQL 持久化班级、用户、会话、材料与知识库正文 不映射宿主机端口,客户端无法直连
上传目录 仅供 api 容器存放文件;目录名使用班级编号,文件名由服务端生成 不接受客户端传入的路径;事务失败时须清理已写入文件

3以「材料列表」为例追踪一次请求

以已登录用户打开材料列表为例。若请求未携带 Cookie,则在认证模块即终止并返回 401,材料模块与数据库均不会被访问。

浏览器 带上 Cookie Nginx /api 转给 Go 认证模块 Cookie → 会话行 读出角色和班级 材料模块 只用会话班级 去查列表 MySQL 本班的行 本次请求中被丢弃的输入 查询参数或请求体中的 class_id、自行声明的 role,均由认证模块拦截而不向下传递 缺少 Cookie 或会话已过期:认证模块直接返回 401,后续模块不会执行
列表请求自左向右依次经过上述五个环节。班级归属在认证模块即已确定,材料模块不再从客户端获取该信息。

为何要拆分认证模块与材料模块

认证模块回答「本次请求者是谁」,材料模块回答「该用户所属班级有哪些材料」。若材料模块自行解析 Cookie,则两处会各维护一套会话逻辑,调整角色或过期策略时极易遗漏其一。所有需要登录的接口均先经过认证模块;校验通过后,后续代码只从本次请求上下文获取用户信息。