微服务架构盛行,微服务分分合合很常见,大家的微服务系统都是如何设计和演进的?

2022-04-12 14:03:56 +08:00
 lotusp

之前经历的一个项目,最开始就是按微服务设计的架构 但随着业务的演进,经历过一个服务逐渐变大后,拆分成两个 也经历过服务一开始拆的很小导致数据一致性问题,后来把几个服务合并为一个

微服务拆分的粒度始终是一个难题,MartinFowler 在他几年前的文章中推荐单体优先的原则,如果不确定该不该拆,那就先不拆,等有必要的时候再拆,以演进的思路来看待微服务的拆分。

单体优先,到关键节点再去拆分,先前根据自己项目实际经验总结了迭代开发中拆分微服务的经验: 迭代开发中的微服务拆分

最近几年相信很多系统都在往微服务上迁移 大家的系统都是怎么样的演进路线? 一般微服务是以怎样的原则来划分? 在微服务实践过程中有什么踩坑或者经验分享?

欢迎大家分享讨论

3162 次点击
所在节点    程序员
16 条回复
ericgui
2022-04-12 14:06:15 +08:00
MartinFowler 在他几年前的文章中推荐单体优先的原则,如果不确定该不该拆,那就先不拆,等有必要的时候再拆,以演进的思路来看待微服务的拆分。


结案。
fkdog
2022-04-12 15:04:19 +08:00
我的经验就是,小公司别折腾什么微服务,没必要。

其次是水平不行也别整什么微服务,之前接受过一个号称微服务的项目,最基本的 ci/cd 、分布式事务、链路追踪、日志采集都没有,开发偷懒一个 userDao 类在各个服务里都 copy 了一份(所有微服务数据库都落在了一个 db )。共事了一段时间才发现,相当一批人对微服务的架构仅局限于注册中心+远程调用这块。
a90120411
2022-04-12 15:11:07 +08:00
个人感觉针对现有项目进行改造的话,单体优先比较实用一些。
新项目的话采用 DDD 的思想来划分比较合理。
Chinsung
2022-04-12 17:06:49 +08:00
拆不一定要拆服务,就算是单体应用,只要业务、包、模块,这些东西划分的好,完全没必要拆。你要想拆是解决什么问题,一般主要解决的都是某个业务水平扩容与单体应用水平扩容的矛盾,基于其他目的来拆,都是耍流氓
pengtdyd
2022-04-12 17:28:54 +08:00
某些小公司:开发一个就没几个人却偏偏:微服务、k8s 、自动化运维、敏捷开发全都搞一遍!
devswork
2022-04-12 18:05:59 +08:00
借楼问一下,一般情况下,什么样的场景(或者数据量、用户量、并发量)下才需要把单体拆分成微服务呢?有没有个大概的参考线?
GeruzoniAnsasu
2022-04-12 18:12:25 +08:00
@devswork

当你 **产品的用户告诉你** 他们有两三个服务中心要冗余备份但统筹管理,你的产品满足不了需求的时候。

而不是「为了方便将来能卖给」 有这种规模的用户而提前用上这样的架构



toC 的话,约等于,「用户没在微博上发网站怎么挂了」,就别用,用不上。
twing37
2022-04-12 18:18:21 +08:00
之前拆了.现在大多合成一个了.而且啥 dto,啥分层,啥 repo, 啥啥啥的都没了.现在单元测试,脚本一个文件模块梭哈
要说拆出来的服务.就是各方依赖.一搭眼就看来的基础服务.比如权限服务,状态服务之类的.没啥理由为什么拆.
byte10
2022-04-12 18:38:19 +08:00
@Chinsung 666 ,我之前的架构就是这样的,单体,但是划分好业务,随时可以拆成微服务,当然前提是数据库先拆分不同库,这样想耦合查询库都不行😂,后面随时都可以拆分成微服务。
@a90120411 DDD 是个好东西,但是 DDD 跟微服务的是一样的,还是不好划分领域边界,还是遇到粒度问题。而且 DDD 每个人看到都有点差距。另外很多餐桌鸡 不是说用 DDD 的思想去拆分微服务,而是把 DDD 的编程模型 也引入进单个微服务中,开发起来头大,反正水平差 的太多了。
haah
2022-04-12 19:08:49 +08:00
难道不是从写 PPT 开始的么?
wunonglin
2022-04-12 19:43:43 +08:00
我前公司,我和 2 个开发,我负责 angular ,go ,运维。构架是 4 个 golang 单体服务,3 个单体 php ,两个前端管理页,两个官网,数据库同一个。

现在团队解散了,目前由我来运维机器和兼职需求开发,老板还找了两个后台兼职开发。最近转 ack 了,为什么呢?

因为考虑架构问题,而且因为现在没有专人维护 php ,但是需求还在加,老板找了很多兼职的,但是没人能看懂代码(主要是业务逻辑复杂又没文档,加上框架是 yii1 )。

所以上 k8s 第一个好处就是新需求可以按模块开发。因为外包人员比较杂,不同的人有不同的思路和想法,所以中间也出现了现有的外包发现之前人对于业务设计有问题,不能扩展,代码质量极差,一旦完成需求就基本处于不可改的状态(我掌控不了这些,老板说的算)。所以按模块开发的话可以让他们在不影响别人的功能下自由发挥,日后如果要改也不会出现改一个地方就全蹦的状态(别笑,现在就是)


第二是维护方便。因为我虽然离职了,但是还是在维护服务器会出现的问题。比如 redis 他们开发只会写,从不设过期,导致经常崩。mysql 和代码是装在一起的,mysql 负载上去了之后服务器卡的不行。日志经常把磁盘写满,我还要上去删日志(写日志的方法是在程序里的,后面我自己去掉了),磁盘满了还会导致 redis 持久化问题(加上上面说的不设过期👏,我裂开),还有等等问题

现在买了阿里 mysql 和 redis ,再加上 k8s ,运维的问题省心了很多,mysql 和 redis 移除去后,服务器配置还能降低点,加上 ack 不要 master 的钱,不仅省心省力,成本还低了


第三我们的服务有要给客户离线部署的需求,经常性的。这个在刚入职的时候用的是虚拟机,不仅麻烦死,性能还低,有的客户不允许用虚拟机,还要给客户服务器搭环境,累的要死。

现在就好了,客户不用 aws 的 k8s 或者阿里的 k8s 的话我就装一个 k3s ,用 helm 一键就装上了。简直不要太爽。


第四我对于 go 和 k8s 还处于学习阶段,后面我会把旧 php 的项目重构成 go ,期间可以学到到微服务相关内容,对我肯定好处多多。


上面说的什么 ci/cd 、分布式、链路,日志。现在根部都不需要这些,等你要上,环境也有了,还不是分分钟的事?上面外包做的就是模块开发,模块间用 http 在 k8s 里面链接即可,反正是 toB 项目,性能压根不用考虑。
wunonglin
2022-04-12 19:51:25 +08:00
所以简单说就是:
1 、防止外包间互相拉屎导致单体项目不可用。
2 、维护方便
3 、搭服务方便( 5 分钟,一键安装,费用到手)
4 、自我学习
1000copy
2022-04-13 11:29:08 +08:00
微服务现在的状态,还是以为咨询公司提供赢利点为主。对 90%的公司的场景,单体很好。
lotusp
2022-04-13 11:38:42 +08:00
@Chinsung 赞同,另一个角度还是要看复杂度,业务复杂度,团队大小(开发协作的复杂度),是否有复用需求
业务复杂度一般,团队不太大,协作也没有任何问题,单体的优点还是很多的
lotusp
2022-04-13 12:00:16 +08:00
@devswork 讨论微服务拆分时机,从问题出发更好,如果单体架构也没有啥问题,当然也没必要非要引入微服务,徒增复杂度。

微服务的好处很多,但确实实施要求也高,所以在问题足够复杂的时候比较适合,比如:
1. 业务非常复杂,业务知识就多,放在一个单体服务里,知识的传递和上手本身就很困难。
2. 代码量很大,大几十万或上百万行代码,编译、排查问题都很耗时。技术上我们可以通过一些包级别的隔离尽量做到清晰,但实际操作难度也是不小的,毕竟开发人员水平各不相同,日常开发实现功能优先级更高,写代码图方便的也不在少数,所以单体越大内部耦合越严重,表现出来线上的稳定性非常差。
3. 团队逐渐变大,一起写代码,在一个单体上开发,提交 merge 的冲突比较多。人多了分小组,即便每个小组可以有专门的职责,在一个单体上开发,可以触碰到所有的代码,改动的冲突也会比较多。

开弓没有回头箭,单体往微服务迁移,还是要多方权衡,是否足够复杂,是否团队自己能搞定拆分之后的各种问题:
1. 尽量多的自动化,CI/CD ,自动化测试等
2. 上线后排查问题涉及多服务会更复杂,监控等手段得跟上
3. 多服务之间的契约稳定性保证,避免单方随意修改契约
4. 分的越多,职责越多,团队是否有足够的人来管多个服务
haolongsun
2022-04-13 12:44:28 +08:00
刚开始一把梭,梭完就知道哪些需要拆分成微服务了

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

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

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

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

© 2021 V2EX