有大佬使用 Python 技术栈搞过微服务么?

2021-04-12 16:55:46 +08:00
 15399905591
目前准备使用 flask 搭建微服务,但是有以下问题不知道解决

1 、网关怎么处理?
2 、注册中心问题
3 、分布式事务问题

上面这些问题在 java 微服务网关有 Spring Cloud 那一套, 那 python 使用什么技术栈呢?
4231 次点击
所在节点    Python
35 条回复
sujin190
2021-04-12 17:09:06 +08:00
没有需求要用很多机器组集群似乎不是很需要注册中心啥的吧,python 估计这种大型集群用的少,搞得人很少
15399905591
2021-04-12 17:11:40 +08:00
@sujin190 我想了一个替代方案, 每个服务配一个子域名, 使用 nginx 通过 url 路径自动转发子域名。但是这种方案感觉不够好,如果需要扩容的时候,需要手动修改配置。
abersheeran
2021-04-12 17:14:18 +08:00
有种东西叫 k8s
tabris17
2021-04-12 17:16:00 +08:00
nameko+envoy
sujin190
2021-04-12 17:20:43 +08:00
@15399905591 #2 如果你只是想要这样的,nginx 的 lua 版本 open'rest905591 #2 如果你只是想要这样的,nginx 的 lua 版本 openresty 应该是支持通过接口配置 upstream 的吧,你直接在服务启动的过程中调接口添加自己就好了啊

否则如所 @abersheeran #3 说 k8s 呗,k8s 的网关、自动注册、健康监控啥的本来就和你用啥语言啥框架无关,要啥都有了吧
15399905591
2021-04-12 17:26:45 +08:00
@sujin190 这些只是解决了服务治理问题, 主要问题是分布式事务问题。
abersheeran
2021-04-12 17:27:55 +08:00
对了,你用 Python 搞微服务。那我推销一下自研的 rpc 框架 https://github.com/abersheeran/rpc.py 跨语言,但是如果客户端和服务端都是 python,体验效果最好。调用远程函数就跟调用本地函数一样。
abersheeran
2021-04-12 17:33:28 +08:00
@15399905591 分布式事务的实现和语言无关啊,都是调第三方服务的 API 。
15399905591
2021-04-12 17:34:52 +08:00
@abersheeran 已 star
sujin190
2021-04-12 17:35:17 +08:00
@15399905591 #6 所谓分布式事务大多实现都是两步提交,其核心还是每个操作都要实现执行、提交和回滚三个操作,这个自己封装一下实现也不麻烦吧,估计能够直接像数据库一样无感知的分布式事务应该是不存在的吧
15399905591
2021-04-12 17:36:25 +08:00
@abersheeran 能推荐下类似 python 用的分布式事务组件
15399905591
2021-04-12 17:41:47 +08:00
@sujin190 感谢大佬不理赐教,但我不太明白同步接口怎么解决呢? 比如我下订单,有创建订单与扣减库存两个接口在不同服务。 我怎么保证两边同时提交了。
sujin190
2021-04-12 17:55:08 +08:00
@15399905591 #12 其实不复杂,就是创建订单和减库存都需要提供三个接口,分别是执行创建订单、提交创建订单操作和回滚创建订单操作,扣减库存也是一样的

具体实现如果你用的 mysql 的话,可以在第一个接口就把数据提交过去,然后开 mysql 事务,然后执行 sql,但是不提交 mysql 事务,如果创建订单和扣减库存两个操作的第一个接口都执行成功的话,就调用创建订单和扣减库存的第二个接口,提交刚才第一个接口打开的 mysql 事务,前两个接口有任何事务再走第三个接口回滚刚才的操作就行,回滚的时候可以判断下,如果 mysql 事务还没提交就直接回滚 mysql 的事务就行,否则可以考虑删掉之前添加的数据,当然如果你觉得删数据有风险,这种很小概率失败的风险也无所谓当然也可以不删

开 mysql 事务的时候注意添加一个超时,超时也执行回滚,一般来说分布式事务的一致性肯定是要弱于 mysql 事务这种的,就看你能承受多高的不一致概率了,如果像扣钱这样需要非常高一致性的操作就最好不要用分布式事务了
bthulu
2021-04-12 18:15:59 +08:00
@sujin190 有强一致的分布式事务解决方案吗
15399905591
2021-04-12 18:21:05 +08:00
@sujin190 多谢大佬解惑, 我自己去试试
johnsona
2021-04-12 18:43:48 +08:00
traefik consul 和 rm -rf
jhdxr
2021-04-12 18:56:00 +08:00
python 其实也可以配合 Spring Cloud 用,我记得之前看到过 eureka client 的 python 版本
so1n
2021-04-12 19:18:07 +08:00
我也是自己手撸一套,但是注册中心还没弄
hunk
2021-04-12 19:31:40 +08:00
一看标题,感觉是 k8s 合适,以 api 啥的做好规划和区分。
sujin190
2021-04-12 19:43:01 +08:00
@bthulu #14 不能强的原因是分布式事务步骤太多,环境不能完全一致,延迟不稳定,如果无法解决中间问题就很难很强,而分布式数据库就是用设计来解决这些问题的吧,简化步骤,构造一致性环境延迟,增加补偿纠错环节,所以你真需要那么高的一致性话,还不如直接用分布式数据来的靠谱

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

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

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

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

© 2021 V2EX