FastAPI 是一个现代、快速(高性能)的 web 框架,用于构建 API,基于标准 Python 类型提示。FastAPI 不是直接支持 gRPC 的,gRPC (Google Remote Procedure Call)是一个由 Google 开发的高性能、开源和通用 RPC 框架,用于在微服务架构中进行服务间的通信。
要在 FastAPI 中使用 gRPC,你可以创建一个服务使用 FastAPI 接收来自客户端的 HTTP 请求,并在后台与 gRPC 服务进行交互。典型的做法是将 FastAPI 作为一个 gRPC 客户端或者是 Gateway 来调用 gRPC 服务。
以下是一个例子说明如何在 FastAPI 应用中使用 gRPC,你可以按照步骤在 vscode 或者其它编辑器中跟着操作,最后运行。在开始之前,我们先准备一款 gRPC 调试工具。
gRPC 调试工具
为了优化 gRPC 的调试体验,选择一个可靠的调试工具至关重要。这里我比较推荐使用 Apifox —— 一款支持多种协议(如 http、https、WebSocket、Socket、gRPC、Dubbo 等)的全能接口测试工具。下面,我们将通过具体步骤演示如何在 FastAPI 中实现 gRPC,并借助 Apifox 进行高效调试。
FastAPI 实现 gRPC 具体步骤
步骤1:安装所需的包
首先,你要在项目中确保安装了以下库:
fastapi
uvicorn
(一个 ASGI 服务器,用于托管 FastAPI 应用)grpcio
和grpcio-tools
(gRPC 的 Python 包)
pip install fastapi uvicorn grpcio grpcio-tools
步骤2:定义 gRPC 服务
然后,你需要定义你的 gRPC 服务。例如,创建一个名为 helloworld.proto
的 ProtoBuf 文件,定义一个简单的 gRPC 服务。
syntax = "proto3";
package helloworld;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
步骤3:生成 gRPC 代码
使用 grpcio-tools
来生成 Python 绑定代码,它的命令为:
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. helloworld.proto
步骤4:实现 gRPC 服务器
创建一个简单的 gRPC 服务器来处理 HelloRequest,并返回 HelloReply,例如:
# server.py
from concurrent import futures
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
class Greeter(helloworld_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
if __name__ == '__main__':
serve()
步骤5:实现 FastAPI 应用
创建一个 FastAPI 应用并通过 gRPC 客户端与 gRPC 服务器通信。
# main.py
from fastapi import FastAPI
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
app = FastAPI()
@app.get("/")
async def read_root(name: str):
with grpc.insecure_channel('localhost:50051') as channel:
stub = helloworld_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(helloworld_pb2.HelloRequest(name=name))
return {"message": response.message}
步骤6:运行
首先,运行 gRPC 服务器(这里假设你已经实现了 Greeter 服务):
python server.py
随后,在另一个终端中运行 FastAPI 应用:
uvicorn main:app --reload
现在你可以打开浏览器或使用任何 HTTP 客户端往 http://127.0.0.1:8000/?name=your_name
发送请求,FastAPI 服务作为 gRPC 客户端会通过 gRPC 调用后端的 gRPC 服务,并将结果返回给前端客户端。
此外,你也可以创建 gRPC Gateways,它们可以自动将 HTTP/JSON 请求转换为 gRPC 调用,并将 gRPC 响应转换回 HTTP/JSON。这通常需要使用额外的 ProtoBuf 插件,如 grpc-gateway
。但注意这通常适用于 Go 或 Java 等其他语言,Python 社区的支持可能有限。
虽然我们在 FastAPI 中搭建了一个简单的 gRPC 服务,并创建了相应的客户端,但在实际项目中,很多开发者可能会面临需要在不同语言、不同团队之间调试 gRPC 接口的情况。在这方面,我们可以借助接口调试与管理工具来简化这一流程。
使用 Apifox 调试 gRPC
目前,市面上能够兼容 gRPC 接口的调试与管理工具相对有限,但值得注意的是,Apifox 作为业界领先的接口管理工具,已经支持 gRPC 接口的调试和管理功能,这一功能的推出使得在微服务架构中广泛应用的 gRPC 变得更加便捷。Apifox 提供全面的兼容性,涵盖 gRPC 的四种调用类型:
- Unary:一元调用
- Server Streaming:服务端流
- Client Streming:客户端流
- Bidirectional Streaming:双向流
下文将通过一个示例场景简要演示如何在 Apifox 中新建 gRPC 项目并针对接口发起调试。
步骤1:新建 gRPC 项目
在 Apifox 中登录并新建一个 gRPC 项目,点击“新建项目”按钮,选择 gRPC 类型,填写项目名称后轻点“新建”按钮。
步骤2:导入.proto
文件
导入定义 gRPC 接口所使用的服务、方法和消息的 .proto
文件。你可以将文件拖拽至其中或使用文件在线 URL 完成导入。
步骤3:调试 gRPC
文件导入后,Apifox 将基于 .proto
文件内容生成对应的接口信息,然后就可以进行调试。
通过这些简单的步骤,你可以在 Apifox 中方便地管理和调试你的 gRPC 项目。这个功能非常强大,更具体的你可以访问 Apifox 的 gRPC 帮助文档,赶快去试试吧!
总结
我们讨论了如何将 FastAPI 与 gRPC 结合使用,这涉及到创建 FastAPI 应用来作为一个 HTTP 与 gRPC 之间的桥梁。首先是定义 gRPC 服务的 ProtoBuf 文件,然后生成 Python 绑定的 gRPC 代码,接着实现 gRPC 服务器来处理远程调用。
在 FastAPI 应用中,作为 gRPC 客户端,用于接收来自客户端的 HTTP 请求并将其转发到 gRPC 服务,然后将 gRPC 服务的响应返回给客户端。这个过程需要确保 FastAPI 应用和 gRPC 服务器能够正常运行无错误,并且有正确的网络配置,从而确保最终用户可以通过 HTTP 访问提供的服务。如果无法访问 FastAPI 提供的 API 端点,可能是因为多种原因,如端口冲突、防火墙限制或程序错误等,这些都需要进行仔细的排查和调试。
最后,介绍了如何利用 Apifox 进行 gRPC 接口调试和管理,Apifox 是一个非常强大的接口测试、管理工具,赶快去体验一下吧!
参考链接:
知识拓展: