快速暴露 Python 函数作为 HTTP 服务

2021-02-18 08:48:16 +08:00
 abersheeran

给算法岗擦屁股的人应该明白那种痛苦的感觉。为了解耦不同服务之间的程序,但又能像调用原生函数一样调用远程函数,我在过去写下了 rpc.py。用了一段时间之后,过年守岁的时候闲着没事花了一夜把 coverage 提高到了 100%,修了几个隐藏的小 bug,现在基本稳定。

当然在造轮子之前我了解和使用过 grpc,怎么说呢……用起来挺蛋疼的。注册很麻烦,调用很麻烦,和其它服务配合起来也很麻烦。于是研究了一下 grpc 的原理,自己写了一个。

由于是基于 ASGI/WSGI 这两个通用网关协议的,所以 HTTP 部分我就可以偷懒不处理了,用社区发展十几年的成果就行。你想用 HTTP/1.0 、1.1 还是 2.0,或者更激进点直接 3.0,都可以。Python 社区都有现成方案。

基于这两通用网关协议,还有一个好处就是可以方便的和现有的 Django 、Bottle 、Flask 、Starlette 、FastAPI 、Sanic 、CherryPy 、Responder 、IndexPy……总之你能想到的支持这两个协议中至少一种的任何 Web 框架集成。也就是说,鉴权之类的工作,都可以用现成的。自己独立弄一个是不存在的,如果可以,这辈子我都不想自己造轮子了。

序列化协议上是天然解耦的,目前只内置了 JSON 、pickle 和 msgpack,如果大家还有什么高性能序列化协议,可以提 PR 或者发个 Discussion 。当然,也可以只在自己代码里用,自己注册一个还是很方便的。

基于 Type hint,可以自动转换类型,客户端在调用的时候还会主动检查类型。当然你不用 Type hint 也是可以正常用的。基于 Type hint 生成文档,似乎新框架都自带这个了哈哈哈

https://github.com/abersheeran/rpc.py

最后,造这个轮子的主要原因就是之前某项目大概有上千个函数需要批量转成可远程调用的接口。历史包袱、历史包袱。

4702 次点击
所在节点    Python
37 条回复
lipcao
2021-02-18 09:34:59 +08:00
过年守岁的时候闲着没事花了一夜把 coverage 提高到了 100% 重点,要考
yazoox
2021-02-18 10:05:28 +08:00
不明觉厉!
abersheeran
2021-02-18 10:11:34 +08:00
@lipcao 这算啥重点……

@yazoox 用用就明白了。用法还是很简单的。
jenlors
2021-02-18 10:13:55 +08:00
楼主 github 头像本人?
fy1993
2021-02-18 10:16:22 +08:00
楼主 github 头像本人?
musi
2021-02-18 10:18:56 +08:00
看了下楼主的博客,这文采做程序员真的屈才了。多写写小说没准已经拍成电视剧了
LengthMin
2021-02-18 10:22:55 +08:00
楼主也是 `index.py` 的作者
madpecker009
2021-02-18 10:29:07 +08:00
这妹子好看啊
abersheeran
2021-02-18 10:32:44 +08:00
@madpecker009 谢谢。

@musi 哈哈哈,谢谢你看我的小说。

@LengthMin 我是个取名废柴,要不是 web.py 被人用了,Index.py 估计会被我改成这个。
jenlors
2021-02-18 10:34:01 +08:00
看了楼主 blog,不去写小说可惜了。
abersheeran
2021-02-18 10:48:29 +08:00
@long2ice 😀
z740713651
2021-02-18 10:51:06 +08:00
大佬太牛了 公司业务正好要用到 rpc.py 感谢大佬
lewinlan
2021-02-18 10:53:12 +08:00
grpc 蛋疼是 python 的问题。换其他语言写 grpc 快乐的很
abersheeran
2021-02-18 11:03:39 +08:00
@z740713651 用呗。我们也在用。

@lewinlan 那就没办法了。
no1xsyzy
2021-02-18 11:30:01 +08:00
所以说 Client.remote_call 和 RPC.register 有什么形式上的差别吗?
完全可以用同一个函数去注册不是吗?
Client 没必要分离吧(
johnsona
2021-02-18 12:03:44 +08:00
是不是要有负载均衡(乱说的 bushi
silymore
2021-02-18 12:36:58 +08:00
开源工作相关的框架需要公司同意吗
gscsnm
2021-02-18 12:37:53 +08:00
喜欢你的博客,请问下博客是自己开发的吗?还是用的什么?
poplar50
2021-02-18 13:15:51 +08:00
楼主 github 头像本人?
jaswer
2021-02-18 13:34:52 +08:00
楼主 github 头像本人?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/753783

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX