Stay Hungry,Stay Foolish!

FastAPI Hive:按「业务能力」而非「技术分层」组织你的 FastAPI 应用

FastAPI Hive:按「业务能力」而非「技术分层」组织你的 FastAPI 应用

https://github.com/fanqingsong/fastapi-hive

 

参考

https://dev.to/codefalconx/fastapi-vs-spring-boot-a-comprehensive-comparison-13ko

https://juejin.cn/post/7649363408022683689

 

已获取到 GitHub 项目 fastapi-hive 的完整 README(联网抓取成功,原始解析超时的那份已忽略)。下面是一篇可直接发布的技术博客稿。


FastAPI Hive:按「业务能力」而非「技术分层」组织你的 FastAPI 应用

如果你写过稍具规模的 FastAPI 项目,大概率经历过这样的痛苦:改一个业务功能,却要在 routers/、schemas/、services/ 三个目录之间来回横跳。项目越大,这种「代码散落」越严重。

GitHub 上的开源项目 fastapi-hive(作者 fanqingsong,Apache-2.0 协议)给出了一个鲜明的主张:

Organize FastAPI applications around business capabilities, not technical layers. 按业务能力组织 FastAPI 应用,而不是按技术层次。

一、它要解决什么问题

传统 FastAPI 项目多按技术分层组织:

app/
├── routers/      # 所有路由
├── schemas/      # 所有模型
├── services/     # 所有服务
└── main.py

这种布局在小项目时很清晰,但随着功能增多,同一个业务能力的代码被切散到不同技术目录,维护时认知负担陡增。

fastapi-hive 提倡的是一种「能力导向」布局:

app/
├── foundations/          # 共享基础设施
│   ├── auth/
│   └── db/
└── endpoints/            # 每个文件夹 = 一个业务能力
    ├── heartbeat/
    │   ├── router/
    │   ├── schema/
    │   └── service/
    └── house_price/
        ├── router/
        ├── schema/
        └── service/

一个端点(endpoint)把它的 router、schema、service 乃至可选的数据库模型全部收拢在自己名下,内聚性大幅提升。

二、蜂巢隐喻:一个好懂的心智模型

项目用「蜂巢(hive)」来命名各组件,概念非常直观:

  • Endpoints 是「蜜蜂」:每个端点文件夹独立负责一项业务能力,自己挂载路由。
  • Foundations 是「蜂巢结构」:鉴权、数据库访问等跨端点共享的关注点,作为可独立初始化的模块存在。
  • IoC 框架是「养蜂人」:负责发现模块、执行生命周期钩子、暴露模块状态;端点只需挂载自己的 APIRouter。

带来的直接好处是:main.py 里的注册样板代码更少、职责归属更清晰,模块更易审查、测试、迁移或删除。

三、它是怎么工作的

初始化时 IoCFramework 扫描配置的包路径并导入子模块,随后:

  1. 发现被装饰的模块,通过 hive 注册表暴露其发布值;
  2. 注册同步与异步的启动 / 关闭钩子;
  3. 让每个端点在 startup 阶段挂载自己的 APIRouter;
  4. 安装请求中间件,在每次请求前后运行 foundation 钩子。

这套生命周期特别适合「只需准备一次的资源」——例如加载一个 ML 模型、建立数据库连接、初始化鉴权提供方——也适合需要绑定到每个请求的资源。

四、核心能力

  • 能力导向模块:一个端点的全部代码就近放置。
  • 自动发现:从可配置路径加载 foundations 与多个 endpoint 包。
  • 显式路由挂载:在 startup 中用 self.app.include_router(...) 挂载各端点路由。
  • 生命周期钩子:在应用、模块、请求三个边界运行同步/异步的启动与关闭代码。
  • Bean 图与自动配置:@provides / @component 成为定义,HiveContext 按类型创建;第三方 starter 通过 hive.autoconfigure 入口点注册,配合 @conditional(on_import、on_missing、on_bean、enabled_when)做条件装配。
  • 渐进式接入:只加一小段 bootstrap 代码即可包住现有 FastAPI 应用。

五、快速上手

注意:PyPI 上的包可能落后于仓库,官方推荐从源码安装。

git clone https://github.com/fanqingsong/fastapi-hive.git
cd fastapi-hive
pip3 install .

支持 Python 3.8 ~ 3.13。初始化极简:

from fastapi import FastAPI
from fastapi_hive.ioc_framework import IoCFramework

app = FastAPI(title="My API")
IoCFramework.bootstrap(app)

若 foundations/endpoints 与 main.py 同级,框架会按约定自动发现。也可用 settings= 或 HIVE_* 环境变量覆盖,优先级为:代码 > 环境变量 > 目录约定。

端点侧用一个装饰器把路由挂上去:

@endpoint(name="heart_beat2")
class EndpointHooksImpl(EndpointHooks):
    def startup(self):
        self.app.include_router(router, prefix="/api/hb2", tags=["heartbeat-v2"])

六、内置示例做了什么

仓库自带的应用演示了几个典型场景:以 foundation 实现的 API-Key 鉴权、以 foundation 实现的数据库初始化与请求级访问、心跳端点、以及 ML 模型预加载 + 房价预测,并演示跨两个 endpoint 包的端点发现。启动后可访问 /docs 查看 OpenAPI 文档,GET /hive/routers 可列出已挂载路由。

七、项目速览

项目fastapi-hive
仓库 github.com/fanqingsong/fastapi-hive
一句话定位 按业务能力组织 FastAPI 应用(IoC 框架)
语言 Python 3.8–3.13
许可证 Apache-2.0
标签 dependency-inversion-principle、fastapi、ioc-framework、machine-learning
提交规模 197 commits、4 分支、13 标签、5 位贡献者

八、它适合谁

  • 团队 FastAPI 项目正在变大、受够了「改一个功能跳三个目录」的人;
  • 欣赏依赖倒置 / 关注点分离,想在 Python Web 里引入类似 Spring 的 IoC / 自动配置体验的人;
  • 需要在应用启动时预加载 ML 模型、数据库连接等重资源的服务。

一句话总结:fastapi-hive 不是另一个 Web 框架,而是一套让 FastAPI「按业务而非按技术」生长的组织哲学 + IoC 工具。它尊重你原有的 FastAPI 习惯(路由还是普通的 APIRouter),只在你需要更清晰的所有权与更低样板成本时,轻轻托你一把。


如果你希望我把这篇稿子导出为 Word / PDF 文件,或调整篇幅(更短的快讯版 / 更长的深度版)、补充代码示例图示,告诉我即可。

 

posted @ 2026-10-05 18:31  lightsong  阅读(2)  评论(0)    收藏  举报
千山鸟飞绝,万径人踪灭