Skip to content
liubao edited this page Jul 18, 2022 · 1 revision

微服务设计

微服务设计需要遵循一些设计原则。重点包括两部分设计考量:韧性架构和微服务分层,下面将描述这两个概念,并使用这两个概念设计 porter 项目。

韧性架构

架构设计的目的是解决软件系统复杂性带来的问题。具体描述为如下几个业务目标:

  • 业务变化不需要改变架构。新增业务、修改业务或者删除业务,不需要调整架构。这样业务团队能够专注于业务开发和运营,降低技术难度,提升开发效率。同时满足业务创新对于试错的诉求,快速创建新的业务模块,快速丢弃被验证不合理的业务,降低创新成本,也不至于对稳定业务造成影响。
  • 适应业务增长对于性能的要求。用户增长、营收增长、业务增长以及使用场景变化,不需要调整架构,能够快速适应。比如通过资源投入的线性增长,就能快速满足用户增长的需要,不需要修改架构和代码,这样业务团队可以聚焦于业务优化,从而以更加低的资源投入,满足更大的用户增长需求。
  • 可持续演进的目标。架构设计需要充分考虑持续演进的目标,能够阶段性适应业务的需要,并能够分阶段进行优化。架构设计目标应该尽可能兼顾遗留系统的演进,降低频繁推倒重来的风险,分阶段优化、验证和反馈,控制好投入的成本和产出的效益。
  • 可预期的错误和应对策略。错误是必然发生的,比如超过系统处理能力的请求必然发生失败或者超时。需要有简单实用的策略应对可预期的错误,避免应对策略的复杂性导致错误变得不可预期。优雅的应对策略能够最大限度降低错误对业务的影响。

韧性架构的设计要点:

  • 增加应用网关。应用网关有很多用途:(1)屏蔽内部系统拆分带来的变化,让用户层不感知;(2)控制用户权限、控制接口的可访问性等;(3)提供限流、客户端熔断等服务治理能力;(4)提供请求的QPS、时延等统计信息,为持续优化提供便利。
  • 微服务架构和无状态设计。应用网关和微服务设计遵循无状态设计原则,可以实现灵活弹性。将性能优化等能力下沉到数据库、消息、微服务注册中心等通用型中间件。这样可以采用更多通用、被广泛验证的性能优化方案,降低技术风险,也能够得到更多的商业技术支持。
  • 持续演进的服务治理策略。规划优雅停机、客户端实例隔离、快速失败等基础治理能力,规划灰度发布等高阶治理能力。最终面向提升用户体验、提升异常场景系统响应性。

微服务分层

在充分评估了功能复用、容易理解、易于实施、简单高效等要求,本项目提出了如下的微服务分层和划分原则。

设计要点和规范要求:

  • 以域为单位设计微服务。每个域分为核心层、业务层。每个域可以有2层,也可以只有1层。每层可以设计一个或者多个微服务。域是核心业务逻辑的抽象,需要做好REST接口设计和兼容管理。
  • 提供应用层,应用层不归属到任何域,这样的主要目的是考虑应用层主要提供复杂的组合业务场景(也叫BFF)、易变化的业务或者逻辑、不同业务差异化的适配接口、支持WEB应用的界面内容等。因此应用层通常不会做过多的设计,对于尝试性业务,可能就直接在应用层提供一个微服务,如果尝试失败,就删除,应用层的业务也可以外包给第三方,满足临时性、经常性的差异化需求开发。
  • 稳定性依赖原则:域内核心层 > 跨域核心层 > 第三方服务(比如中台) > 域内业务层 > 跨域业务层 > 第三方服务(其他)> 应用层。分层并不意味着每个层次只提供最小的原子能力,在不违背稳定性依赖原则的情况下,每层都应该尽可能提供最大限度满足业务需要的接口(减少多次访问该层的接口),尽可能把功能下沉。
  • 稳定性依赖原则(数据保护):一个域一个数据库,只允许核心层访问数据库,不允许跨域访问数据库。
  • 稳定性依赖原则(域内):允许上层的微服务访问下层的微服务,允许同层的微服务之间的访问。
  • 稳定性依赖原则(跨域):只允许上层访问下层,不允许平层访问。
  • 稳定性依赖原则(第三方依赖):业务层和应用层可以访问第三方服务。核心层不访问第三方服务。
  • 允许跨层调用:比如用户层通过接入层,可以访问应用层、业务层和核心层,不违背稳定性依赖原则。这样可以大量减少适配代码,减少调用深度,对于更加合理的进行资源规划也具备非常重要的意义。

porter 应用的分层设计

根据User Story和上述设计原则,将 porter 项目划分为 用户域文件域 。下面是分解后设计的微服务结构:

  • 应用网关(porter-gateway): 负责进行请求转发、用户认证以及其他内容,比如解决跨站访问、设置HTTP安全消息头等。通过设置防火墙,所有的请求都必须经过网关,这样就将内部服务与外部用户隔离起来,防止内部服务被非法访问。

  • porter应用(porter-app): 采用静态页面技术, html+js+css实现非常简单的用户操作界面。

  • 文件业务(file-business): 提供文件上传、删除等文件管理功能。

  • 用户中心(user-core): 提供认证、角色和权限管理等功能。

这些服务都是无状态设计,都支持分布式集群部署。

拆分好的微服务代码参考Porter项目 。 建议下载该项目代码,并准备好开发测试环境,体验项目运行结果,为理解后面章节的开发内容做好准备。