
在构建复杂的 FastAPI 应用时,采用三层架构(表现层、应用层、领域层)是一种常见的实践。然而,当某个 Endpoint 需要聚合来自多个不同服务的的数据时,例如一个 get_transaction Endpoint 需要用户、产品和销售信息,如何组织代码就成了一个需要仔细考虑的问题。常见的做法有两种:一种是在应用层直接调用多个服务,另一种是创建一个专门的服务来聚合这些数据。
在这种方案中,FastAPI Endpoint 直接调用用户服务、产品服务和销售服务,然后将返回的数据组装成 transactionDto 对象并返回。
from fastapi import FastAPI, Depends
from typing import Dict
# 假设的 User, Product, Sale 服务接口
class UserService:
async def get_user(self, user_id: int) -> Dict:
# 模拟从数据库或外部服务获取用户信息
return {"id": user_id, "name": "Example User"}
class ProductService:
async def get_product(self, product_id: int) -> Dict:
# 模拟从数据库或外部服务获取产品信息
return {"id": product_id, "name": "Example Product"}
class SaleService:
async def get_sale(self, sale_id: int) -> Dict:
# 模拟从数据库或外部服务获取销售信息
return {"id": sale_id, "amount": 100}
app = FastAPI()
@app.get("/transactions/{transaction_id}")
async def get_transaction(
transaction_id: int,
user_service: UserService = Depends(),
product_service: ProductService = Depends(),
sale_service: SaleService = Depends()
) -> Dict:
user = await user_service.get_user(transaction_id)
product = await product_service.get_product(transaction_id)
sale = await sale_service.get_sale(transaction_id)
transaction_data = {
"transaction_id": transaction_id,
"user": user,
"product": product,
"sale": sale
}
return transaction_data优点:
缺点:
在这种方案中,创建一个 TransactionService,它负责调用用户服务、产品服务和销售服务,并将返回的数据组装成 transaction 对象,然后返回给应用层。
from fastapi import FastAPI, Depends
from typing import Dict
# 假设的 User, Product, Sale 服务接口
class UserService:
async def get_user(self, user_id: int) -> Dict:
# 模拟从数据库或外部服务获取用户信息
return {"id": user_id, "name": "Example User"}
class ProductService:
async def get_product(self, product_id: int) -> Dict:
# 模拟从数据库或外部服务获取产品信息
return {"id": product_id, "name": "Example Product"}
class SaleService:
async def get_sale(self, sale_id: int) -> Dict:
# 模拟从数据库或外部服务获取销售信息
return {"id": sale_id, "amount": 100}
# Transaction Service
class TransactionService:
def __init__(self, user_service: UserService, product_service: ProductService, sale_service: SaleService):
self.user_service = user_service
self.product_service = product_service
self.sale_service = sale_service
async def get_transaction(self, transaction_id: int) -> Dict:
user = await self.user_service.get_user(transaction_id)
product = await self.product_service.get_product(transaction_id)
sale = await self.sale_service.get_sale(transaction_id)
transaction_data = {
"transaction_id": transaction_id,
"user": user,
"product": product,
"sale": sale
}
return transaction_data
app = FastAPI()
@app.get("/transactions/{transaction_id}")
async def get_transaction(
transaction_id: int,
transaction_service: TransactionService = Depends()
) -> Dict:
transaction = await transaction_service.get_transaction(transaction_id)
return transaction优点:
缺点:
选择哪种方案取决于具体的场景和需求。以下是一些建议:
BFF (Backend For Frontend) 模式:
可以考虑将 TransactionService 视为一种 BFF (Backend For Frontend) 模式的应用。BFF 模式指的是为不同的前端应用创建不同的后端服务,这些后端服务负责聚合和转换数据,以满足前端应用的特定需求。
在 FastAPI 中实现三层架构处理复杂 Endpoint 时,需要仔细考虑服务的设计和组织方式。应用层直接调用多个服务和创建专门的服务来聚合数据是两种常见的方案,每种方案都有其优缺点。选择哪种方案取决于具体的场景和需求。 需要注意的是,要明确服务的职责边界,避免循环依赖,并评估性能影响。 通过合理的设计和架构,可以构建出可维护、可扩展的 FastAPI 应用。
以上就是使用 FastAPI 实现三层架构处理复杂 Endpoint:服务设计考量的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号