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

news2024/11/18 12:41:02

一、设计原则之单一职责

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

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

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

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

据说 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.coloradmin.cn/o/1252874.html

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

相关文章

产品经理和项目经理的区别在哪里?

在当今的商业环境中,产品经理和项目经理扮演着两个非常重要的角色。虽然他们都是组织成功的重要推动者,但他们的职责和所关注的角度却有着显著的不同。 1. 职责差异 产品经理负责一个或多个产品线,从产品的规划到开发、推出和市场表现。他们…

Java实现-数据结构 2.时间和空间复杂度

.如何衡量一个算法的好坏:时间复杂度和空间复杂度 算法效率分为时间效率和空间效率,时间效率称为时间复杂度,空间效率称为空间复杂度 时间复杂度 算法的时间复杂度是一个数学函数,它描述了算法的运行时间,一个算法执…

分享一个鬼~

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 先看效果: 上源码: import GUI from "https://cdn.jsdelivr.net/npm/lil-gui0.18.2/esm"const canv…

为社会做贡献的EasyDarwin 4.0.1发布了,支持视频点播、文件直播、摄像机直播、直播录像、直播回放、录像MP4合成下载

经过几个月的不懈努力和测试,最新的EasyDarwin 4.0版本总算是发布出来了,功能还是老几样:文件点播、视频直播(支持各种视频源)、直播录像与回放、录像合成MP4下载,稍稍看一下细节: 文件上传与点…

【UCAS自然语言处理作业二】训练FFN, RNN, Attention机制的语言模型,并计算测试集上的PPL

文章目录 前言前馈神经网络数据组织Dataset网络结构训练超参设置 RNN数据组织&Dataset网络结构训练超参设置 注意力网络数据组织&Dataset网络结构Attention部分完整模型 训练部分超参设置 结果与分析训练集Loss测试集PPL 前言 本次实验主要针对前馈神经网络&#xff0…

SRM供应商、采购管理系统

前言: 随着互联网和数字技术的不断发展,企业采购管理逐渐走向数字化和智能化。数字化采购平台作为企业采购管理的新模式,能够提高采购效率、降低采购成本、优化供应商合作效率,已成为企业实现效益提升的关键手段。 软件开发资料…

Oracle登录认证方式详解

文章目录 一、简介二、OS认证三、口令认证四、remote_login_passwordfile 详解 一、简介 在数据库管理中,登录认证是确保数据库安全性的重要环节。Oracle数据库提供 了两种认证方式,一种是“操作系统认证”,一种是“口令文件认证&#xff0c…

基于Vue+SpringBoot的家庭个人记帐理财系统

登陆 注册 (用户账号,密码,再次确 认密码,手机号) 用户注销功能,用户能注销就行 管理员不需要注销功能 用户个人信息修改删除 (头像,性 别,账号,密码,手机号,地址) 新闻页…

基于Scapy修改ClientHello的SNI(三)

需求:修改HTTPS的ClientHello中的SNI字段 目标:修改成功,wireshark显示正常 语言:Python 三方库:Scapy 下面是一个标准的ClientHello报文,是从一个完整的HTTPS流中保存出来的,原始报文中的SNI是www.baidu.com 在上一篇文章中 记录基于scapy构造ClientHello报文的尝试…

【教学类-06-08】20231125(55格版)X-Y之间“减法-题”(以10-20之间为例)(必须A>B,题目少)

图片展示 需求: 20以内减法,不需要再练习其中10以内部分,改为10-20以内的减法,X-Y大于10,小于20的所有减法题。 代码展示: “-”减法 X-Y 之间的所有减法-题(如10-20之间的所有减法&#xff0…

C3 多媒体查询

文章目录 前言CSS3 多媒体查询CSS2 多媒体类型CSS3 多媒体查询浏览器支持多媒体查询语法CSS3 多媒体类型多媒体查询简单实例 媒体类型媒体功能更多实例后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:CSS 🐱‍👓博…

nginx反向代理解决跨域实践

需求实现 本地请求百度的一个搜索接口,用nginx代理解决跨域思路:前端和后端都用nginx代理到同一个地址8080,这样访问接口就不存在跨域限制 本地页面 查询一个百度搜索接口,运行在http://localhost:8035 index.js const path …

5.7 Windows驱动开发:取进程模块函数地址

在笔者上一篇文章《内核取应用层模块基地址》中简单为大家介绍了如何通过遍历PLIST_ENTRY32链表的方式获取到32位应用程序中特定模块的基地址,由于是入门系列所以并没有封装实现太过于通用的获取函数,本章将继续延申这个话题,并依次实现通用版…

国产航顺HK32F030M: 简易篮球计分器(便携计分器)

【自制】《基于航顺HKF030MF4P6手持比赛计分牌》(便携计分器) 1. 简介 便携篮球计分器是一种小型化设计的设备,主要用于记录和显示篮球比赛的得分和计时。以下是由Type-C充电电路TP5400/ASM1117电路、HK32F030MF4单片机最小系统、数码管显示…

小程序如何禁止指定用户访问?如何设置指定用户才能访问?

​有些商家为了价格保密或者实行严格的会员制等原因,希望小程序能够限制某些人的访问或者设置指定人员才能访问。这种功能在小程序中,怎么支持这些功能呢?下面具体介绍。 一、禁止指定用户访问 禁止指定用户访问,可以通过小程序…

论文笔记:详解NEUPSL DSI

《Using Domain Knowledge to Guide Dialog Structure Induction via Neural Probabilistic 》 名词解释 Dialog Structure Induction(DSI)是推断给定目标导向对话的潜在对话结构(即一组对话状态及其时间转换)的任务。它是现代对…

基于springboot+Web实现社区医院管理服务系统项目【项目源码+论文说明】计算机毕业设计

基于springbootWeb实现社区医院管理服务系统演示 摘要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括社区医院管理服务系统的网络应用,在外国线上管理系统已经是很普遍的方式,不过国内的管理系统可…

面试官:知道JVM中一次完整的 GC 流程吗

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

转行要趁早!盘点网络安全的岗位汇总

前段时间,知名机构麦可思研究院发布了《2023年中国本科生就业报告》,其中详细列出近五年的本科绿牌专业,信息安全位列第一。 对于网络安全的发展与就业前景,知了姐说过很多,作为当下应届生收入较高的专业之一&#xf…

栈和队列的实现(详解+图解!文末附完整代码)

栈 栈的基本概念 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的…