微服务之间,如何处理常量、DTO 冗余问题?

49 天前
 justdoit123
我们的微服务(都是 python3),每个服务单独一个 repo 。在写一些跨服务的代码的时候,会遇到常量代码共享的问题。


比如,某个实体某字段的 flag 。这样的常量,在本服务的代码里,肯定是定义了一堆这个字段的 flag 。但是,到了另一个服务的时候,没有这些定义。以往都是在别的服务就地再写一遍。


我感觉这种做法实在是很不方便,而且很脏。

我的想法是,应该把这些没有什么逻辑的“常量”代码(不限于常量,还有各种数据封装的 class )放在一个 repo 里,单独发包,让其它服务引用。至于是每个服务单独有一个常量库,还是所有服务共享一个常量库,则可以视情况而定。

想请教各位,这种做法如何?以及有没有更好的实践。感谢!
3975 次点击
所在节点    程序员
29 条回复
Maboroshii
49 天前
protobuf 和 grpc 呗
kapr1k0rn
49 天前
monorepo
qxmqh
49 天前
换成单体。
pxiphx891
48 天前
没写过 python ,不过 java 一直是这样的,打一个单独的包,所有人依赖这个包
pigspy
48 天前
服务不多的情况下直接用 monorepo
MIUIOS
48 天前
参考 java 暴露出 dto do vo 这些单独一个包,其他模块随便引入
NoKey
48 天前
团队执行力强(盖的住成本)的话,搞公共包,内网搭 maven 仓,拉下来就能用,不过这需要额外的人力去维护这一套;一般的团队,重复写就重复写,要么就是相互复制,除了消耗人力,又不会怎么样😂
justdoit123
48 天前
@Maboroshii grpc 可以上。但是需要共享的代码,不局限于 protobuf 描述的数据。
justdoit123
48 天前
monorepo 倒是也可以。但是我感觉组员有时候写得很野,跨服务乱引用。综合来看,不太适用我们。
justdoit123
48 天前
综合上面的回答,可能适合的方案还是服务的“常量”代码抽成一个包。
blackmatch
48 天前
1.抽成一个公共包,各个服务引入调用即可。
2.做一个配置中心服务,所有服务统一读取同一份配置,做好更新和兜底策略。好处是修改配置不用发版,在配置中心改一下就可以了。
patrickpu
48 天前
需要一个 common 的基础包
iyaozhen
48 天前
一般是吧这些和 idl 绑定,idl (比如 pb 描述)生成这个仓库,各方来引用

不过怎么说呢,没必要强行微服务。特别是 python 。python 4 个服务一个分 1c 。还不如一起在 4c 的机器性能好
sampeng
48 天前
你这就属于,想用微服务规范和隔离开发,但又已经看到微服务最大的蛋疼。
最好 code reviewer ,你说的问题都不是问题。monorepo 又不是想怎么写怎么写
justdoit123
48 天前
@iyaozhen 微服务是既定现状,前人拆分的,至少已经快 8 年了,暂时没资源去改回单体。
Rickkkkkkk
48 天前
common 包用起来其实没那么方便,远远不如代码里直接写一个 const 来的简单。
justdoit123
48 天前
@sampeng 几乎没有 code review 。

说得难听点,现在最好的 "code review" 就是测试 + 一上生产环境就挂掉。没埋雷,半夜爆炸就不错。

所以,我才想多引入一下非人工的花销来尽量保证稳定。比如:

1. type hint 。有点作用。
2. 写 DTO 而不是一个 dict 满天飞。不然回头维护的时候很慢热,记不住 key ,经常导致 KeyError 。也算有点作用。
3. 常量共享而不是用到就“手抄”一遍,这种手抄还会抄错。


不怕各位笑话。我们还有一个“运行时的常量共享方案”是这样的:每个服务提供一个接口返回本服务的一些常量定义,然后服务启动的时候,去请求一遍这些常量定义。 我感觉是很难用。运行时、纯动态,你写代码的时候,根本不知道自己引用的值存不存在。IDE 也无法给你补全。
midsolo
48 天前
抽出来打一个 common 包,每个服务引入即可。

common/
├── inner/
│ ├── dto
│ ├── vo
│ └── ...
├── outer/
│ ├── dto
│ ├── vo
│ └── ...
└──
183shl
48 天前
我的偏好是只把用到的或可能用到的再写一遍,可以硬编码的就直接写再放个注释。费点力气但是感觉体验很好。如果复用很强的再抽到 common ,因为不喜欢跳来跳去😁
justdoit123
48 天前
@183shl 这个方案的阻力就在这里。

我们其实有一个 common 库,里面放了一堆 utils 、架构 base 之类的代码。之前的 leader 强调,这里面不允许放入任何业务逻辑相关的代码。所以以前常量也没放这里。

团队的人会觉得改这里面的代码,还要去升版本,很麻烦。

有时候就直接在业务 repo 里,也写个 xxx utils 。


我觉得你说的最后一句是有道理的,复用很强的再抽到 common 。这样就比较平衡。偶尔一两次的依赖,就直接抄一遍。依赖次数多了,再抽到 common 。很明显一定会被依赖很多次的,一开始就直接写 common 里。

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

https://ex.noerr.eu.org/t/1161025

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

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

© 2021 V2EX