【SpringCloud】设计原则之分层架构与统一通信协议

一、设计原则之分层架构

应用分层看起来很简单,但每个程序员都有自己的一套方法,哪怕是初学者,所以实施起来并非易事

最早接触的分层架构应该是最熟悉的 MVC(Model - View - Controller)架构,其将应用分成了模型、视图和控制层,可以说引导了绝大多数开发者 

而现在的应用(包括框架)中非常多架构设计都使用此模式 

之后又演变出了 MVP(Model - View - Prosenter)和 MVVM(Model - View - ViewModel) 

这些可以说都是随着技术的不断发展,为了应对不同场景所演化出来的模型 

而微服务的每个架构都可以再细分领域模型 

经典的领域模型架构包括:Domain、Service 和 Reposotories 

核心实体(Entity)和值对象(Value Object)应该在 Domain 层,定义的领域服务(Domain Service)在 Service 层,而针对实体和值对象的存储和查询逻辑都应该在 Reposotories  层

值得注意的是,不要把 Entity 的属性和行为分离到 Domain 和 Service 两层中去实现,即所谓的贫血模型,史诗证明这样的实现方式会造成很大的维护问题

基于这种设计,工程的结构可以构造为:

- MicroService-Sample/src/domaingatewaysinterfacerepositoriesservices

当然,在微服务的架构中,每个微服务不必严格遵守这样的规定,切忌死搬硬套,最重要的是理解业务 

在不同的业务场合,架构的设计可以适当地调整,毕竟适合的架构一定要具有灵活性 

分层原则 

  • 文件夹分层法

应用分层采用文件夹方式的优点是可大可小、简单易用、统一规范,可以包括 5 个项目,也可以包括 50 个项目,以满足所有业务应用的多种不同场景

  • 调用规约 

在开发过程中,需要遵循分层架构的约束,禁止跨层次的调用 

  • 下层为上层服务 

以用户为中心,以目标为导向 

上层(业务逻辑层)需要什么,下层(数据访问层)就提供什么,而不是下层(业务逻辑层)有什么,就向上层(业务逻辑层)提供什么

  • 实体层规约 

Entity 是数据表对象,不是数据访问层对象 

DTO 是网络传输对象,不是表现层对象 

BO 是内存计算逻辑对象,不是业务逻辑层对象,不是只能给业务逻辑层使用

若仅限定在本层访问,则导致单个应用内大量没有价值的对象转换 

以用户为中心类设计实体类,可以减少重复对象和无用转换 

  • U 型访问 

下行时表现层是 Input,业务逻辑层是 Process,数据访问层是 Output 

上行时数据访问层是 Input,业务逻辑层是 Process,表现层是 Output 

二、 设计原则之统一通信协议

接口调用如果是远程调用,那么就构成了简单的分布式 

最简单的远程接口实现方式是 Web Service 或 REST 

当然,一个合理的分布式应用不仅仅是远程接口调用这么简单,还需要有负载均衡、缓存等功能 

实现分布式最简单的技术是 REST 接口,因为 REST 接口可以使用现存的各种服务器,比如使用负载均衡服务器和缓存服务器来实现负载均衡和缓存功能

关于通信协议,不同的公司有不同的选择,但是建议同一个公式内部使用统一的通信协议,比较典型的有 GRPC 和 BRPC 

GRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计 

目前提供 C、Java 和 Go 语言版本,分别是 GRPC、GRPC-Java、GRPC-Go,其中 C 版本支持 C、C++、NodeJs、Python、Rubby、Objective-C、PHP 和 C# 

GRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多重用请求特性,这些特性使得其在移动设备上表现更好,更省电和节省空间占用 

与 GRPC 类似,BRPC 源自百度,目前支撑百度内部大约 75 万个在线的实例 

其实基于以上的集中选择都能够完成高校的开发,团队内部使用统一的标准,这样更有利于模块化和统一标准 

服务间的通信通过轻量级的 Web 服务,使用同步的 REST API 进行通信 

在实际的项目应用中,一般推荐在查询是使用同步机制,在增删改时使用异步的方式,结合消息队列来实现数据的操作,以保证最终的数据一致性 

REST API 应为创建、检索、更新和删除操作使用标准 HTTP 动词,而且应特别注意操作是否幂等 

POST 操作可用于创建资源。POST 操作的明显特征是它不是幂等的。举例而言,如果使用 POST 请求创建资源,而且启动该请求多次,那么每次调用后都会创建一个新的唯一资源 

GET 操作必须是幂等的且不会产生意外结果。具体来讲,带有查询参数的 GET 请求不应用于更改或更新信息(而应使用 POST、PUT 或 PATCH)

PUT 操作可用于更新资源。PUT 操作通常包含要更新的资源的完整副本,使该操作具有幂等性 

PATCH 操作允许对资源执行部分更新。它们不一定是幂等的,具体取决于如何指定增量并应用到资源上。例如,如果一个 PATCH 操作表明一个值应从 A 改为 B,那么它就是幂等的。若它已经启动多次而且值已是 B,则没有任何效果。对 PATCH 操作的支持仍不一致。例如,JavaEE 7 中的 JAX-RS 中没有 @PATCH 注解 

DELETE 操作用于删除资源。删除操作是幂等的,因为资源只能删除一次。但是,返回代码不同,因为第一次操作将成功(200),而后续调用不会找到资源(204)

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

一  叶  知  秋,奥  妙  玄  心

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

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

相关文章

吴恩达《机器学习》10-4-10-5:诊断偏差和方差、正则化和偏差/方差

一、诊断偏差和方差 在机器学习中,诊断偏差和方差是改进模型性能的关键步骤。通过了解这两个概念,能够判断算法的问题究竟是欠拟合还是过拟合,从而有针对性地调整模型。 1. 概念理解 偏差(Bias): 表示模…

Oracle 最终抛弃了 Sun !

随着 Solaris 团队的彻底完蛋,看起来 Sun 微系统公司最终连块骨头都没剩下。 来自前 Sun 社区的消息表明,一月份的传闻(Oracle 裁员 450 人)成为了现实,上周五,Oracle 裁掉了 Solaris 和 SPARC 团队的核心员…

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

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

Debian 11.3 ARM64 安装中文语言包

文章目录 Debian 介绍1、执行命令2、语言选择3、修改设置 Debian 介绍 Debian是一种自由开源的操作系统,被广泛用于服务器、个人计算机和嵌入式设备。它是由全球志愿者组成的开发团队开发和维护的,以稳定性、安全性和自由性而闻名。 以下是一些关于Deb…

分块矩阵知识点整理:

1.分块方法:横竖线不能拐弯,思想为将矩阵分块看作向量计算 2.标准型 不一定是方的 特殊性:经过分块后会出现单位矩阵和0矩阵 3.分块矩阵的运算: 1.加减乘的运算与向量运算相同 4.分块矩阵求转置: 1.将子块看作普通元素求转置 2…

2017年4月10日 Go生态洞察:开发者体验工作组介绍

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

计算机应用基础_错题集_PPT演示文稿_操作题_计算机多媒体技术操作题_文字处理操作题---网络教育统考工作笔记007

PPT演示文稿操作题 提示:PPT部分操作题 将第2~第4张幻灯片背景效果设为渐变预置的“雨后初晴”效果(2)设置幻灯片放映方式

HTTP/2:多路复用、服务器推送和首部压缩的革命

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

【小沐学写作】免费在线AI辅助写作汇总

文章目录 1、简介2、文涌Effidit(腾讯)2.1 工具简介2.2 工具功能2.3 工具体验 3、PPT小助手(officeplus)3.1 工具简介3.2 使用费用3.3 工具体验 4、DeepL Write(仅英文)4.1 工具简介4.2 工具体验 5、天工AI…

Linux学习记录

Linux 文章目录 LinuxLinux发行版Debian 分支Red Hat 分支Arch Linux 分支 服务器基础操作lscat和less设置权限删除文件和目录搜索文件 cmake使用文件 Linux发行版 一个典型的 Linux 发行版除了 Linux 内核以外,通常还会包括一系列 GNU 工具和库、一些附带的软件、…

华为云需求管理CodeArts Req常见问答汇总

1.【Req】看板、Scrum、IPD系统设备类、IPD独立软件类、IPD自运营软件5种模板有什么区别,如何选择 答:看板是业界流行的轻量、灵活和简单的团队协作方法,没有工作项的Epic/Feature/Story层级划分,直接将需求、任务和缺陷可视化&a…

单片机AT89C51直流电机控制电路PWM设计

wx供重浩:创享日记 对话框发送:直流电机 获取论文报告源码源程序原理图 此文将介绍一种直流电机,详细阐述了用单片机输出口所给占空比的不同实现电机的调速的设计方法;着重讨论L298用于电机驱动时特有的优势。直流电机调速具有…

docker devicemapper: Error running DeleteDevice dm_task_run failed

docker 删除容器,遇到: devicemapper: Error running DeleteDevice dm_task_run failed 异常 [hadoophadoop02 ~]$ sudo docker rm 5ede1280f0bf Error response from daemon: container 5ede1280f0bf791e91d40038b15decd42e8923546ae578abd96e08114c76…

Python基础语法之判断语句

1.布尔类型和比较运算符 布尔类型&#xff1a;数字类型的一种。 比较运算符&#xff1a; > < > < ! 2.if语句基本格式 if 要判断的条件&#xff1a; 条件成立&#xff0c;即做~ 例子&#xff1a; 注意&#xff1a;格式上冒号和缩进 3.if else组合…

result.append(path[:]) 和 result.append(path) 之间的区别

result.append(path[:]) 和 result.append(path) 之间有一个重要的区别&#xff0c;这涉及到对列表的浅拷贝。 result.append(path)&#xff1a; 这样直接将 path 添加到 result 中。由于列表是可变对象&#xff0c;result 中存储的是对 path 列表的引用。如果后续修改了 path…

2023年【道路运输企业安全生产管理人员】最新解析及道路运输企业安全生产管理人员复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 道路运输企业安全生产管理人员最新解析是安全生产模拟考试一点通总题库中生成的一套道路运输企业安全生产管理人员复审考试&#xff0c;安全生产模拟考试一点通上道路运输企业安全生产管理人员作业手机同步练习。2023…

matlab三维地形图

matlab三维地形图 %%%%—————Code to draw 3D bathymetry—————————— %-------Created by bobo,10/10/2021-------------------- clear;clc;close all; ncdisp E:\data\etopo\scs_etopo.nc filenmE:\data\etopo\scs_etopo.nc; londouble(ncread(filenm,lon)); lat…

ruoyi 前后分离部署502

ruoyi 前后分离部署502 我使用了nginx部署前端&#xff0c;使用docker部署。nginx文件如下&#xff1a; server {listen 8086; #设置端口listen [::]:8086; #设置端口server_name localhost;#access_log /var/log/nginx/host.access.log main;location / {root /…

DBeaver连接Oracle时报错:Undefined Error

连接信息检查了很多遍&#xff0c;应该是没问题的&#xff0c;而且驱动也正常下载了&#xff0c;但是就是连不上。 找了好久&#xff0c;终于找到一个可用的方式了&#xff0c;记录一下。 在安装目录修改dbeave.ini文件&#xff0c;最后一行添加 -Duser.nameTest。重启就可以…

学习Java53天,JDBC中工具类封装v2,以及BaseDao

import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; //事物时&#xff0c;Service和dao属于同一线程&#xff0c;不用再传参数了 /* 这个工具类的作…