news 2026/6/7 1:38:22

Day 7:FastAPI + Docker——Java后端的“回家“时刻

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day 7:FastAPI + Docker——Java后端的“回家“时刻

🤖系列:Java工程师转AI Agent 3个月学习计划
👤作者:宸丶一| 28岁Java程序员,规划狂魔,周六加班还在学AI
🎯今日目标:用 FastAPI 把 Agent 包装成 HTTP 服务,了解 Docker 部署
💬个人格言:代码改不改变世界我不知道,但先让我准时下班。


前言

大家好,我是宸一,一个28岁的Java程序员。

今天是第7天,主题是:FastAPI + Docker 部署入门

先说结论:今天是学AI以来最轻松的一天。

为啥?因为 FastAPI 就是 Python 版的 Spring Boot,API 开发的思路和我日常工作一模一样。除了 Docker 那块稍微新一点,其他基本就是换个语法。

周六加班日,轻量完成,不硬卷。


一、今日学习路线

01_fastapi_basics.py
FastAPI 基础

02_fastapi_agent.py
Agent 包装成 API

test_api.py
接口测试

Dockerfile
容器化配置

核心转变:

Day 6(脚本): 用户 → python xxx.py → input() → print() → 用户 只有你自己能用 Day 7(服务): 用户A ──→ HTTP 请求 ──→ FastAPI ──→ Agent ──→ 响应 ──→ 用户A 用户B ──→ HTTP 请求 ──→ ↑ ──→ ──→ ──→ 用户B 用户C ──→ HTTP 请求 ──→ │ ──→ ──→ ──→ 用户C 24小时运行

从"脚本"变成"服务",这是质的飞跃。


二、FastAPI = Python 的 Spring Boot

2.1 用后端思维理解

作为Java后端,看到 FastAPI 的第一反应是:这不就是 Spring Boot 吗?

功能Spring BootFastAPI
创建应用@SpringBootApplicationapp = FastAPI()
定义接口@GetMapping@app.get
请求参数@RequestParam函数参数
请求体@RequestBodyPydantic Model
数据验证Bean ValidationPydantic
启动服务java -jaruvicorn
API 文档Swagger(要配置)自动生成/docs(零配置)
配置文件application.yml.env

一模一样,就是换了个语法。

2.2 核心代码

fromfastapiimportFastAPIfrompydanticimportBaseModel# 创建应用 = @SpringBootApplicationapp=FastAPI()# 数据模型 = DTO/VOclassChatRequest(BaseModel):message:strhistory:list=[]# 定义接口 = @Controller + @PostMapping@app.post("/chat")asyncdefchat(request:ChatRequest):# 处理逻辑...return{"reply":"你好!"}@app.get("/health")asyncdefhealth():return{"status":"healthy"}

Java 程序员看这段代码,零障碍。

2.3 最香的一点:自动 API 文档

启动服务后访问 http://localhost:8000/docs → 自动生成 Swagger UI → 所有接口一目了然 → 可以直接在页面上测试 → 零配置,零代码

Spring Boot 要集成 Swagger 还得加依赖、写配置。FastAPI 开箱即用,这点真的香。


三、把 Agent 包装成 API

3.1 接口设计

POST /chat → 聊天接口(核心) GET /health → 健康检查 GET /tools → 查看可用工具 GET / → 服务信息

标准的 RESTful 设计,和 Java 项目一模一样。

3.2 聊天接口实现

@app.post("/chat")asyncdefchat(request:ChatRequest):# 1. 构建消息messages=build_messages(request.message,request.history)# 2. 调用 Agentresponse=awaitagent.chat(messages)# 3. 返回结果return{"reply":response,"timestamp":datetime.now().isoformat()}

这不就是 Controller 调 Service 吗?换了个语法而已。

3.3 测试结果

📌 测试1:根路径 → 200 ✅ 📌 测试2:健康检查 → 200 ✅ 📌 测试3:工具列表 → 200 ✅ 📌 测试4.1:打招呼 → 200 ✅ "你好!我是小助手" 📌 测试4.2:查天气 → 200 ✅ "北京今天晴天,25°C" 📌 测试4.3:算数学 → 200 ✅ "15+27×3 = 96" 📌 测试4.4:查时间 → 200 ✅ "2026年6月6日13点44分" 📌 测试4.5:搜索知识 → 200 ✅ "Python是一种高级编程语言" 📌 测试5:带历史的聊天 → 200 ✅ "是的,你叫老刘,我记得!" 📌 测试6:API 文档 → 200 ✅ ✅ 所有测试通过!

6个测试全部一次通过,周六加班日的效率奇迹。


四、踩坑记录

4.1 GET 访问 POST 接口 → 405

在浏览器直接敲 http://localhost:8000/chat 返回:405 Method Not Allowed

原因:/chat@app.post定义的,浏览器地址栏默认是 GET 请求。

解决:/docs页面用 Swagger UI 测试,或者用test_api.py脚本。

Java 同学注意:这和 Spring Boot 的行为完全一样,@PostMapping的接口用 GET 访问也是 405。

4.2 uvicorn 热重载重复打印

INFO: Will watch for changes in these directories: [...] ✅ 1. FastAPI 应用创建成功! ✅ 2. 数据模型定义完成! ✅ 3. 路由定义完成! ✅ 1. FastAPI 应用创建成功! ← 又打印了一遍 ✅ 2. 数据模型定义完成! ← 又打印了一遍

原因:uvicorn 的StatReload会监听文件变化,自动重启服务。启动时会加载两次。

影响:不影响功能,只是日志看着多。生产环境用--reload关掉就行。


五、Docker = 标准化的部署方式

5.1 Dockerfile 长啥样

FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["uvicorn", "02_fastapi_agent:app", "--host", "0.0.0.0", "--port", "8000"]

就这几行,没了。

用 Java 思维理解:

  • FROM python:3.11-slim→ 选择 JDK 版本
  • COPY requirements.txt+RUN pip installmvn dependency:resolve
  • COPY . .→ 复制代码
  • CMD [...]java -jar app.jar

5.2 Docker 解决了什么问题

没有 Docker: "在我电脑上能跑啊!" ← 经典问题 Python版本不一致 → 依赖冲突 → 路径不同 → 各种坑 有了 Docker: 打包成镜像 → 任何地方都能跑 环境一致 → 依赖固定 → 配置统一 → 省心

本质:Docker = 把"我电脑上能跑"变成"任何电脑上都能跑"。

5.3 常用命令(就这几个)

dockerbuild-tagent-api.# 构建镜像 = mvn packagedockerrun-p8000:8000 agent-api# 运行容器 = java -jardockerps# 查看运行中的容器dockerlogs<container_id># 查看日志dockerstop<container_id># 停止容器

5个命令,覆盖90%的日常使用。不复杂,就是得多练。


六、用后端思维总结

概念Java 对应本例实现
FastAPISpring Boot创建 Web 应用
@app.get@GetMapping定义 GET 接口
@app.post@PostMapping定义 POST 接口
Pydantic Model@RequestBody + Bean Validation请求数据验证
uvicornTomcatASGI 服务器
/docsSwagger UI自动 API 文档
Dockerfilepom.xml + 启动脚本容器化配置
docker buildmvn package构建镜像
docker runjava -jar运行容器

七、今日收获

7.1 核心公式

Day 7 = FastAPI + Docker FastAPI: 应用 = FastAPI() 接口 = @app.get / @app.post 数据 = Pydantic Model 文档 = 自动生成 /docs Docker: 镜像 = docker build 容器 = docker run 部署 = 标准化 + 可移植

7.2 最大的感受

今天是"回家"的一天。

Day 1-3:Python 基础 → 换语法,有点陌生 Day 4:函数调用 → 新概念,需要理解 Day 5:手写 Agent → 踩坑,但学到最多 Day 6:LangChain → 框架,有 Breaking Change Day 7:FastAPI + Docker → 回到 Web 开发,熟悉的感觉

作为Java后端,API开发是日常。FastAPI 让我感觉回到了舒适区。

但"舒适"不代表"没学到东西"。今天学到的是:

  1. Python 的 Web 框架和 Java 思路一样,但更简洁
  2. Docker 不复杂,就是几条命令
  3. 从"脚本"到"服务"是质的飞跃

7.3 学习路线的节奏

前6天:新知识密集,每天都有新概念 第7天:回到熟悉的领域,巩固 + 部署 这种节奏很好: 前面学新东西 → 后面用熟悉的方式落地 不会一直高压,也不会一直舒适

八、明日计划(Day 8)

主题:真实 API 接入 + Prompt 工程基础

前面7天用的都是"假数据"(硬编码的天气、知识库) 是时候接真正的 AI 了 计划: - 把 Agent 接入小米 MiMo API,变成真正能对话的 AI - 学 Prompt 工程基础:system prompt 怎么写、temperature 参数是什么 - 动手写一个"角色扮演"Agent - 对比不同 prompt 的效果

一句话总结

FastAPI 是 Python 的 Spring Boot,Docker 是标准化的部署方式。Day 7 是"回家"的一天——Java后端搞API,闭着眼都能写。但别因为熟悉就跳过,"从脚本到服务"这个转变,值得认真理解。


📊系列进度:Day 7 / 90
📅学习节奏:周六加班日,轻量完成
🎯下一阶段:接入真实 API,告别硬编码假数据

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 1:34:22

3分钟解放双手!Photoshop图层批量导出终极提速方案

3分钟解放双手&#xff01;Photoshop图层批量导出终极提速方案 【免费下载链接】Photoshop-Export-Layers-to-Files-Fast This script allows you to export your layers as individual files at a speed much faster than the built-in script from Adobe. 项目地址: https:…

作者头像 李华
网站建设 2026/6/7 1:30:28

Sketch MeaXure:如何彻底解决设计标注的三大痛点问题

Sketch MeaXure&#xff1a;如何彻底解决设计标注的三大痛点问题 【免费下载链接】sketch-meaxure 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-meaxure 在UI/UX设计开发流程中&#xff0c;设计规范的准确传递一直是困扰团队的核心难题。传统的手动标注方式不…

作者头像 李华
网站建设 2026/6/7 1:30:22

ConvertET 文件格式转换工具使用教程(图文详解)

前言 最近在找一款能满足日常需求的文件格式转换工具&#xff0c;测试了好几款之后&#xff0c;发现 ConvertET 是目前用着最顺手的一个。这篇文章记录一下安装过程和各类格式的转换方法&#xff0c;供有同样需求的朋友参考。 ConvertET 支持图片、音频、视频、电子书、文档、…

作者头像 李华