以前的文章讨论过《互联网架构,究竟为啥要做服务化?》,随着数据量、并发量、业务复杂度的增长,互联网架构会出现以下问题:

  • 代码到处拷贝

  • 底层复杂性扩散

  • 基础库(so/jar/dll)耦合

  • SQL质量得不到保障,业务相互影响

  • 数据库耦合

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

那么问题来了,微服务架构多“微”才合适?

行业内有这样四类常见实践。

实践一:统一服务层


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

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

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


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

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

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

服务层架构如何细分?

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

  • 用户相关的子业务,访问user服务

  • 好友相关的子业务,访问friend服务

  • 群组相关的子业务,访问group服务

  • 消息相关的子业务,访问msg服务

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

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

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

  • 调用方依赖分发层,传入服务号

  • 分发层依赖服务层,通过服务号参数分发

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

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

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

  • 服务层,整个群业务是一个服务

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

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


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

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

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

这样的话,架构就从:


进化为:

  • 修改群信息服务

  • 增加群信息服务

  • 获取群信息服务

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

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

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

  • 服务都能够独立部署

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

  • 拆得越细,耦合相对会减小

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

  • 扩展性更好

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

  • 拆得越细,系统越复杂

  • 系统之间的依赖关系也更复杂

  • 运维复杂度提升

  • 监控更加复杂

  • 出问题时定位问题更难

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

微服务架构,多“微”才合适?相关推荐

  1. 微服务架构多“微”才合适

    微服务架构多"微"才合适 转自:http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959530&id ...

  2. SpringCloud学习笔记(二):微服务概述、微服务和微服务架构、微服务优缺点、微服务技术栈有哪些、SpringCloud是什么...

    从技术维度理解: 微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底 地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事, 从技术角度看就是一种小而独立的处理过程,类 ...

  3. 【微服务架构】微服务与SOA架构(3)

    前文: [微服务架构]微服务与SOA架构(1) [微服务架构]微服务与SOA架构(2) 比较架构特性 组件(component)是软件中的一个单位,具有定义良好的接口.定义良好的角色/责任集合.组件是 ...

  4. python 微服务架构_Python微服务架构chili_chicken

    ### chili_chicken是什么 现在微服务架构大火,企业项目纷纷向微服务转变.Python目前处于稳步发展的状态,用于多领域,比如人工智能.爬虫.运维.web等,我们此贴只讨论web方向.现 ...

  5. Re:从 0 开始的微服务架构--(三)微服务架构 API 的开发与治理--转

    原文来自:聊聊架构公众号 前面的文章中有说到微服务的通信方式,Martin Folwer 先生在他对微服务的定义中也提到"每个服务运行在其独立的进程中,服务与服务间采用 轻量级的通信机制 互 ...

  6. 【微服务架构】微服务设计模式

    这是微服务架构系列文章的第 3 篇 高可用性.可扩展性.故障恢复能力和性能是微服务的特征.您可以使用微服务架构模式来构建微服务应用程序,从而降低微服务失败的风险. 模式分为三层: 应用模式 应用程序模 ...

  7. 同事操作两个数据源保持事务一致_「微服务架构」微服务架构中的数据一致性...

    在微服务中,一个逻辑上原子操作可以经常跨越多个微服务.即使是单片系统也可能使用多个数据库或消息传递解决方案.使用多个独立的数据存储解决方案,如果其中一个分布式流程参与者出现故障,我们就会面临数据不一致 ...

  8. 微服务架构(一):什么是微服务

    解析微服务架构系列文章将分几篇描述微服务的定义.特点.应用场景.企业集成架构的演进以及微服务转型思路和技术决策考虑等内容,并以IBM技术为例介绍如何实现微服务架构转型. 为什么需要微服务架构 &quo ...

  9. 漫谈单体架构与微服务架构(上):单体架构

    最近微服务架构特别火爆,就跟人工智能.区块链一样,软件架构设计如果不提微服务,感觉就像是与世界先进的架构风格和开发技术脱了节似的,各方各面都无法彰显高大上的气质. 本来再打算使用一套系列文章来讨论微服 ...

最新文章

  1. LINKs: Xamarin.Forms + Prism
  2. java平台设计zhe_基于java平台的网上评教系统的设计与实现
  3. DVD碟片输出与刻录简单流程
  4. 计算机管理无法连接虚拟磁盘服务,虚拟磁盘服务错误怎么操作【图文教程】
  5. 谷歌android红米手机,小米多款谷歌Android One手机曝光:全是红米系列
  6. 符号实体(转义字符)
  7. Delphi2CS破解 Delphi 转换C#
  8. 移动端业务数据管理平台+健康管理平台+banner管理+图标管理+订单管理+门店内容管理+用户信息管理+版本更新管理Axure通用web端高保真交互app业务数据管理平台
  9. ImageMagick命令执行漏洞(CVE-2016–3714)利用及测试
  10. 5.企业安全建设入门(基于开源软件打造企业网络安全) --- 业务安全
  11. 不是吧!你还不懂DHT协议?
  12. linux中-f的含义,linux 下shell中if的“-e,-d,-f”的含义
  13. OneStep 移植
  14. 排序算法——希尔排序的图解、代码实现以及时间复杂度分析
  15. 麻雀要革命2 第44节:怦然心动的星月童话
  16. React学习(入门了解)
  17. 国际标准SHARE78七级灾难备份方案
  18. Android中的适配
  19. PAT-2019年冬季考试-甲级 7-1 Good in C (20分)
  20. 数据库Access denied失败解决方法

热门文章

  1. Android自定义圆形进度条
  2. Mybatis的第三章动态sql总结
  3. 人工智能深度学习框架MXNet实战:深度神经网络的交通标志识别训练
  4. Java Web——图像上传
  5. windows server2008R2故障转移群集
  6. udhcp源码详解(四) 之租赁IP的管理
  7. 客户端,服务器,天气预报
  8. 程序员 :超越软件蓝领的七种武器
  9. 【深度学习】2个经典的练手CNN源码与MNIST数据集测试结果
  10. 基于 MATLAB 的 PCM 编码解码实现