写了个轮子 fast-grpc,用 Python 轻松开发 grpc 接口 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
yatao
V2EX    Python

写了个轮子 fast-grpc,用 Python 轻松开发 grpc 接口

  •  
  •   yatao 2023-05-19 00:10:15 +08:00 2603 次点击
    这是一个创建于 877 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简介

    Fast-GRPC 旨在为开发者提供更轻松快捷的 Python gRPC 接口开发方式,受到 FastAPI 的启发,用更 human 的方式编写 gRPC 接口,通过使用 Python schema 直接定义 gRPC 接口,然后自动生成 grpc proto ,从而省去了在 proto 文件中再次定义接口的繁琐工作;框架简化了 Python gRPC 开发流程,同时提供与 FastAPI 类似的接口编写风格,接口可以支持同步和异步写法,并且还可以使用 Middleware (代替 grpc 拦截器,自带的拦截器感觉不太好用)。个人认为,在 Python 微服务实践中,结合 FastAPI 和 gRPC 并利用流行的微服务基础设施(比如微软 dapr ),将是一个不错的选择。

    安装

    需要 python 3.7+

    pip install python-fast-grpc 

    快速上手

    下面是一个简单的 Fast-GRPC 示例,展示如何创建一个 gRPC 服务

    from fast_grpc import BaseSchema, FastGRPC, ServicerContext, method app = FastGRPC() class HelloRequest(BaseSchema): name: str class HelloReply(BaseSchema): message: str class Greeter: @method("SayHello", request_model=HelloRequest, response_model=HelloReply) async def say_hello(self, request: HelloRequest, context: ServicerContext) -> HelloReply: return HelloReply(message=f"Greeter SayHello {request.name}") app.add_service(Greeter) # 添加 Greeter 服务 # 启动 gRPC 服务。无需手动编写 proto 文件,Fast-GRPC 会根据你的 Python 代码自动生成 proto 文件,并编译为 Python gRPC 代码,最后启动 gRPC 服务 app.run() 

    在上面的示例中,我们首先使用 FastGRPC 创建了一个 gRPC 应用。接下来,定义了一个 gRPC 服务 Greeter,使用 method 装饰器标记了一个 RPC 方法 say_hellomethod 接受三个参数:RPC 方法名、请求模型 HelloRequest 和响应模型 HelloReplysay_hello 方法可以支持同步和异步代码,对于同步代码,会使用线程来模拟异步执行。

    最后,我们将 Greeter 服务添加到 gRPC 应用中,并通过 run 方法启动 gRPC 服务器。Fast-GRPC 会根据添加的 Greeter 服务的接口定义自动生成 .proto 文件和 Python gRPC 代码,简化了 Python gRPC 的开发步骤,更符合 Python 的使用习惯。

    接下来,我们通过一个客户端调用来演示效果:

    import grpc import greeter_pb2 as pb2 import greeter_pb2_grpc as pb2_grpc channel = grpc.insecure_channel("127.0.0.1:50051") stub = pb2_grpc.GreeterStub(channel) respOnse= stub.SayHello(pb2.HelloRequest(name="fastGRPC")) print("Greeter client received: ", response) 

    相关链接

    Fast-GRPC GitHub 仓库

    下一步计划

    目前,Fast-GRPC 支持的功能还比较简单,未来将继续改进和完善。如果您有任何建议或意见,欢迎提交 issue 或者 PR 。

    6 条回复    2023-06-10 09:59:55 +08:00
    hauzerlee
        1
    hauzerlee  
       2023-05-21 13:47:46 +08:00
    赞,我 fork 一个来搞搞。unix system-v rpc 已经是这种方式了,以前搞过
    akaHenry
        2
    akaHenry  
       2023-05-30 08:19:35 +08:00
    https://github.com/bali-framework/bali

    可以看看 Bali 框架, 基于 fastapi + grpc, 360 的团队开源的.
    yatao
        3
    yatao  
    OP
       2023-06-01 00:05:05 +08:00
    @akaHenry 感谢推荐,但我觉得不是一个东西,抽象 django 那一套理论对于简单的增删改查确实方便不少,实际开发使用场景并不简单,尤其使用微服务架构之后,并且这种设计导致开发的代码都是和框架的思想深度绑定的,个人更喜欢整洁架构设计那套思想,我们实践中也是按照这套理论来实施的
    akaHenry
        4
    akaHenry  
       2023-06-01 14:17:16 +08:00
    @yatao 嗯. bali 仿 django-rest-framework 设计了 API 层. 熟悉 drf 的用起来, 很方便.

    另外, 其实 bali 也可以常规方式定义 route, 也就是可以不使用这套.

    灵活性还是有的. (这项目和我无关, 碰巧看你这个轮子, 刚好匹配)

    当然, 轮子还是自己造的香. (毕竟也很简单, 用啥都 OK)
    yatao
        5
    yatao  
    OP
       2023-06-09 23:12:19 +08:00
    @akaHenry 嗯,特地去看了下这个项目,说下我的个人看法
    从架构设计的角度来看,bili 做的是业务的抽象层,它在业务层抽象了一层标准,开发按照这个标准去写,然后它会将业务代码转换为相应的基础框架(如 FastAPI 和 gRPC )所需的代码。这不是我想要的东西,我们也有自己通用的业务脚手架,比如标准的 REST 处理 handler ,如果是一些简单的增删改也很方便。这取决于公司的开发规范和标准,我估计 bili 想做的也是这个事,毕竟 python 在工程方面也没统一标准。
    相比之下,FastgRPC 的目标是仅提供 gRPC 框架,就像 FastAPI 封装了 Starlette 一样。我个人也比较看好 typing 的风格,也是一个很好的方向。
    akaHenry
        6
    akaHenry  
       2023-06-10 09:59:55 +08:00
    嗯. 都行.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2744 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 08:37 PVG 16:37 LAX 01:37 JFK 04:37
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86