软件体系结构-6.REST架构_哔哩哔哩_bilibili

基础信息:

1.设计模式和软件体系结构的区别:

image.png

2. mvn spring-boot:run可以让spring项目跑起来

3.CBD:基于构建构件的软件开发

构建开发例子:

springboot项目导入了模板引擎依赖和springsecurity依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Controller//注意这里是contreller注解,而不是@RestController;后者是基于RESFUL风格的请求;
//后者返回的是一个单纯的字符串,而前者返回的是一个视图的名称
public class SimpleController {
// ${}获取配置文件中的信息
@Value("${spring.application.name}")
String springApplicationName;
@GetMapping("/")
// Modle返回的视图模型
public String homePage(Model model){
// 下面的方法给视图新增了一个appName属性。该属性可以在模板引擎中用
model.addAttribute("appName",springApplicationName);
return "home";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<!--模板引擎,这里不用添加命令空间,因为导入了模板引擎依赖 -->
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>Home Page</p>
<p>Welcome to <span th:text="${appName}"></span></p>
</body>
</html>
1
spring.application.name = My First Web App

image.png

反转控制和依赖注入:

image.png
控制反转IOC:image.png
上面提供服务的是Controller组件,请求者是Web Server.
控制反转的概念:
(一个组件并不创造它所依赖的组件,而是由其他控件去创建。)
image.png
特别符合依赖倒置原则也就是构建不依赖具体的实现类,而是依赖于一个接口。
(反转控件就是由一个容器独立的定义一组构建以及他们之间的依赖关系,用这种方式实现把构建在运行时组合在一起,在构建生命周期的特殊时间段调用它)
image.png
实现反转控制可以通过依赖注入或者Service Locator来实现。
image.png
image.png
总结:

image.png

注解的理解:

Java注解入门到精通,这一篇就够了_java注解精通联系-CSDN博客
Java 注解 —— 注解的理解、注解的使用与自定义注解_java注解-CSDN博客

总结:

Redirecting…
极客企业版

分层架构:

image.png
三层体系结构:
image.png

客户机服务器模式:

image.png
image.png
Fat Client:
image.png
image.png

基于servlet的BS架构:

image.png
Spring Boot进阶(85):配置Jetty容器|超级详细,建议收藏_springboot jetty-CSDN博客
spring-boot更好jetty服务器后用:mvn jetty:run启动项目

模型-视图-控制器:

image.png
image.png

MVC的概念:

image.png

image.png
上面的UI可以是模板引擎。
image.png
接受用户请求之后,业务不用在serve当中实现了,而是交给另外一个组件来实现这个组件就是Modle,Modle实现相关业务逻辑。Model可能是一个算法模型,或者是和数据库交互进行存储持久化操作等等。Modle执行业务逻辑得到的结果交还给Controller,Controller再交给UI进行渲染作为Respanse返回给用户。把原理单独的servlet拆分为3部分了,Modle,View,Controller.
Controller接收用户请求并解释用户请求交给Model来执行业务逻辑,得到的结果返回给控制器然后返回交给视图View,View将渲染后的结果当中响应返回给Client.
image.png
例子:
image.png
image.png
image.png

springmvc:

image.png
Dispatcher:调度,分配。
image.png
这里的Controller并不是把MVC中的M和C结合到一起了。Controller会调用相关Model中的方法。
image.png

测试Controller:@WebMvcTest();

测试类上添加@WebMvcTest注解,该注解的属性值就是要测试的类,如果该要测试的类需要注入Modle的时候,也技术依赖Modle类,测试中;在测试类中要注入@Autowired MockMvc组件模拟发送请求并断言。
image.png
单纯只添加了这个注解,如果测试的类也就是控制类的时候,如果

REST:

image.png
image.png

统一资源接口:

所有的东西在REST下都称作资源。image.png
image.png
上面的URL中分号;代表同级关系,/代表层级关系。?后面是查询字符串,代表资源的过滤要满足的条件。
image.png
HTTP 与 HTTPS 的区别 | 菜鸟教程
image.png
HEAD方法跟GET方法相同,只不过服务器响应时不会返回消息体,只返回资源响应的头部信息。 一个HEAD请求的响应中,HTTP头中包含的元信息应该和一个GET请求的响应消息相同。 这种方法能够用来获取请求中隐含的元信息(元信息是描述数据或信息资源的数据),而不用传输实体自己。 也常常用来测试超连接的有效性、可用性和最近的修改。这里的资源指的是URL定义的一个资源。
image.png
get请求的安全是不管请求多少次都不会改变服务器的状态的,幂等是多次HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用,幂等性——是系统的接口对外一种承诺(而不是实现),承诺只要调用接口成功,外部多次调用对系统的影响是一致的。
一个幂等的操作典型如:把编号为5的记录的A字段设置为0,这种操作不管执行多少次都是幂等的。
一个非幂等的操作典型如:把编号为5的记录的A字段增加1,这种操作显然就不是幂等的。这里get幂等的意思是多次get都是获取同一资源,对服务器上的资源没有副作用。
image.png
理解http的幂等性 - yjge - 博客园
image.png
post url请求中url标识对该请求的处理并创建资源,这样多次post请求可能会生成多个资源实例,其多次请求对服务器产生了不一样的效果:生成了多个url资源;但是put请求中的url就是该表该要修改的资源,多次相同的put请求都是对同一个url产生效果。
就跟上面一样:put请求是用客户端的实例号创建资源,后面的相同的put请求就是在相同的url上进行修改。
Snipaste_2023-10-23_09-01-35.png
image.png
image.png
总结:url代表的是服务器一个资源的标识符,一个资源可以有多个标识符;但是一个url只能指向一个资源。
url中的?后面跟的是参数,分号代表同级下的资源,/斜杠代表层级结构。
REST中的get,HEAD是安全且幂等的。安全是服务器中的资源在该请求下不会发送变化,幂等是同样的请求,多次都是针对同一个url,且对系统资源的影响是一样的就是幂等性。
get HEAD是安全幂等的,是他们的请求既不会对服务器的资源产生变化,且多次请求都是对同一个资源进行获取,对服务器是无影响的。
POST是不安全且不幂等的,因为post请求是创建资源或更新资源,都会资源发送变化(就算改变后的数据和改变前的数据是一样的,但是该数据的确是改变了的)。POST URL请求中的URL是服务端的请求对象,这里的URL并非操作资源的标识符,指定了URL请求对象可能在多次POST会产生不同的情况,也就是2次同样的POST请求可能操作的资源不是同一个,这样对服务器的影响是不一样的。
PUT请求是不安全但是幂等的。幂等的原因是PUT URL中的URL指向是具体的资源,多个相同的PUT请求都是对同一个URL进行操作。

REST的资源表征和状态转移:

image.png
比如数据库中的一条记录就是一个资源,它可以表示为JSON格式作为响应体响应出去,也可以作为相应的变量传递给模板引擎,后面的情况就是资源的表现层。
image.png
image.png
image.png
image.png
image.png
状态转移:
image.png
image.png
image.png
image.png
上面的点击进入下一个页面并成功进入到下一个页面了,就是客户端实现了状态转移。
SpringBoot HATEOAS用法简介 - smileNicky - 博客园
Spring ResponseEntity 详解:从原理到实践

可扩展架构:

传统的CS架构只有一个服务器,当请求数量特别多的时候,服务器压力特别大。

压力测试:

image.png
使用IntelliJ开发Gatling - 咻咻ing

垂直扩展:

更新硬件或者更好服务器提到性能。
https://blog.csdn.net/qq_40298902/article/details/106543208

SpringCaching Redis:

@Repository 与 @Mapper的区别-CSDN博客
【精选】【Spring Boot】Spring Boot + H2 Database 示例_springboot h2 database创建表-CSDN博客
haproxy负载均衡_sorry#的博客-CSDN博客

SpringsessionJDBC:

session存活时间
可扩展架构-续

管道过滤器结构:

image.png
image.png
image.png
image.pngimage.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
JavaIO流大都情况下是这个模式。
image.png
image.png
pipe实现了在父子进程之间的通信。
image.png
image.png
通过中间形式实现不同语言的互通。

SpringBatch:进行大批批处理的框架

image.png

image.png
image.png
Spring Batch
Batch
image.png
image.png

事件驱动架构:image.png

image.png

image.png
image.png
image.png
image.png
image.png
image.png
Spring Event奇技淫巧 - 菜菜聊架构 - 博客园
Just a moment…
image.png
image.png
image.png

响应式架构:

响应式架构比springmvc吞吐率高,执行效率也高。
image.png
image.png
image.png
原因:REST风格的spring项目,当每个请求来的时候就会在tomcat服务器中的线程池中创建一个线程,而线程的创建和切换都会有额外的开销,但是当其中的一个用户请求创建的线程陷入到了阻塞,分配给该线程的cpu是浪费的;而响应式是将数据的请求当成一个流,当一个请求陷入了阻塞,线程就会切换到另外的地方处理其他失去而非等待。
image.png
image.png

复习:

软件体系结构期末复习
软件体系结构核心点复习
软件体系结构期末复习六十题_软件设计与体系结构期末考试题-CSDN博客
1.软件架构包括组件、连接件和约束三大要素。

  • 组件:可以是一组代码,也可以是独立的程序。
  • 连接件:可以是过程调用、管道和消息等,用于表示组件间的相互关系。
  • 约束:组件连接时的条件。

“4+1”视图模型 - QI XIN - 博客园
软件体系结构期末复习
主义上面2种关于4+1不同的说法,但是实质是一样的,只不过使用的标准不一样。第一个是某个论文提出的,第二个是Rational Rose中提出的,但是他们的本质是不变的。
1.逻辑视图是描述系统的功能需求的,也即是系统提供给用户什么服务。通常包括类图、对象图、状态图和协作图
2.过程视图:描述系统中的进程,该视图通常包含活动图、顺序图等。
3.开发视图侧重于软件模块的组织和管理。也就是组织软件模块,库,子系统,开发单元。

  • 描述系统的各部分如何被组织为模块和组件。
  • 该视图通常包含包图和组件图。
  • 管理系统体系结构中的层非常有用。

4.物理视图:将其他元素映射到处理和通信节点。描述如何将前三个视图中所述的系统设计实现为一组现实世界的实体,该视图通常包含部署图,展示了抽象部分如何映射到最终部署的系统中。
5.用例视图(场景视图):将其他视图映射到重要的用例(这些用例被称作场景)上对体系结构加以说明。场景视图就是描述现实中的一个系统运用场景的过程;

  • 从外部世界的角度描述正在建模的系统的功能。
  • 需要使用此视图来描述系统应该执行的操作。 所有其他视图都依靠用例视图(场景)来指导,这就是将模型称为4 + 1的原因。
  • 该视图通常包含用例图,描述和概述图。

为什么事件驱动的特殊风格的架构存在数据交换的问题?

1
2
3
4
5
6
7
8
9
10
一个问题是事件驱动架构中的数据交换需要通过事件消息进行,这可能导致数据的复制和传递过程。
当一个事件被触发时,它必须通过事件消息进行传递到相应的处理器或订阅者。这可能涉及将数据从
一个组件复制到另一个组件,从而引入了额外的开销和延迟。如果系统中存在大量频繁的数据交换,
这种复制和传递过程可能会成为性能瓶颈。
此外,事件驱动架构中的数据交换通常是异步的。当事件被触发时,发送事件消息的组件不会立即等待接收方
的响应。这意味着在事件消息被处理之前,发送方无法得知接收方的状态或结果。这种异步性质可以增加
系统的复杂性,特别是在处理涉及多个事件和依赖关系的复杂业务逻辑时。
另一个可能的问题是事件驱动架构中的数据一致性。由于事件消息的异步性质,可能存在事件消息的顺序
问题或丢失问题。如果事件消息的顺序很重要,或者某些事件消息丢失将导致数据不一致,那么
在设计和实现事件驱动架构时需要考虑这些问题,并采取适当的措施来确保数据的一致性。

黑板知识库:

1
2
3
4
5
6
7
8
9
黑板知识库(Blackboard Knowledge Base)是一种软件架构中的组件,用于支持基于协同问题解决的系统。它的设计灵感来自于人类协同问题解决的模式,其中多个专家在一个黑板上共同解决复杂问题。

在黑板知识库的架构中,系统的问题被表示为一个共享的黑板,也称为黑板区域(Blackboard Area)。问题的初始状态被放置在黑板上,然后系统中的多个独立的专家组件(称为知识源)并行地观察和分析问题,并尝试提供解决方案。

每个知识源是一个独立的模块,具有特定的知识、推理能力或算法。它们独立地工作,观察黑板上的问题状态,并生成或修改与问题相关的信息。每当知识源做出改变时,它将其结果写回黑板,以便其他知识源可以读取并进行进一步的推理和分析。

黑板知识库架构的核心思想是通过知识源之间的协同合作来解决问题。不同的知识源可以具有不同的专业领域知识、算法或推理能力,它们可以根据自己的知识和推理结果来决定何时对问题状态进行修改。这种协同合作的方式可以使系统更具灵活性和适应性,能够处理复杂的、多学科的问题。

黑板知识库的架构适用于解决那些问题领域复杂、需要多种专业知识和推理方法的应用。它可以应用于领域如人工智能、专家系统、机器学习和数据挖掘等。

C2风格是什么?

1
2
3
4
5
C2风格的设计灵感来自于人类协同工作的模式,例如团队合作、集体智慧和群体决策。它提供了一种机制和架构,使得分布在不同位置的多个计算节点能够相互通信、协同工作和协同决策。

C2风格的核心概念是"C2",即指挥与控制(Command and Control)。在这种风格下,一个或多个指挥节点(Command Node)负责协调和指导系统中的其他节点。指挥节点可以收集、分析和传达信息,协调节点之间的工作,并做出决策。

其他节点被称为执行节点(Execution Node),它们根据指挥节点的指令执行任务,并将结果反馈给指挥节点。执行节点之间可以相互通信和协作,共同解决问题。指挥节点可以根据执行节点的反馈信息进行调整和决策,以实现协同工作和协同决策的目标。

剪切板应该是什么体系结构?

1
体系结构的角度来看,剪切板功能可以被认为是一个典型的发布-订阅(Publish-Subscribe)或观察者模式(Observer Pattern)。应用程序可以将数据发布到剪切板,并通知操作系统,表示数据可供其他应用程序订阅和使用。其他应用程序可以订阅剪切板,并在有新数据可用时接收通知,并获取数据以供其自身使用。

image.png
过程控制是属于控制流的体系结构。
image.png
D是拓扑的意思。
image.png
D选项,B/S体系结构是不利于事务的处理的。
image.png
C选项的移植困难是因为不同的操作系统兼容性不一样,维护困难和升级困难是因为客户端被安装到本地电脑上了需要逐个升级和维护。
image.png(B选项可以这样理解spring中的控制层返回的是一个页面也就是view,他们并没有完全的解耦;C选项视图要通过控制器才能访问模型数据。模型(Model)是MVC架构中的组成部分之一,它代表应用程序的数据和业务逻辑。模型负责存储和管理数据,以及定义与数据相关的操作和规则。模型封装了数据的访问方法,并提供了对数据的增加、删除、修改和查询等操作。而spring中的模型我们常常用到它的存储和管理数据功能来动态修改模板引擎的数据。可以理解为springboot中的model将MVC中的V分割为了2部分,一部分是操作数据,一部分是存储和管理数据的)
image.png
XML:
image.png
image.png
image.png
image.pngimage.png
Web服务的特点:
image.png
image.png
image.pngimage.png
简单对象访问协议(SOAP)是一个基于XML, 在松散分布式环境中交换结构化信息的轻量级协议,它本身不定义任何应用
语言。
image.png
六、Web服务体系结构_wsdl定义了服务的接口、格式协议、实现三个层次的概念。每一层各包括哪些基本元素-CSDN博客
软件体系结构的描述方法有非标准图形符号,UML,ADL,,但是无法用XML来描述,其中非标准图形符号的优点是直观形象,简单易用。
软件体系结构的描述方法:
image.png
软件体系结构用UML描述的特点:
image.png
image.png
image.png
image.png
上面的ADL是软件体系结构的形式化描述。
image.png
服务发现是服务使用者的特性
image.png
XML本身不显示数据的样式,但是可以和其他技术(XSLT)结合来显示样式。

1
2
3
XML本身并不关注数据的显示样式,它主要用于表示和组织数据的结构和内容,并提供一种通用的标记语言来描述数据。XML可以用于存储、传输和交换数据,但它并不提供直接的样式描述功能。

XML可以与其他技术和语言(如XSLT和CSS)结合使用,以实现数据的样式化和展示。通过使用XSLT(Extensible Stylesheet Language Transformations)和CSS(Cascading Style Sheets),可以将XML数据与样式表关联,并将其转换为特定的显示格式,例如HTML或PDF。但这种样式化的过程是通过外部的样式表和转换规则来实现的,而不是XML本身提供的功能。

image.png
可以这样理解对象层就是类图中某个具体类的名称,特征层就是类的属性和方法;特征层描述的是类的特征(属性)和相关问题域的行为(方法),关系层就是类之间的关系,比如依赖,关联什么的。
image.png
image.png
image.png
C/S体系结构和文件共享体系结构一般处理的情况不一样,文件共享体系结构处理的是文件的上传和修改等业务操作;文件体系结构在客户端和服务端传输的是文件,而C/S体系结构传输的是响应和请求数据,文件共享体系结构中的文件数据在客户端和服务器之间进行实际的传输和共享。当用户需要访问或编辑文件时,文件被从服务器传输到客户端,用户对文件进行操作后,可能会将修改后的文件再次上传到服务器。因此,文件共享体系结构涉及大量的文件数据在客户端和服务器之间来回移动。客户/服务器结构返回给客户端的是处理后的结果数据,文件服务器结构返回给客户端的是包含客户所需数据的文件
image.png
C/S体系结构开发的软件在安装和部署的时候要考虑不同的操作系统,相比于B/S不那么容易安装和部署。
image.pngimage.png
Snipaste_2023-11-15_13-36-34.png
image.png
Snipaste_2023-11-15_13-36-58.png
中间件:
image.png
中间件的定义:一种连接类软件,由一组服务构成,用来连接不同的软件构件或应用系统这些服务可以让运行在同一台或多台机器上的进程进行通信交互;在分布式计算环境中是一种处于操作系统和应用系统之间的软件层。
image.png
中间件的类型:RPC:远程过程调用,MOM:消息中间件;ORB:对象请求代理中间件;SQL;TP Monitor:事件处理监听器;image.png
image.png
image.png
image.png
image.png
MVC遵循稳定依赖原则,其中稳定依赖原则是SDP;MVC稳定依赖的部分是模型,因为模型不依赖于控制器和视图。
image.png
image.png
MVC的被动模式:
image.png
image.png
image.png
SOA的优点:

  • (1)灵活性,根据需求变化,重新编排服务。
  • (2)对IT资产的复用。
  • (3)使企业的信息化建设真正以业务为核心。业务人员根据需求编排服务,而不必考虑技术细节。

WSDL是SOA中Web服务的描述,WSDL文档也描述了Web服务的接口。
软件体系结构是什么?
软件体系结构来源于建筑学的体系结构,覆盖软件开发的全周期,主要聚焦于系统的总体结构以及需求和实现之间的对应;注重组件的可重用性和软件的健壮性,可维护性;软件体系结构=构件+连接件+拓扑结构+约束+质量,其中构件,连接件,约束是软件体系结构的三大要素;

1
2
3
4
软件重用是指在软件开发过程中,利用已有的软件组件、模块、库、框架或设计模式等,以提高开发效率、
降低成本,并改善软件质量和可维护性的实践。它的核心思想是通过重复使用已有的可靠和经过验证的
软件资产,避免从头开始编写代码,从而加快开发速度、减少开发风险并提高软件的质量。
软件重用的几个关键是:组件和模块重用;第三方库和框架重用;设计模式和架构重用;经验和知识重用

批处理和管道过滤器的比较:
image.png
批处理是将多个任务按照一定的顺序排好自动执行的,而管道过滤器是逐步执行的,数据流经过一个过滤器后处理信息后传递该后一个过滤器;管道可以在Linux系统中实现父子进程的通信,而批处理不可以。管道过滤器可能会发生死锁,其也支持死锁检测;

1
2
3
4
5
(1)合理地划分三层结构的功能,可以使系统的逻辑结构更加清晰,提高软件的可维护性和可扩充性。
(2)在实现三层C/S架构时,可以更有效地选择运行平台和硬件环境,从而使每一层都具有清晰的逻辑结构、
良好的负荷处理能力和较好的开放性。
(3)在C/S架构中,可以分别选择合适的编程语言并行开发。
(4)系统具有较高的安全性。

软件体系结构的描述方法有:
image.png
1.非标准图形符号描述:特点是:语义丰富,但是不精确,直观形象,简单易用
2.UML:侧重于面向对象分析,语义丰富,且精确;可以根据UML图生成代码;
3.模块接口语言:MIL,语义比较丰富,精确,但是实现级别,层次较低;
4.体系结构描述语言ADL:在软件体系结构抽象级上提供了精确的定义,提供了强有力的分析能力,抽象和实现细节无观性,为体系结构元素定义了一系列的符号。语言准确无二义性;
image.png

1
开发关注的是组件的组合方式,也就是开发环境中的静态组织结构,其属于开发期的质量属性

image.png
image.png
image.png
开发视图通常使用构件图来描述。
image.png
image.png
image.pngimage.png
image.png
image.png
Web服务所提供的接口、对Web服务的请求、Web服务的应答数据都是通过XML来描述的。
image.png
image.png
image.png