微服务的设计及其原则

一、AKF 拆分原则

业界对可扩展的系统架构设计有一个朴素理念:通过加机器解决容量和可用性问题

这一理念在“云计算”概念疯狂流行的今天, 得到了广泛的认可! 对于一个规模迅速增长的系统而言, 容量和性能问题是首当其冲的。 但随着时间的向前,系统规模的增长,除了面对性能与容量的问题外,还需要面对功能与模块数量上的增长带来的系统复杂性问题以及业务的变化带来的提供差异化服务问题

而许多系统,在架构设计时并未充分考虑到这些问题,导致系统的重构成为常态,从而影响业务交付能力,且浪费人力财力。 对此,《可扩展的艺术》 一书提出了一个更加系统的可扩展模型—— AKF 可扩展立方 (Scalability Cube)

这个立方体中沿着三个坐标轴设置分别为: X、 Y、 Z。
在这里插入图片描述
X 轴(水平扩展) —— 关注水平扩展, 也就是“加机器解决问题”
Y 轴(功能划分) —— 关注应用中功能的划分, 基于不同的业务拆分
Z 轴(数据分区) —— 关注服务和数据的优先级划分, 如按地域划分

1、Y 轴 (功能)

Y 轴扩展会将庞大的整体应用拆分为多个服务。

每个服务实现一组相关的功能, 如拆分为用户登录、商品目录、客户管理、订单管理、 商品评论等。

在工程上常见的方案是服务化架构(SOA) 。

比如对于一个电子商务平台, 我们可以拆分成不同的服务, 组成下面这样的架构:
在这里插入图片描述
但通过观察上图容易发现, 当服务数量增多时, 服务调用关系变得复杂。 为系统添加一个新功能, 要调用的服务数也变得不可控, 由此引发了服务管理上的混乱。

所以一般情况下, 需要采用服务注册的机制形成服务网关来进行服务治理。 系统的架构将变成下图所示:
在这里插入图片描述

2、X 轴 (水平扩展)

X 轴扩展与上述朴素理念一致。 通过绝对平等地复制服务与数据,以解决容量和可用性的问题。 其实就是将微服务运行多个实例, 做集群+负载均衡的模式。

为了提升单个服务的可用性和容量, 对每一个服务进行 X 轴扩展划分 :
在这里插入图片描述

3、Z 轴 (数据分区)

Z 轴扩展通常是指基于请求者或用户独特的需求,进行系统划分,并使得划分出来的子系统是相互隔离但又是完整的。

以生产汽车的工厂来举例: 福特公司为了发展在中国的业务, 或者利用中国的廉价劳动力, 在中国建立一个完整的子工厂,与美国工厂一样,负责完整的汽车生产,这就是一种 Z 轴扩展。

工程领域常见的 Z 轴扩展有以下两种方案:

1)单元化架构

在分布式服务设计领域, 一个单元(Cell)就是满足某个分区所有业务操作的自包含闭环。 如上面我们说到的 Y 轴扩展的 SOA 架构, 客户端对服务端节点的选择一般是随机的,但是,如果在此加上 Z 轴扩展,那服务节点的选择将不再是随机的了,而是每个单元自成一体。 如下图:
在这里插入图片描述

2)数据分区

为了性能数据安全上的考虑, 我们将一个完整的数据集按一定的维度划分出不同的子集。

一个分区(Shard),就是是整体数据集的一个子集。 比如用尾号来划分用户, 那同样尾号的那部分用户就可以认为是一个分区。

数据分区为一般包括以下几种数据划分的方式:

数据类型(如: 业务类型)
数据范围(如: 时间段, 用户 ID)
数据热度(如: 用户活跃度, 商品热度)
按读写分(如: 商品描述, 商品库存)

二、前后端分离原则

在这里插入图片描述

前后端分离原则, 简单来讲就是前端和后端的代码分离。 推荐采用物理分离的方式部署, 进一步促使更彻底的分离。

如果继续直接使用服务端模板技术如 jsp,把 java、 js、 html、 css 都堆到一个页面里, 稍微复杂一点的页面就无法维护了。
在这里插入图片描述
(即view使用templates而不是jsp)

分离模式下,前后端交互界面更清晰,只剩下接口模型,后端的接口简洁明了,更容易维护。

前端多渠道集成场景更容易实现,后端服务无需变更,采用统一的数据和模型,可以支持多个前端,如微信 h5 前端、 PC 前端、安卓前端、 IOS 前端。

三、无状态服务原则

在这里插入图片描述

什么是状态: 如果一个数据需要被多个服务共享,才能完成一笔交易, 那么这个数据被称为状态。 依赖这个“状态”数据的服务被称为有状态服务, 反之称为无状态服务。

无状态服务原则并不是说在微服务架构里就不允许存在状态, 而是要把有状态的业务服务改变为无状态的计算类服务, 那么状态数据也就相应的迁移到对应的“有状态数据服务”中。

场景说明: 例如我们以前在本地内存中建立的数据缓存、Session 缓存, 在微服务架构中就应该把这些数据迁移到分布式缓存中存储, 让业务服务变成一个无状态的计算节点。 迁移后, 就可以做到按需动态伸缩, 微服务应用在运行时动态增删节点, 不再需要考虑缓存数据如何同步的问题。

四、RestFul 通讯风格

在这里插入图片描述

作为一个原则来讲本来应该是属于“无状态通信原则”, 在这里我们直接推荐一个实践优选的 Restful 通信风格 , 因为他有很多好处:

1、无状态协议 HTTP, 具备先天优势, 扩展能力很强。 例如需要安全加密, 有现成的成熟方案 HTTPS 。

2、JSON 报文序列化, 轻量简单, 人与机器均可读, 学习成本低, 搜索引擎友好。

3、语言无关, 各大热门语言均提供成熟的 Restful API 框架, 相对其他的 RPC 框架生态更完善。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值