微服务实践手册-服务的拆分策略

定义微服务架构

如何定义一个微服务架构? 不同的人有不同的定义方法,我介绍一种我使用并且效果还不错的定义方法。

第一步定义系统操作,通过将应用程序的需求提炼为各种关键功能。

第二步分解服务,这里会有不同的分解策略,常规使用的一般有两种(按照业务能力定义和围绕领域驱动设计的子域设计)。

第三步 确定每个服务的API及协作方式及流程,因为要与其他服务协作,协作的方式是采用同步调用还是消息的通信机制。

第四步 通过前面三步之后,应用程序的初步服务已经分解出来了,但是仍然会有不足的地方,随着对应用程序领域的了解越来越多,会发现更多的问题,这个时候就需要针对这些问题选择更好的解决方式。例如你可能会发现过多的服务调用可能会导致特定的分解效率低下,导致你必须把一些服务组合在一起。反之,服务可能会越来越复杂,需要将其拆分成多个服务的程度。

微服务实践手册-服务的拆分策略

1. 识别系统操作

如何识别系统操作,我们都知道在软件开发流程中,起点是来自业务方的需求(包括用户故事或对应的用户场景)。我们使用两步式流程识别和定义系统操作:

  • 第一步创建由关键类组成的抽象领域模型,关键类提供用于描述系统操作的词汇。
  • 第二步定义系统操作,并根据领域模型描述每个系统操作的行为。

微服务实践手册-服务的拆分策略

1.1 创建抽象领域模型

创建领域模型会采用一些标准的技术,例如与领域专家沟通后,分析需求和用户场景中频繁出现的名词。例如 Place an order 用户故事,我们可以把它分解为多个用户场景(用户收货地址,订单信息,商品搜索) 。场景中出现的名称,如 Order、User、Product,我们可以将至对应到操作类

  • User:下订单的用户
  • Order:用户操作的订单
  • Product:用户搜索的商品信息

1.2 定义系统操作

系统操作一般分为两类

  • 命令型:创建、更新或删除数据的操作
  • 查询型:查询和读取数据的操作
服务 操作 命令 描述
User Get User getUserInfo 获取用户信息
Order create Order createOrder 创建一个订单
Product Get Product getProductInfo 获取一个商品信息

2. 定义服务

服务的识别会有多种策略,但是结果都是以业务为中心

2.1 根据业务能力进行服务拆分

业务能力是指一些能够为公司产品价值的商业活动或产品。例如 电商公司的业务能力包括:订单管理、库存管理和发货、商品管理等。

  • 识别业务能力:一个组织或应用程序有哪些业务能力,是通过对组织的目标、结构分析得来的。每一个业务能力都可以认为是一个或多个服务。以YShop为例,其业务能力分为:订单管理、库存管理、商品管理

  • 从业务能力到服务:一旦确定了业务能力,就可以为每个能力或相关能力组定义服务

微服务实践手册-服务的拆分策略

2.2 根据子域进行服务拆分

todo

微服务实践手册-服务的拆分策略

3. 定义服务API和协作方式

定义服务的API也就是服务的操作和时间。服务API操作有两种:

  • 系统操作:由外部客户端调用,也可能有其他服务调用
  • 其他操作:和其他服务之间进行协作

3.1 协作方式

一般的协作方式有REST方式,提供对外API,供其他服务进行HTTP调用。还有通过消息的异步方式进行交互:

  • 同步模式:客户端请求需要服务端实时响应,客户端等待影响时可能导致堵塞。
  • 异步模式:客户端请求不是阻塞请求,服务端的响应非实时。

4. 持续优化和迭代

在最初的服务拆分完毕之后,随着业务不断的改变和对该领域知识的不断深入,可能会觉得系统有很多可以优化和改进的地方,这个时候需要好好的衡量优化的意义和改进后是否会带来新的问题。对现有业务来说是利大于弊 or 弊大于利,这需要认真思考。另外在服务拆分的时候记住两个主要原则:

  • 单一职责原则
  • 闭包原则

5. 拆分单体应用未服务的难点

  • 网络延迟
  • 同步进程间通信导致可用性降低
  • 服务之间维持数据一致性
  • 获取一致的数据视图
本作品采用《CC 协议》,转载必须注明作者和本文链接
会飞的大象
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!