当前位置: 首页 > article >正文

【SpringCloud】设计原则之单一职责与服务拆分

一、设计原则之单一职责

设计原则很重要的一点就是简单,单一职责也就是所谓的专人干专事

一个单元(一个类、函数或微服务)应该有且只有一个职责 

无论如何,一个微服务不应该包含多于一个的职责 

职责单一的后果之一就是职责单位(微服务、类、接口、函数)的数量剧增 

据说 Amazon、Netflix 这些采用微服务架构的网站一个小功能就会调用几十上百个微服务 

但相比较于每个函数都是多个业务逻辑或职责功能的混合体的情况,维护成本还是低很多的 

SRP(单一职责原则) 中的 “单一职责” 是个比较模糊的概念

对于函数,它可能指单一的功能,不涉及复杂逻辑

对于类或接口,它可能指对单一对象的操作,也可能是指对该对象单一属性的操作 

总而言之,单一职责原则就是为了让代码逻辑更加清晰,可维护性更加好,定位问题更快的一种设计原则 

单一职责的优点: 

  • 类的复杂性降低,实现什么职责都有清晰明确的定义 
  • 可读性提高,复杂性降低 
  • 可维护性提高,可读性提高 

变更引起的风险降低,变更是必不可少的,若接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助 

实施单一职责的目的: 

  • 以类来隔离需求功能点,这样当一个点的需求发生变化时,不会影响别的类的逻辑,这个和设计模式中的开闭原则类似,对扩展持开放态度,对修改持关闭态度 
  • 是一个原子模块级的粒度,至于原子的粒度到底是什么样的,应该因业务而异,设计过程中同时考虑业务的扩展,所以这就要求在设计的过程中,必须有业务专家共同参与,共同规避风险 
  • 粒度小、灵活、复用性强,方便更高级别的抽象 

每个微服务单独运行在独立的进程中,能够实现松耦合,并且独立部署 

二、设计原则之服务拆分 

拆分粒度不应该过分追求细粒度,要考虑适中,不能过大或过小 

按照单一职责原则和康威定律,在业务域、团队和技术上平衡粒度 

拆分后的代码应该是易控制、易维护的,业务职责也是明确单一的 

AKF 立方体是一个叫 AKF 公司的技术专家抽象总结的应用扩展的三个维度 

理论上按照这三个扩展模式,可以将一个单体应用无限扩展 

AKF 扩展立方体 

  • x轴:水平复制,即在负载均衡服务器后增加多个 Web 服务器
  • y轴:功能分解,将不同职能的模块分成不同的服务。从 y 轴方向扩展,才能将巨型应用分解为一组不同的服务,例如,订单管理中心、商品信息管理中心等
  • z轴: 对数据库的扩展,即分库分表(分布是将关系紧密的表放在一台数据库服务器上,分表是因为一张表的数据太多,需要将一张表的数据通过 Hash 放在不同的数据库服务器上)

三个维度的扩展对比如表: 

纬度优点缺点场景
x 轴扩展成本最低,实施简单受指令集多少和数据集多少的约束。当单个产品或应用过大时,服务响应变慢,无法通过 x 轴的水平扩展提高速度发展初期,业务复杂度低,需要增加系统容量
y 轴扩展可以解决指令集和数据集的约束,解决代码复杂度问题,可以实现隔离故障,可以提高响应时间,可以使团队聚焦更利于团队成长成本相对较高业务复杂,数据量大,代码耦合度高,团队规模大
z 轴扩展能解决数据集的约束,降低故障风险,实现渐进交付,可以带来最大的扩展性成本最昂贵,且不一定能解决指令集的问题用户指数级快速增长

 下面看一下 AKF 的拆分实践:

  • 拆分应用 

x 轴:从单体系统或服务,水平克隆出许多系统,通过负载均衡分配请求 

y 轴: 面向服务分割,基于功能或服务分割,例如,电商网站可以将登录、搜索、下单等服务进行 y 轴拆分,每一组在进行 x 轴的扩展

z 轴: 面向查找分割,基于用户、请求或数据分割,例如,可以将不同产品的 SKU 分到不同的搜索服务,可以将用户哈希到不同的服务等

  • 拆分数据库 

x 轴:从单库水平克隆为多个库上读,一个库写,通过数据库的自我复制实现,要允许一定的读写时延

y 轴:根据不同的信息类型分割为不同的数据库,即分库,例如,产品库、用户库等

z 轴: 按照一定算法进行分片,例如,将搜索按照 MapReduce 的原理进行分片,把 SKU 的数据按照不同的哈希值进行分片存储,每个分片在进行 x 轴冗余

要做好微服务的分层:梳理和抽取核心应用、公共应用,作为独立地服务下沉到核心和公共能力层,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求 

对于服务的拆分,要使用迭代演进的方式,不能一次性完成所有服务的拆分,需要确保团队可接受,粒度适中,同时需要考虑 API 的版本兼容性 

不能单纯的以代码量来对服务拆分的成果进行评估 

MapReduce 原理参考文章: MapReduce基本原理(详解!)_mapreduce工作原理-CSDN博客

参考资料:《微服务架构实战》—— 张锋

一  叶  知  秋,奥  妙  玄  心


http://www.kler.cn/a/148255.html

相关文章:

  • 如何判定linux系统CPU的核心架构
  • SQL集合运算
  • 前端垂直居中的多种实现方式及应用分析
  • 界面控件Kendo UI for Angular中文教程:如何构建带图表的仪表板?(一)
  • 除了 Postman,还有什么好用的 API 调试工具吗
  • rockylinux 8安装 gcc11.2
  • 如何在Ubuntu系统上安装Node.js
  • HTTP 响应头信息
  • 简易键值对文本解析
  • 面试:Kafka相关问题
  • 力扣104. 二叉树的最大深度
  • 大数据存储技术期中考点梳理
  • 更改QTableWidget的branch展开符样式为“+“加号字符
  • Typora+PicGo+Minio搭建博客图床
  • 每日OJ题_算法_双指针⑧力扣18. 四数之和
  • 还在担心发抖音没素材跟文案?[腾讯云HAI] AIGC带你蹭热度“今年你失去了什么?”
  • Eigen学习(持续更新)
  • freerots启动过程分析(qemu仿真RISC-V架构为例)
  • 【计算机网络学习之路】序列化,反序列化和初识协议
  • ChromeDriver最新版本下载与安装方法
  • 【面试HOT200】滑动窗口篇
  • HNU练习七 字符串编程题7. 机器人游戏
  • DS图—图的最短路径/Dijkstra算法【数据结构】
  • 【数据结构/C++】线性表_顺序表的基本操作
  • Windows11通用快捷键集合
  • 嵌入式开发DDR的选择