正文
Chris Richardson 说:“微服务”是一个很糟糕的名字,它导致开发人员创建了许多粒度很小的服务,每个服务拥有一个单独的 REST 端点。不仅如此,这个名字还暗示了微服务在开发者心目中的重要位置。例如,人们会说“我们可以用微服务来解决这个问题”;我也看到了越来越多的“某某微服务框架”,而实际上,这些框架跟微服务架构不一定有太多联系,它们只是简单的 Web 框架。使用“微服务架构”这个名字会更恰当些。它是一种架构风格,它把一系列协作的服务组织成一个系统来支撑业务。
-
服务注册
,服务提供方将自己调用地址注册到服务注册中心,让服务调用方能够方便地找到自己。
-
服务发现
,服务调用方从服务注册中心找到自己需要调用的服务的地址。
-
负载均衡
,服务提供方一般以多实例的形式提供服务,负载均衡功能能够让服务调用方连接到合适的服务节点。并且,节点选择的工作对服务调用方来说是透明的。
-
服务网关
,服务网关是服务调用的唯一入口,可以在这个组件是实现用户鉴权、动态路由、灰度发布、A/B 测试、负载限流等功能。
-
配置中心
,将本地化的配置信息(properties, xml, yaml 等)注册到配置中心,实现程序包在开发、测试、生产环境的无差别性,方便程序包的迁移。
-
API 管理
,以方便的形式编写及更新 API 文档,并以方便的形式供调用者查看和测试。
-
集成框架
,微服务组件都以职责单一的程序包对外提供服务,集成框架以配置的形式将所有微服务组件(特别是管理端组件)集成到统一的界面框架下,让用户能够在统一的界面中使用系统。
-
分布式事务
,对于重要的业务,需要通过分布式事务技术(TCC、高可用消息服务、最大努力通知)保证数据的一致性。
-
调用链
,记录完成一个业务逻辑时调用到的微服务,并将这种串行或并行的调用关系展示出来。在系统出错时,可以方便地找到出错点。
-
支撑平台
,系统微服务化后,系统变得更加碎片化,系统的部署、运维、监控等都比单体架构更加复杂,那么,就需要将大部分的工作自动化。现在,可以通过 Docker 等工具来中和这些微服务架构带来的弊端。 例如持续集成、蓝绿发布、健康检查、性能健康等等。严重点,以我们两年的实践经验,可以这么说,如果没有合适的支撑平台或工具,就不要使用微服务架构。
一般情况下,如果希望快速地体会微服务架构带来的好处,使用 Spring Cloud 提供的
服务注册(Eureka)
、
服务发现(Ribbon)
、
服务网关(Zuul)
三个组件即可以快速入门。其它组件则需要根据自身的业务选择性使用。
要谈优势,就一定要有对比,我们可以尝试着从
两个维度
来对比。
S/N
|
对比点
|
微服务架构
|
单体架构
|
结论
|
1
|
上手难度
|
API 接口调用
|
数据库共享或本地程序调用
|
单体架构胜
|
2.1
|
开发效率(简单项目)
|
早期设计和沟通的工作量加大,随着项目规模和时间的推移,效率变化不大
|
早期工作量小,随着项目规模和时间的推移,效率大幅度下降
|
单体架构胜
|
2.2
|
开发效率(复杂项目)
|
早期设计和沟通的工作量加大,随着项目规模和时间的推移,效率变化不大
|
早期工作量小,随着项目规模和时间的推移,效率大幅度下降
|
微服务架构胜
|
3
|
系统设计(高内聚低耦合)
|
每个业务单独包装成一个微服务,数据和代码都从物理上隔离开来,实现高内聚低耦合相对容易
|
以包的形式对代码进行模块划分,控制得当即可实现高内聚。但最终都是在数据层面将整个系统耦合在一起
|
微服务架构胜
|
4
|
系统设计(扩展性)
|
独立开发新模块,通过 API 与现有模块交互
|
在现有系统上修改,与现存业务逻辑高度耦合
|
微服务架构胜
|
5
|
需求变更响应速度
|
各个微服务组件独立变更,容易实施敏捷开发方法
|
需要了解整个系统才可以正确修改,容易导致不相关模块的意外失败
|
微服务架构胜
|
6
|
系统升级效率
|
各个微服务组件独立升级,上手和开发效率高,影响面小
|
需要了解整个系统才可以正确修改,容易导致不相关模块的意外失败
|
微服务架构胜
|
7
|
运维效率
|
大系统被拆分为多个小系统,部署和运维难度加大,但可以利用 DevOps 等方式将运维工作自动化
|
简单直接
|
单体架构胜
|
8
|
知识积累
|
微服务组件可以在新项目中直接复用,包括前端页面
|
一般以共享库的形式复用后台代码
|
微服务架构胜
|
9.1
|
硬件需求(简单项目)
|
一个系统需部署多个微服务,需要启动多个运行容器
|
整个系统只需要一个运行容器
|
单体架构胜
|
9.2
|
硬件需求(高要求项目)
|
按需为不同业务模块伸缩资源节点
|
为整个系统分配资源,导致冗余
|
微服务架构胜
|
10.1
|
项目成本(简单系统)
|
项目早期和后期,成本变化曲线平缓
|
项目早期成本低,后期成本大
|
单体架构胜
|
10.2
|
项目成本(复杂系统)
|
项目早期和后期,成本变化曲线平缓
|
项目早期成本低,后期成本大
|
微服务架构胜
|
11
|
非功能需求
|
为单独的微服务按需调优,甚至更换实现方式和程序语言
|
为整个系统调优,牵一发而动全身
|
微服务架构胜
|
12
|
职责、成就感
|
拥有明确的职责划分,主人翁意识和成就感加强,容易形成自组织型团队
|
职责不明确,容易产生扯皮行为
|
微服务架构胜
|
13
|
风险
|
大系统被拆分为小系统,风险可被控制在小系统内,但也引入了各小系统之间的交互风险
|
系统是一个整体,一荣俱荣,一损俱损
|
微服务架构胜
|
结论
: