重点复习题
- 什么是软件体系结构?什么是软件构件?在Spring框架中,构件的组织与管理由谁负责,构件之间的依赖关系是如何实现?
软件体系结构是宏观设计,主要关注系统包括哪些部件以及这些部件之间是如何交互的。
软件构件是具有某种功能的可复用的软件结构单元。构件有特定的接口,明确上下文依赖,可以被独立部署。
Spring框架负责;提供服务的组件是被“注入”而不是被“直接写入”到请求者的代码中的。运行时,由框架把这些组件组织在一起。这种技术称之为依赖注入。同时,框架需要构件遵守一些特定的约定,一般需通过写配置文件的形式来被告知如何注入代码。
- 软件架构设计的重要性是什么?
利益关注方的沟通工具
早期决策都是架构设计决定的,从总体上决定了软件设计是对的还是错的,决定了软件最后的开发结果
好的架构还可以作为不断传递的财富,被重用。
- 所有进行数据管理的桌面应用在逻辑上一般采用什么软件架构,请画图描述?在物理上采用可以采用哪三种方式的结构进行部署?
答:采用分层结构。展示层:用户界面,和用户进行交互,绘制一个窗口,界面上有各种的输入控件,用户可以通过这些控件看到数据的状态并进行数据的操作。(业务逻辑处理层:接受用户在展示层的各种操作,进行额外的处理,如判断数据是否合法,判断用户是否有权限等各种各样的业务处理,如果有权限再将数据保存或者读取的请求交给数据访问层,即逻辑判断。数据访问层:把数据写入到数据库或者磁盘的代码,这些代码不是直接被用户调用。用户在展示层进行的操作是要依靠业务逻辑层这个桥梁来对用户的操作进行解释和处理,最终决定如何用数据访问层来进行数据的持久化。)
答:客户机/服务器模式,具体三种方式
- 胖客户瘦服务器端:展示层放在客户端,业务逻辑层和数据处理层放在服务器端,业务逻辑代码的更新容易,部署和管理方便。
- 瘦客户胖服务器端:展示层和业务逻辑层放在客户端,数据处理层放在服务器端,业务逻辑代码的更新需要在所有客户端上都进行更新升级,管理开销较大。
- 3)三层结构:即客户端、应用服务器、数据库服务器。用户这一层通过各种各样的通信协议跟应用服务器进行通信,将它在展示层进行的操作告诉应用服务器,也就是执行对应的业务逻辑层的代码,业务逻辑层的代码再通过数据访问层的协议将对数据或者文件的操作交给的第三层进行数据的管理。形成了三层的分布式架构模式。其中,通过浏览器完成三层架构的实现方法,称之为B/S,用户的GUl被运行在浏览器上,每次从server上下载GUI的代码,可以拿到最新的GUI的界面。使得部署和管理的开销更小。比thin client开销更小。因为用户界面代码更新也并不需要额外去处理。
- Restful架构能解决MVC开发中的什么问题?
答:1.为了解决展示页面和计算逻辑混杂,MVC中引入了模板引擎。模板引擎可以使写模板的人和写计算逻辑的人实现一定的解耦。但UI中需要的变量名以及请求发送到后台哪个controller的方法等内容仍需和后端写业务逻辑代码的人员进行沟通,没有完全独立开来。且都同属在一个工程目录下。
⒉.用户的接口不标准。控制器中处理用户请求的方法与requestmapping对应,当用户发过来的请求URL之后就调用controller中相应的方法去解释,这些URL从用户角度看,就是系统与用户进行交互的接口,但是系统给用户提供的接口是不标准的,URL的命名是随意的,需要沟通URL的格式。
- Restful架构中http请求的常见方式有哪些?
GET(SELECT):从服务器获取资源(一项或多项)-POST (CREATE/insert):在服务器新建一个资源
PUT(UPDATE):更新资源(客户端提供改变后的完整资源)
PATCH(UPDATE):部分更新资源(客户端提供需要改变的部分资源)-
DELETE(DELETE):删除资源
HEAD:获取资源头部(元数据)
OPTIONS:获取资源信息,如某资源有哪些接口可以使用。
- 大量用户并发访问时,服务器响应变慢,用户体验较差,如何解决?
答:(1)垂直扩展:通过买更好的设备,提升系统性能。无法购买更好的设备,可通过虚拟化技术(如容器技术和虚拟机)削弱机器的性能,如削弱80%、50%等的方式来逐步的对比在不同性能下用户的体验度。用容器技术的话可以利用谷歌的开源工具Jib,将spring boot应用直接打包成可以在docker上运行的应用,封装成docker的镜像。垂直扩展优点:应用不需更改,可以直接换机器实现。垂直扩展缺点:机器本身性能有上限。(2)水平扩展:买更多的机器。用户访问的仍然是单一的server,实际由负载均衡器派送用户请求到不同server上,将所有负载分摊到不同server上。用户看来好像是被一个很闲的server处理着请求,实际是被负载均衡器控制着不使它的请求跟别的用户请求发生冲突,从而提升用户的体验。负载均衡器常见的是HAPROXY 。
- 为了提高用户的访问速度,水平扩展中服务器通过cache共享相同请求的计算结果,那么如何知道需要的请求结果在哪个cache上?
答:哈希或一致性哈希。因为server按照一定的规则,将要存储的数据进行分区存放到不同的cache server上,不需要负载均衡器。而分区的方法主要是哈希或一致性哈希。所以查找的方法就是哈希或一致性哈希。哈希方法是根据缓存数据的某些键算一个哈希值,在和n(缓存服务器的数量)求模得到存取的cacher server的标识号,这个数字范围在0-n-1这个范围上的整数,比如O,然后把这个键值对应的程序计算结果存储到0号cacher server上。当取数据的时候就用同样的键值去进行规则计算得到存储结果的cacher server。这种方法当分布式系统中横向伸缩或节点故障等,会形成节点的自动增加或删除,导致几乎所有的绑定失效大量失效会造成了某个时间点的网络抖动和性能急剧下降。一致性hash算法把取余的基数固定为一个常数2432,把范围控制在[0,2^32-1]的区间。把这个区间按照顺时针的方向均匀分布在一个圆环上,称之为HASH环。hash环正上方的点代表o,按顺时针依次是1、2、
3…2^32-1。把集群的节点根据IP或节点名进行HASH得到散列码并取余后分布在hash环上。
- 什么是微服务架构?spring框架中提供微服务的技术架构叫什么?
答:将一个大的系统拆成若干个独立的小系统,分别进行维护和部署,它们之间可以通过轻量级的通信协议(http等)进行通信,在功能上还是一个完整的整体,这样的设计方法称之为微服务的架构。微服务下,每个功能部件的本身形成一个可以独立运行的系统,它们之间用通信协议进行通信,形成一个功能和之前一样的大系统。
spring框架通过Spring Cloud来提供微服务
- 微服务系统中为了防止因为某个服务失效而导致其他服务失效,采取什么措施?
答:采用断路器这样的概念来解决。和生活中短路开关的概念一样,一方面保护短路电路不致于电流过大出现火灾,另一方面通知用户。在微服务系统中,则是一方面通知调用者,使得调用者采取一些措施不要导致错误不断曼延到其他服务。调用者将调用请求不是直接发给被调用方,而是交给断路器,由它转发给被调用者。如果被调用者产生了问题(如过忙、线路断开等),断路器感知到该问题。通知用户或者提供一些默认的结果,以防止调用者失效、错误蔓延。
- Spring中通过Spring Batch支持管道过滤器架构的应用设计,请用图描述包括哪些核心构件以及它们之间的关系?
组成:Pipes/Filters/Data Source/Data Sink
Filter: 完成单步数据处理功能,从pipe中接受数据,处理之后再交给下一个Filter
Data Source/Data Sink/Filter以Pipe连接
Pipe连接相邻元素,前一元素的输出为后一元素的输入。
- 请比较发布订阅者管理模式和观察者模式。spring框架中支持开发的技术是什么?
观察者:事件管理器集成在事件源中,隐含了事件分发这个职责。事件源知道所有事件的消费方。观察者这个对象发现对象(目标)改变之后,自动通知其他对象(观察者,可以是多个,自由添加),其他对象作出反应。事件源和事件消费者耦合度较高。事件源和事件消费者之间的通信是同步的。
发布订阅模式:事件源和事件消费者之间通过事件通道进行解耦,双方都不知道对方的存在。事件源和事件消费者之间的通信是完全异步的。事件通道作为调度中心,管理事件的订阅和发布工作,彻底隔绝了订阅者和发布者的依赖关系。即订阅者在订阅事件的时候,只关注事件本身,而不关心谁会发布这个事件;发布者在发布事件的时候,只关注事件本身,而不关心谁订阅了这个事件。观察者模式是松耦合,发布订阅模式发布者和订阅者完全解耦的。
- 举两个例子说明什么是事件驱动架构,它包括哪些核心构件?为什么要使用事件驱动架构?事件驱动架构的实现有哪些方式,比较它们的优缺点?
答:gui设计、调试器。当软件系统中存在的一些事件发生,导致其他部分执行或者操作的设计方法叫事件驱动架构。
答:事件生产方产生事件。由事件管理器部件将事件散发出去告诉一个或若干个的事件消费方。事件消费方对事件进行评估是否做出响应,若响应则执行相关的动作完成这个事件。所以事件发生,驱动了另外一些部件的响应。整个系统的运行是靠事件来驱动运行的。事件消费方之前需要在事件管理器这里注册相应事件,当该事件发生时,事件管理器会触发该事件消费方。
原因:因为实现了软件系统中的松耦合原则。只负责产生事件,不关心谁响应、产生的后果。只负责处理事件,但无法决定事件发生时间。只负责分发事件,不管事件内容。
实现方式:观察者模式、发布/订阅者模式。
观察者模式:
1)观察者和被观察者是抽象耦合的。
2)建立一套触发机制
缺点:
1)如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2)如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3)观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
发布/订阅者模式:优点:发布——订阅模式的优点非常明显,时间上解耦、对象间解耦。 在异步编程中,可以帮助我们完成更松耦合的代码,无论是在MVC、MVVM都有发布——订阅模式的参与。 缺点:创建订阅者要消耗一定的事件和内存。 过度使用,会导致程序难以跟踪维护。
- 响应式架构的实现方法是采用消息驱动通信中的发布订阅模式实现,spring的Reactive Streams定义了实现这种架构的规范,包括哪四个核心概念?
答:1)消息发布者:只有一个subscribe接口,是订阅者调用的,用来订阅发布者的消息。发布者在订阅者调用request之后把消息push给订阅者。2)订阅者Subscriber:包括四个接口,这些接口都由Publisher触发调用。(3)订阅Subscription:代表的是一种订阅上下文对象,它在订阅者和发布者之间进行传输,从而在两者之间形成一种契约关系.(4)处理器: Processor同时继承了Subscriber和publisher;其代表一个处理阶段。
- 请描述带有处理器的响应式架构程序设计步骤?