架构分层方法指导

news2024/9/20 10:32:04

在《不过时的经典层架构》里讲了经典的四层架构怎样对易变性做封装。咱们实际项目中,如果没有足够的实践和关键性思考,还是很可能使用名义上科学的分类理论,却在按照功能进行架构分层。今天咱们就通过一些简单的指导来尽量减少这种风险。

四问

在架构分层中,分层设计松散地对应着who、what、where、how这四个问题。

who是客户端交互的系统,what是在Manager服务中需要的系统,how是Engine服务中需要的系统,how是访问数据层的工作,where在系统表述中指资源。按照四问重新画一下经典四层架构的架构图是这样的:

aa8390140c347dd6555970d249440566.png

问及回答这四个问题,在启动设计及验证设计的时候都很有用。

关键最佳实践

易变性递减原则

在一个设计良好的系统中,易变性应该是层递减的。客户端是最易变的,Manager管理层根据用例而变化,Engine引擎比管理层稳定。引擎层变化必须是业务行为变了,比如支付行为了,这比Manager管理层的从先支付再增加积分这种组合的变化要更少一些。资源访问层的变化就更少了,增删改查这种原子操作不怎么变。资源层,理论上是要最少修改的。咱们经常提到的重构、重写,无论如何大改,也很少连数据库也一锅端了吧。

整体设计增量构建原则

这个原则无论什么领域和产业都适用。例如,你买了一块地打算盖个别墅。就算最好的架构师也不能一次性搞定整个设计,必须反复的和你讨论资金、使用人、风格、时间和风险。构建的时候也是先建设一层,再往上建。如果这时候用户想要加一层呢?这就看设计时地基等设施是否可以承载了。

命名

服务名和设计图一样,是与他人交流设计的一种方式。在业务层和数据访问层,描述性的命名方式非常重要。下面是推荐的习惯性命名方式:

1、服务名(为了好理解,服务名可以理解为类名)是至少两部分组成的复合词,采用帕斯卡命名法。

帕斯卡命名法指当变量名和函式名称是由二个或二个以上单词连结在一起,每个单词首字母大写。规则是单字之间不以空格断开或连接号(-)、底线(_)连结,第一个单词首字母采用大写字母;后续单词的首字母亦用大写字母,例如:FirstName、LastName。源自于Pascal语言的命名惯例,也有人称之为“大驼峰式命名法”(Upper Camel Case),为驼峰式大小写的子集。

2、服务名的后缀永远是服务的类型,例如:Manager、Engine、Access或者ResouceAccess.

3、服务名的前缀会根据服务类型而变化。比如Manager类型的,前缀往往是封装了易变的用例的名词;再比如Engine类型的,前缀往往是定义封装了什么事件的名词;ResourceAccess类型的,前缀往往说明了用例访问了什么数据资源。

4、只有在Engine类型的服务中,前缀才能用动名词。动名词就是ing形式的。如果把动名词用到了其他类型的服务中,很可能预示着这是按照功能分解的。

举个例子:在银行设计中,AccountManager(账户管理)和AccountAccess(账户访问)是可接受的命名,但是BillingManager(收单管理)和BillingAccess(收单访问)就有点功能分解的味道了。因为它传达了一种做什么而不是关于易变性的编排和访问的。CalculatingEngine是一个不错的选择,因为引擎做的一般都是聚合、校验、计算、转换、定位和搜索这些。

5、原子操作性的动词,比如Get、Put不应该用作服务前缀,应该用作数据访问层的接口名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709200.html

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

相关文章

LeetCode 75 —— 70. 爬楼梯

LeetCode 75 —— 70. 爬楼梯 一、题目描述: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法…

机器学习笔记 - 基于OpenCV和Vantage-point tree构建图像哈希搜索引擎

一、关于图像哈希 上一篇文章中,了解到了图像哈希是使用算法为图像分配唯一哈希值的过程。在深度学习普及之前,一些搜索引擎使用散列技术来索引图像。 言外之意目前的图像搜索引擎主要都是基于深度学习的技术,不过思路都是一样的,我们这里基于OpenCV提供的图像哈希技术构建…

python实现削苹果小游戏

也不用998只有199源码发你。 支付完发我邮箱发你源代码。

RISC-V处理器的设计与实现(三)—— 上板验证(基于野火征途Pro开发板)

文章目录 RISC-V处理器的设计与实现(一)—— 基本指令集_Patarw_Li的博客-CSDN博客 RISC-V处理器的设计与实现(二)—— CPU框架设计_Patarw_Li的博客-CSDN博客 RISC-V处理器的设计与实现(三)—— 上板验…

Gradle安装与配置(8.2)

一、下载地址 https://gradle.org/releases/ https://downloads.gradle.org/distributions/gradle-8.2-bin.zip 解压后放到合适的位置 二、配置环境变量并测试 D:\ProgramFiles\gradle-8.2\bin gradle -v 三、配置镜像 D:\ProgramFiles\gradle-8.2\init.d init.gradle&…

算法第36天:数组中出现次数超过一半的数字【摩尔投票法】

算法介绍 摩尔投票法:求众数的方法。 就是维护一个集合,然后我们遍历我们的数组,假如现在我们遍历到的数为x,当集合中都是x的话我们就将x放入集合中,如果我们遍历到的数为x,但是集合中有y,那么…

【VulnHub系列】West-Wlid1.1

实验信息 Kali:192.168.10.106 WestWild:192.168.104 实验过程 通过arp-scan查找目标主机,确定目标主机IP192.168.10.104 sudo arp-scan --interface eth0 192.168.10.0/24 探测靶机开放的端口 sudo nmap -sT --min-rate 10000 -p- 192.1…

Redis的持久化机制(1)

RDB,即Redis DataBase的简称。RDB是Redis默认的持久化机制 RDB持久化文件,速度比较快,而且存储的是一个二进制的文件,传输起来很方便 在指定的时间间隔内,将内存中的数据集的快照写入磁盘。默认保存在/usr/local/bin目…

122.【SpringBoot - 再刷 - 基础入门 - 01】

SpringBoot2 核心技术 (一)、SpringBoot核心技术入门1.Spring能做什么?1.1、Spring 的能力1.2、Spring的生态1.3、Spring5重大升级1.3.1、响应式编程1.3.2、内部源码设计 2.为什么用SpringBoot2.1、SpringBoot优点2.2、SpringBoot缺点 3.时代背景3.1、微服务3.2、分布式的困难…

github克隆代码加速

https://www.gitclone.com/gogs/ 只需要在正常的git clone后的URL里,嵌入gitclone.com即可快速clone 举例: #原地址 git clone https://github.com/SpringSource/Spring-framework #新地址 git clone https://gitclone.com/github.com/SpringSource/…

2023年出货量预计增长75%,谁在领跑规模化量产赛道?

2023年将成为一个分水岭,中国智能驾驶市场已经进入了下一个竞争周期,卷,难 成为了智驾赛道新的关键词,对各赛道的供应商来说,未来几年将是比拼规模化与降本。 对各级供应商来说,产品规模化量产&#xff0c…

【二叉树part07】| 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

目录 🎈LeetCode530.二叉搜索树的最小绝对差 🎈LeetCode501.二叉搜索树中的众数 🎈LeetCode236.二叉树的最近公共祖先 🎈LeetCode530.二叉搜索树的最小绝对差 链接:530.二叉树的最小绝对差 给你一个二叉搜索树的根…

主成分分析系列(二)为什么特征向量是主成分

在主成分分析系列(一)概览及数据为何要中心化这篇文章中介绍了PCA算法的大概想法及数据为何要中心化,在这篇文章具体推导PCA算法的过程。 1. 首先 PCA 最原始的想法是: 设 V \mathbf{V} V 为 d {d} d 维 线性空间(即…

python项目导入导出依赖包

1. 导出所有依赖包 进入项目路径,执行以下命令: pip freeze > requirements.txt然后在当前目录是可以看到生成“requirements.txt”文件,可以打开看看,会发现有很多个包信息,其实这里是把你当前python环境的所有包…

如何编写一个含有抄底信号的副图指标

如果你作为通达信软件源代码的程序维护员,如何编写一个含有抄底提示的副图指标?请看下面的的示例教程。(python语言) python # 导入所需的库 import talib # 计算移动平均线 def moving_average(data, period): ma talib.SMA(data, timeperiodperio…

江苏一学霸,高考居然考了0分,老师们调取了监控后,才发现真相

学校里的学霸,李明,一直以来都是大家羡慕的对象。他聪明伶俐,学习优秀,每次考试都能轻松取得满分。而这次高考,他的成绩却让所有人大跌眼镜——零分!这个让人难以置信的结果引发了全校师生的困惑和疑问。 在…

还傻傻搞不懂MySQL事务隔离级别么(图文并茂,保证你懂!)

本文首发于公众号【看点代码再上班】,欢迎围观,第一时间获取最新文章。 原文:还傻傻搞不懂MySQL事务隔离级别么(图文并茂,保证你懂!) 大家好,我是tin,这是我的第25篇原创…

MySQL 服务无法启动

问题场景: 启动mysql:net start mysql 临时解决办法: tasklist| findstr "mysql"taskkill/f /t /im mysqld.exemysqld --console重新打开一个cmd测试连接mysql 永久解决办法: 找到Mysql的根目录,删除dat…

云原生时代,如何通过极狐GitLab x KubeSphere 构建安全应用?

目录 DevSecOps 是什么?如何帮助我们打造云原生安全生态? 如何寻找云原生 DevSecOps 落地切入点? 第一层:K8s 安全 第二层:容器镜像安全 第三层:应用程序安全 这么多安全功能,如何去实现落…

RISCV Reader笔记_5 RV32A,RV32C

原子指令 RV32A 是 RISCV 支持原子操作的扩展。主要有两种实现方式:内存原子操作(AMO),加载保留/条件存储(load reserved / store conditional) AMO:一个处理器对内存的操作不会被打断&#xf…