00-微服务定义

12因素应用和微服务

12-Factor 为构建如下的 SaaS 应用提供了方法论:

  • 使用标准化流程自动配置,从而使新的开发者花费最少的学习成本加入这个项目。
  • 和操作系统之间尽可能的划清界限,在各个系统中提供最大的可移植性。
  • 适合部署在现代的云计算平台,从而在服务器和系统管理方面节省资源。
  • 将开发环境和生产环境的差异降至最低,并使用持续交付实施敏捷开发。
  • 可以在工具、架构和开发流程不发生明显变化的前提下实现扩展。

满足12 因素的app大概是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
I. 基准代码
一份基准代码,多份部署
II. 依赖
显式声明依赖关系
III. 配置
在环境中存储配置
IV. 后端服务
把后端服务当作附加资源
V. 构建,发布,运行
严格分离构建和运行
VI. 进程
以一个或多个无状态进程运行应用
VII. 端口绑定
通过端口绑定提供服务
VIII. 并发
通过进程模型进行扩展
IX. 易处理
快速启动和优雅终止可最大化健壮性
X. 开发环境与线上环境等价
尽可能的保持开发,预发布,线上环境相同
XI. 日志
把日志当作事件流
XII. 管理进程
后台管理任务当作一次性进程运行

微服务作为一个概念是满足12因素的多应用方案,是一个可以具体落地的方案。

单体服务与微服务

单体服务,以 MVC 架构为例,业务通常是通过部署一个 WAR 包到 Tomcat 中,然后启动 Tomcat,监听某个端口即可对外提供服务。早期在业务规模不大、开发团队人员规模较小的时候,采用单体应用架构,团队的开发和运维成本都可控。存在问题如下:

  • 部署效率低下。
  • 团队协作开发成本高。
  • 系统高可用性差。
  • 线上发布变慢。

服务化,就是把传统的单机应用中通过 JAR 包依赖产生的本地方法调用,改造成通过 RPC 接口产生的远程方法调用。通过服务化,可以解决单体应用膨胀、团队开发耦合度高、协作效率低下的问题。

  1. 单体服务的线上服务稳定容易被其他功能模块影响。
  2. 单体服务在进行多个功能模块开发的时候混合进行开发、测试部署。不同功能之间容易影响。

服务化的思想进一步演化,演变为今天我们所熟知的微服务。微服务相比于服务化的不同:

  1. 服务拆分粒度更细。
  2. 服务独立部署。
  3. 服务独立维护。
  4. 服务治理能力要求高。

常见的服务拆分方式:

  1. 纵向拆分,从业务角度拆分,按照业务的关联独立程度来决定。独立功能,关联较为深的拆分微服务。
  2. 横向拆分,从公共且独立功能维度拆分。多个公共服务被调用,且依赖资源独立不与其他业务耦合。

参考

  • 12-factors app
  • [从 0 开始学微服务 - 极客时间 - 胡忠想]