V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lotusp
V2EX  ›  程序员

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

  •  
  •   lotusp · 2022-04-12 14:03:56 +08:00 · 3393 次点击
    这是一个创建于 938 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    欢迎大家分享讨论

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


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

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

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

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



    toC 的话,约等于,「用户没在微博上发网站怎么挂了」,就别用,用不上。
    twing37
        8
    twing37  
       2022-04-12 18:18:21 +08:00
    之前拆了.现在大多合成一个了.而且啥 dto,啥分层,啥 repo, 啥啥啥的都没了.现在单元测试,脚本一个文件模块梭哈
    要说拆出来的服务.就是各方依赖.一搭眼就看来的基础服务.比如权限服务,状态服务之类的.没啥理由为什么拆.
    byte10
        9
    byte10  
       2022-04-12 18:38:19 +08:00
    @Chinsung 666 ,我之前的架构就是这样的,单体,但是划分好业务,随时可以拆成微服务,当然前提是数据库先拆分不同库,这样想耦合查询库都不行😂,后面随时都可以拆分成微服务。
    @a90120411 DDD 是个好东西,但是 DDD 跟微服务的是一样的,还是不好划分领域边界,还是遇到粒度问题。而且 DDD 每个人看到都有点差距。另外很多餐桌鸡 不是说用 DDD 的思想去拆分微服务,而是把 DDD 的编程模型 也引入进单个微服务中,开发起来头大,反正水平差 的太多了。
    haah
        10
    haah  
       2022-04-12 19:08:49 +08:00
    难道不是从写 PPT 开始的么?
    wunonglin
        11
    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
        12
    wunonglin  
       2022-04-12 19:51:25 +08:00
    所以简单说就是:
    1 、防止外包间互相拉屎导致单体项目不可用。
    2 、维护方便
    3 、搭服务方便( 5 分钟,一键安装,费用到手)
    4 、自我学习
    1000copy
        13
    1000copy  
       2022-04-13 11:29:08 +08:00
    微服务现在的状态,还是以为咨询公司提供赢利点为主。对 90%的公司的场景,单体很好。
    lotusp
        14
    lotusp  
    OP
       2022-04-13 11:38:42 +08:00
    @Chinsung 赞同,另一个角度还是要看复杂度,业务复杂度,团队大小(开发协作的复杂度),是否有复用需求
    业务复杂度一般,团队不太大,协作也没有任何问题,单体的优点还是很多的
    lotusp
        15
    lotusp  
    OP
       2022-04-13 12:00:16 +08:00   ❤️ 1
    @devswork 讨论微服务拆分时机,从问题出发更好,如果单体架构也没有啥问题,当然也没必要非要引入微服务,徒增复杂度。

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

    开弓没有回头箭,单体往微服务迁移,还是要多方权衡,是否足够复杂,是否团队自己能搞定拆分之后的各种问题:
    1. 尽量多的自动化,CI/CD ,自动化测试等
    2. 上线后排查问题涉及多服务会更复杂,监控等手段得跟上
    3. 多服务之间的契约稳定性保证,避免单方随意修改契约
    4. 分的越多,职责越多,团队是否有足够的人来管多个服务
    haolongsun
        16
    haolongsun  
       2022-04-13 12:44:28 +08:00
    刚开始一把梭,梭完就知道哪些需要拆分成微服务了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2942 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:51 · PVG 22:51 · LAX 06:51 · JFK 09:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.