【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.mzph.cn/news/170521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java网络爬虫实战

List item 文章目录 ⭐️写在前面的话⭐️📌What is it?分类网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler)、聚焦网络爬虫(Focused Web Crawler&a…

Inport 模块

文章目录 Interpolate datainport 模块存在于模型最顶层Port Dimension 和 Variable-size signal Interpolate data Interpolate data:当将 Workspace 的数据导人模型时, 对没有对应数据点的采样时刻进行线性插值的开关选项。 inport 模块存在于模型最顶层 inpo…

十大排序之计数排序、桶排序、基数排序(详解)

文章目录 🐒个人主页🏅算法思维框架📖前言: 🎀计数排序 时间复杂度O(nk)🎇1. 算法步骤思想🎇2.动画实现🎇 3.代码实现 🎀桶排序🎇1. 算法步骤思想&#x1f38…

共享模型之内存

JMM JMM:Java内存模型。定义了主存(所有线程共享的数据)、工作内存(每个线程对应的私有数据)的抽象概念。 JMM存在以下几个特征 原子性:保证指令不会受到线程上下文切换所影响。可见性:保证指…

4面试题--数据库(mysql)

执⾏⼀条 select / update 语句,在 MySQL 中发⽣了什么? Server 层负责建⽴连接、分析和执⾏ SQL。MySQL ⼤多数的核⼼功能模块都在这实现,主要包括 连接器,查询缓存(8.0版本去除,因为每次更新将会清空该…

4.前端--HTML标签3【2023.11.25】

1.表格 1.1表格的作用 表格的作用&#xff1a;表格主要用于显示、展示数据 1.2表格的基本格式 <table><tr><td>单元格内的文字</td><td>单元格内的文字</td>...</tr>... </table><table> </table> 是用于定义表…

搜索 C. Tic-tac-toe

Problem - C - Codeforces 思路&#xff1a;搜索&#xff0c;判断合法性。从起始态用搜索进行模拟&#xff0c;这样可以避免后面判断合法性这一繁琐的步骤。用一个map进行映射当前态及对应的结果。剪枝&#xff1a;如果当前字符串已经被搜索过&#xff0c;则直接跳过去。 代码…

【开源】基于JAVA的车险自助理赔系统

项目编号&#xff1a; S 018 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S018&#xff0c;文末获取源码。} 项目编号&#xff1a;S018&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 车…

1.3 取反器和8位取反器

取反器真值表: 取反开关输入输出011000110101 取反器相当于一个异或门 8位取反器

【深度学习】因果推断与机器学习

2023年初是人工智能爆发的里程碑式的重要阶段&#xff0c;以OpenAI研发的GPT为代表的大模型大行其道&#xff0c;NLP领域的ChatGPT模型火爆一时&#xff0c;引发了全民热议。而最新更新的GPT-4更是实现了大型多模态模型的飞跃式提升&#xff0c;它能够同时接受图像和文本的输入…

Co-DETR:DETRs与协同混合分配训练代码学习笔记

关于论文的学习笔记&#xff1a;Co-DETR:DETRs与协同混合分配训练论文学习笔记-CSDN博客 作者提出了一种新的协同混合任务训练方案&#xff0c;即Co-DETR&#xff0c;以从多种标签分配方式中学习更高效的基于detr的检测器。这种新的训练方案通过训练ATSS和Faster RCNN等一对多标…

【搜维尔科技】产品推荐:Virtuose 6D RV,大型工作空间触觉设备

Virtuose 6D RV为一款具有大工作空间并在所有6自由度上提供力反馈的触觉设备&#xff0c;设计专用于虚拟现实环境&#xff0c;特别适合于大型虚拟物体的处理。 Virtuose 6D RV是当今市场上唯一将高工作效率与高工作量相结合在一起的产品。6D RV特别适合于缩放与操纵等应用&…

【LeetCode】挑战100天 Day16(热题+面试经典150题)

【LeetCode】挑战100天 Day16&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-182.1 题目2.2 题解 三、面试经典 150 题-183.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…

【数据结构实验】图(三)图的深度优先搜索(DFS)生成树

文章目录 1. 引言2. 深度优先搜索生成树3. 实验内容3.1 实验题目&#xff08;一&#xff09;输入要求&#xff08;二&#xff09;输出要求 3.2 算法实现1. 数据结构2. 队列操作函数3. 广度优先搜索遍历4. 创建图5. 深度优先搜索算法6. 主函数及DFS主函数7. 输出生成树信息 3.3 …

WordPress安装AWS插件实现文本转语音功能

适用于 WordPress 的 AWS 插件示例演示了内容创建者如何轻松地为所有书面内容添加文本转语音功能。随着语音搜索的不断增加&#xff0c;以音频格式提供更多网站内容变得至关重要。通过添加语音功能&#xff0c;网站访客可以通过在线音频播放器和播客应用程序等新渠道使用您的内…

ART-PI开发套件-构建开发环境

1、env工具的安装与使用 env 是 RT-Thread 推出的开发辅助工具&#xff0c;针对基于 RT-Thread 操作系统的项目工程&#xff0c;提供编译构建环境、图形化系统配置及软件包管理功能。 其内置的 menuconfig 提供了简单易用的配置剪裁工具&#xff0c;可对内核、组件和软件包进行…

面试常见问题:什么是进程? 什么是线程?进程和线程有什么区别?

1.什么是进程&#xff1f; 进程是操作系统中一个程序在执行过程中的一个实例&#xff0c;每个进程都有自己独立的地址空间&#xff0c;进程间不共享内存。它是程序运行的最小内存单元&#xff1b; 进程特点&#xff1a; 1> 需要占用独立的内存空间&#xff1b; 2>可以并…

C语言—冒泡排序

方法一&#xff08;不使用函数解决&#xff09; #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int arr[]{15,52,23,0,5,6,45,8,9,10};int i0;int j0;for ( i 0; i < 9; i){int flag1; //flag判断数组元素是否有序&#xff0c;这里先假设…

VMware虚拟机安装华为OpenEuler欧拉系统

首先去欧拉官方网站下载openEuler的安装镜像&#xff1a; openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 我下载的是最新的23.03长期维护版本&#xff0c;架构选择x86_64。 创建新虚拟机&#xff1a;选择典型配置&#xff0c;点击下一步&#xff1a;选择下载的镜像文…

4.25每日一题(通过被积函数和积分区域(不等式)选正确的坐标系求二重积分)

一、正确画出积分区域&#xff1b;通过积分区域和被积函数选择方法 二、如何根据被积函数和积分区域正确选择通过极坐标还是根据直角坐标方程计算&#xff1a; &#xff08;1&#xff09;适合极坐标的积分区域&#xff1a;圆或者部分圆 &#xff08;2&#xff09;适合极坐标的…