首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >告诉我!微服务,究竟拆分到什么粒度才合适?(第92讲,长文收藏)

告诉我!微服务,究竟拆分到什么粒度才合适?(第92讲,长文收藏)

作者头像
架构师之路
发布2025-11-24 15:14:55
发布2025-11-24 15:14:55
10
举报
文章被收录于专栏:架构师之路架构师之路

《架构师之路:架构设计中的100个知识点》

92.微服务粒度

微服务架构的6大好处(第81讲,长文收藏)》中提到,随着数据量、并发量、业务复杂度的增长,互联网架构会出现以下问题:

1. 代码到处拷贝;

2. 底层复杂性扩散;

3. 基础库(so/jar/dll)耦合;

4. SQL质量得不到保障,业务相互影响;

5. 数据库耦合;

“服务化”是一个很好的解决上述痛点的方案。

又有童鞋问我说,那微服务架构多“微”才合适?

一般有这样四类实践。

实践一:统一服务层。

图片
图片

这是最粗犷的玩法,所有基础数据,都通过一个统一的服务来进行访问。

在业务不是特别复杂的时候,这不失为一个快速分层的方案,一旦业务变得复杂,服务层会变得非常重,成为耦合焦点。

以微信场景为例,假设通过一个通用的服务层来访问基础数据。

图片
图片

则只有一个统一的服务层,用户信息,好友信息,群组信息,消息信息都通过这个服务层来访问。

实践二:一个子业务一个服务。

如果所有的数据访问都通过一个服务层来访问,那么一行代码出故障,就将影响整个服务,所以更合理的做法是在服务层进行拆分。

服务层架构如何细分?

垂直拆分是个好的方案,将子业务分拆,那么微信的服务化架构或许会变成下面的样子:

图片
图片

1. 用户相关的子业务,访问user服务;

2. 好友相关的子业务,访问friend服务;

3. 群组相关的子业务,访问group服务;

4. 消息相关的子业务,访问msg服务;

这样的话,一个服务出问题也不会影响其他服务,与此同时,数据层也按照业务垂直拆分开了。

服务粒度变细之后,出现一个新的问题,业务与服务的连接关系变复杂了,有什么好的优化方案么?

图片
图片

常见的,加入一个高可用服务分发层(Service Mesh不就是这么干的么),并在协议设计时加入服务号,可以减少蜘蛛网状的依赖关系:

1. 调用方依赖分发层,传入服务号;

2. 分发层依赖服务层,通过服务号参数分发;

实践三:一个数据库对应一个服务。

数据访问服务最初是从DAO/ORM的数据访问需求过来的,所以有些公司也有一个数据库一个服务的玩法。

一个子业务对应一个服务的玩法如下图:

图片
图片

1. 服务层,整个群业务是一个服务;

2. 存储层,实际可能对应了群信息、群成员、群消息等多个数据表;

拆分成一个数据库一个服务,则架构会变成下面的样子:

图片
图片

群信息库,群成员库,群消息库之间也解耦开,不会相互影响。

实践四,一个接口对应一个服务。

微服务架构中,更极端的,甚至一个接口对应一个微服务。

这样的话,架构就从:

图片
图片

进化为:

图片
图片

1. 修改群信息服务;

2. 增加群信息服务;

3. 获取群信息服务;

多个服务操纵同一个数据库,任何接口服务出问题,都不会影响其他接口服务。使用这种方案的,一般与开发语言特性结合比较紧密,例如golang。

上文中谈到的服务化与微服务,不同粒度的服务化各有什么优劣呢?

总的来说,细粒度拆分的优点有:

1. 服务都能够独立部署;

2. 扩容和缩容方便,有利于提高资源利用率;

3. 拆得越细,耦合相对会减小;

4. 拆得越细,容错相对会更好,一个服务出问题不影响其他服务;

5. 扩展性更好;

细粒度拆分的不足也很明显:

1. 拆得越细,系统越复杂;

2. 系统之间的依赖关系也更复杂;

3. 运维复杂度提升;

4. 监控更加复杂;

5. 出问题时定位问题更难;

互联公司,以“子业务”作为微服务粒度是最常用,订单服务,用户服务,支付服务等等。

知其然,知其所以然。

思路比结论更重要。

==全文完==

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档