十三 系统架构设计(考点篇)
1 软件架构的概念
- (1)分析设计在满足所规定的需求方面的有效性:
- (2)在设计变更相对容易的阶段,考虑体系结构可能的选择方案;
- (3)降低与软件构造相关联的风险。
- 数据设计主要关注于系统中数据的组织和存储方式,包括数据库、数据文件和全局数据结构的定义。数据设计体现传统系统中体系结构的数据构件和面向对象系统中类的定义(封装了属性和操作)。数据设计是软件体系结构设计中非常重要的一部分,因为它直接影响到系统的数据处理能力和效率
- 体系结构设计则主要关注软件构件的结构、属性和交互作用。确定各子系统模块间的数据传递与调用关系,以及模块间、系统与外部系统的接口关系。体系结构设计是软件架构的核心,它决定了软件系统的整体结构和行为,对系统的性能、可靠性、安全性和易维护性等方面有着直接的影响
软件架构设计与生命周期
1.需求分析阶段。
2.设计阶段。
- SA 模型的描述、
- SA 模型的设计与分析方法,
- 以及对 SA设计经验的总结与复用等。
- SA的基本概念(构件和连接子)-------这一层次主要涉及SA模型由哪些元素组成,以及这些组成元素之间按照何种原则组织。SA模型的基本构成元素包括构件和连接子,这些元素是构建系统架构的基础。
- 体系结构描述语言ADL-------ADL是一种支持构件、连接子及其配置的描述语言。它提供了标准化和形式化的方式来描述系统架构,使得不同背景的开发者能够更容易地理解和交流。常见的ADL包括UniCon、Rapide、Darwin、Wright、C2 SADL、Acme、xADL、XYZ/ADL和ABC/ADL等
- SA模型的多视图表示-------从不同的视角描述特定系统的体系结构,从而得到多个视角,并将这些视图组织起来用来描述整体的SA模型。这种多视图表示方法能够全面地反映系统的各个方面,确保在设计过程中不会遗漏任何重要的信息或功能
3.实现阶段。
- (1)研究基于SA 的开发过程支持,如项目组织结构、配置管理等。
- (2)寻求从 SA 向实现过渡的途径,如将程序设计语言元素引入 SA 阶段、模型映射、构件组装、复用中间件平台等。
- (3)研究基于 SA 的测试技术。
4.构件组装阶段。
- (1)如何支持可复用构件的互联,即对 SA 设计模型中规约的连接子的实现提供支持。
- (2)在组装过程中,如何检测并消除体系结构失配问题。
5.部署阶段。
- (1)提供高层的体系结构视图来描述部署阶段的软硬件模型。
- (2)基于SA 模型可以分析部署方案的质量属性,从而选择合理的部署方案。
6.后开发阶段。
架构设计概述
补充 :迭代和演化的定义
迭代是一种软件开发过程,它通过一系列的迭代周期来逐步构建软件。每个迭代周期包括需求分析、设计、实现、测试和集成等阶段,通过反馈和调整来不断完善软件。演化模型也是一种全局的软件生存周期模型,属于迭代开发方法的一种。它通过快速分析构造出软件的初始版本,根据用户反馈进行改进,最终得到满意的软件产品。
迭代和演化的区别
迭代和演化在软件开发过程中有所不同。迭代更注重每个阶段的逐步完善,通过多次迭代来达到最终目标。而演化则更注重从用户反馈中不断改进,通过快速原型构建和使用反馈来逐步完善软件。
实例说明
例如,在一个软件开发项目中,如果需求不明确,可以使用演化模型来快速构建原型,通过用户反馈来逐步明确需求并进行调整。如果需求已经明确,但需要逐步完善功能,则可以使用迭代模型,通过多次迭代来逐步实现每个功能模块。
迭代和递归是两种常见的解决问题的方法,它们在实现和思维方式上有一些区别。以下是迭代和递归的主要区别:
定义和结构:
- 迭代:通过循环结构重复执行一段代码,每次迭代的结果会作为下一次迭代的初始值,直到满足结束条件。迭代是环结构,从初始状态开始,每次迭代都遍历这个环,并更新状态,多次迭代直到到达结束状态。
- 递归:函数直接或间接调用函数自身,直到满足终止条件再逐层回归。递归是树结构,从字面可以理解为重复“递推”和“回归”的过程,当“递推”到达底部时就会开始“回归”,其过程相当于树的深度优先遍历。
时间复杂度:
- 迭代:迭代的时间复杂度可以通过查找循环内重复的周期数来发现。在实际应用中,迭代的效率通常高于递归,尤其是在循环次数较大时。
- 递归:递归的时间复杂度可以通过根据前面的调用查找第n个递归调用的值来查找。递归的时间复杂度可能会呈指数级增长,尤其是在有大量递归调用时。
效率:
- 迭代:通常在循环次数较大时,迭代的效率明显高于递归,因为递归涉及函数调用的开销。
- 递归:虽然代码长度较小,但由于函数调用的开销,当递归调用次数较多时,效率较低。
应用场景:
- 迭代:适用于当问题可以通过简单的循环结构解决的情况,如数组遍历、累加等。
- 递归:适用于问题可以分解为多个相似子问题的情况,如树的遍历、图的搜索等。
无限重复的后果:
- 迭代:如果终止条件设置不当,可能导致无限循环。
- 递归:如果基本情况设置不当,可能导致无限递归调用,最终可能导致系统崩溃。
综上所述,选择迭代还是递归取决于具体问题的性质和需求。迭代通常适用于简单的循环任务,而递归适用于可以分解为多个相似子问题的任务。在实际应用中,应根据问题的特点和需求来选择合适的方法
架构设计作用
构件
构件和对象
- (1)独立部署单元;
- (2)作为第三方的组装单元;
- (3)没有(外部的)可见状态。一个构件可以包含多个类元素,但是一个类元素只能属于一个构件。将一个类拆分进行部署通常没什么意义。
- (1)一个实例单元,具有唯一的标志。
- (2)可能具有状态,此状态外部可见。
- (3)封装了自己的状态和行为。
构件接口
面向构件的编程(COP)
- ——多态性(可替代性);
- ——模块封装性(高层次信息的隐藏);
- ——后期的绑定和装载(部署独立性);
- ——安全性(类型和模块安全性)。
2 基于架构的软件开发方法
总结:-- ABSD就叫基于架构的软件开发方法,当然是架构驱动的,架构设计呢在这里又是由业务、质量和功能需求的组合来驱动的。-- 用视角和视图来描述软件的架构,用用例和质量属性场景来描述需求。-- 用例描述功能,质量属性场景描述质量。
- 第一个基础是功能的分解,使用已有的基于模块的内聚和耦合技术;
- 第二个基础是通过选择架构风格来实现质量和业务需求;
- 第三个基础是软件模板的使用,软件模板利用了一些软件系统的结构。
ABSD的实现需要由3个基础/前提:使用内聚和耦合技术进行功能的分解,功能模块化;选择合适的架构风格,要照顾到业务(功能)需求和质量(性能)需求;利用一些现成的软件模板,里面有现成的系统的结构可利用。
开发过程
基于ABSD的开发过程:
- 需求是第一步,获取、整理、分析需求,得把需求确定了;
- 第二步是设计,提出模型,设计各功能模块(构件)及相互联系(连接件)等等;
- 第三步是文档化,前面的设计的功能模块(构件、连接件)毕竟不是真正实现的代码,只是文档上的内容,所以要把这些东西以及架构相关的所有信息文档化;
- 第四步复审:文档化后还要拉一群人来开会,一起讨论这些设计是否合理和存在不足等等。复审不合格的打回去重新设计,修改文档,再复审,直到大家意见一致。
- 第五步实现:复审都通过那就着手实现吧,根据文档来分析设计构件以及他们之间的调用关系,有现成的就用,没现成的就开发,测试。
- 第六步演化:上一步已经实现了并测试完成了,但是后期需要维护的,比如提出新需求,环境变化,业务改变,这就需要演化来满足这些变化。演化是从需求开始重新走一遍。
架构需求:重在掌握标识构件的三步,如下左图。
架构需求过程详细步骤:
1.获取需求:从库里获取还是用户获取都可以,整理合并,分类、形成文档(SRS)。
---------------------------------------------标识构件过程---------------------------------------------------------
2.生成类图:根据整理后的需求文档,用一些CASE工具生成类图,ABSD使用类图来描述系统结构。
3.对类进行分组:生成了类图,根据耦合和内聚程度还需要把类分组,这样简化类图结构,使其更加清晰可读。
4.把类打包成构件:把类簇打包成构件,这些构件可以分组合并。这一过程实现了构件级的重用,构件和构件又可以打包成更大的构件。
---------------------------------------------标识构件过程---------------------------------------------------------
5.需求评审:需求也是要拉一批人开会讨论需求是否合理有效的,不符合打回去重新获取再走一遍。
架构设计:将需求阶段的标识构件映射成构件,进行分析,如下右图。

架构设计过程详细步骤:1.提出架构模型:选择一个合适的架构风格(没有就自己造),该模型为将来的实现和演化建立了目标。2.映射构件:把已标识的构件映射到架构中,将产生一个中间结构,它只包含适合架构模型的构件。3.分析构件相互作用:研究构件之间的交互方式,确保它们能够正确地协同工作,满足系统的功能和性能要求。4.产生架构:当决定了关键构件之间的相互作用后,就可以在中间结构的基础上进行精化,得到软件架构5.设计评审:拉一人开会讨论产生的这个架构是否有不合理的地方,有就打回去重新选择构件映射再走一遍,直到大家意见一致。
架构(体系结构)文档化:
文档的完整性和质量是软件架构成功的关键因素。
关于文档的三大注意事项:
(1)文档要从使用者的角度进行编写。
(2)必须分发给所有与系统有关的开发人员 。
(3)且必须保证开发者手上的文档是最新的。
架构复审:
架构实现:用实体来显示出架构。实现构件,构件组装成系统,如下左图:
架构实现过程:
1.分析与设计:根据文档(架构规格说明、测试架构需求的质量设计说明数)来实现, 在架构说明书中,已经定义了系统中构件与构件之间的关系,构件接口约束对外唯一代表了构件,所以可以从构件库中直接查找符合接口约束的构件。
2.构件实现:必要时开发新的满足要求的构件。
3.构件组装:按照设计文档的要求进行组装,形成系统的基本结构
4.系统测试:包括单个构件的功能性测试和被组装应用的整体功能和性能测试。
架构演化:对架构进行改变,按需求增删构件,使架构可复用,如下右图:

架构演化详细过程:1.需求变化归类:既然是演化那么肯定是需求发生了变化或者提出了新的,那么这些需求首先要分类,比如有些需求修改构件就行,有些需要需要重新开发构件,有些需要删除构件等等。2.演化计划:演化的是一个完整的实现了架构的系统了,甚至在使用当中,这就需要做一个计划来操作演化,不能盲目的进行。3.构件变动:修改,增加或删除构件,要对修改和增加的构件进行功能性测试。4.更新构件间相互作用:构件变化了,受影响的构件及它们间作用也跟着修改,比如调用关系的改变,顺序调整,新增删除等等。5.构件组装与测试:对修改后的构件进行重新组装,并进行测试,以确保系统的功能和性能满足要求。6.技术评审:检查架构演化后的系统是否满足所有需求,以及是否存在潜在的问题或缺陷。 如果哟问题打回去重新修改演化计划,再走一遍。7.得到演化后架构。
3 软件架构风格
3.1 基本架构风格
- 数据流风格:面向数据流,按照一定的顺序从前向后执行程序,代表的风格有 批处理序列、管道-过滤器。
- 调用/返回风格:构件之间存在互相调用的关系,一般是显式的调用,代表的风格有 主程序/子程序、面向对象、层次结构(C/s 架构风格本质属于层次风格)。
- 独立构件风格:构件之间是互相独立的,不存在显式的调用关系,而是通过某个事件触发、异步的方式来执行,代表的风格有 进程通信、事件驱动系统(隐式调用)。
- 虚拟机风格:自定义了一套规则供使用者使用,使用者基于这个规则来开发构件,能够跨平台适配,代表的风格有 解释器、基于规则的系统。
- 仓库风格:以数据位中心,所有的操作都是围绕建立的数据中心进行的,代表的风格有数据库系统、超文本系统、黑板系统。
数据流风格
调用/返回风格
- 层次结构优点:
- 支持基于可增加抽象层的设计,允许将一个复杂问题分解成一个增量步骤序列的实现。
- 不同的层次处于不同的抽象级别,越靠近底层,抽象级别越高;越靠近顶层,抽象级别越低。
- 由于每一层最多只影响两层,同时只要给相邻层提供相同的接口,允许每层用不同的方法实现,同样为软件复用提供了强大的支持。
- 缺点:
- 并不是每个系统都可以很容易的划分为分层的模式。
- 很难找到一个合适的、正确的层次抽象方法。
独立构件风格
虚拟机风格
解释器风格的一般组成:
- 解释引擎:解释工作
- 存储区:存要解析代码
- 数据结构:记录解释引擎当前工作状态
- 数据结构:记录代码被解释执行的进度
基于规则风格的一般组成:
- 规则集:可多个,规则的集合
- 规则解释器:负责解析和执行这些规则,确保系统能够根据预定义的规则进行操作。
- 规则/数据选择器:扮演着关键角色,它决定了哪些数据应该被应用到哪些规则上。
- 工作内存:用来存储当前状态和中间结果的地方。
仓库风格(数据共享风格,以数据为中心)
个人理解:这两大类构件一个是数据库服务端,另一个是类似客户端;连接件就是它们之间的互联的方式、协议等等这些。
黑板系统:
- 知识源:包含若干独立计算的不同单元,以及独立的、与应用程序相关的知识,知识源之间不直接进行通讯,它们之间的交互只通过黑板来完成。--独立计算单元和知识。
- 黑板:全局数据库,包含问题域解空间的全部状态,按照与应用程序相关的层次来组织并解决问题的数据,知识源通过不断地改变黑板数据来解决问题。-- 全局数据库,问题域和解空间全部状态,根据与应用程序相关的层次来解决问题。
- 控制:完全由黑板的状态驱动,黑板状态的改变决定了需要使用的特定知识。--黑板状态驱动
与数据库系统相比,黑板相当于中央共享数据源(服务端,中央数据结构),知识源相当于独立处理单元(客户端,独立构件)
闭环控制架构(过程控制)
C2 架构风格
- (1)系统中的构件和连接件都有一个顶部和一个底部;
- (2)构件的顶部应连接到某连接件的底部,构件的底部则应连接到某连接件的顶部,而构件与构件之 间的直接连接是不允许的;
- (3)一个连接件可以和任意数目的其它构件和连接件连接;
- (4)当两个连接件进行直接连接时,必须由其中一个的底部到另一个的顶部。

必背:


3.2 层次结构风格
两层C/S 架构

三层 C/S 架构
- 各层在逻辑上保持相对独立,整个系统的逻辑结构更为清晰,能提高系统和软件的可维护性和可扩展性;
- 允许灵活有效的选用相应的平台和硬件系统,具有良好的可升级性和开放性;
- 各层可以并行开发,各层也可以选择各自最适合的开发语言;
- 功能层有效的隔离表示层与数据层,为严格的安全管理奠定了坚实的基础,整个系统的管理层次也更加合理和可控制。

三层 B/S 架构
- B/S架构缺乏对动态页面的支持能力,没有集成有效的数据库处理功能;
- 安全性难以控制;
- 在数据查询等响应速度上,要远远低于C/S 架构;
- 数据提交一般以页面为单位,数据的动态交互性不强,不利于 OLTP应用。
混合架构风格
富互联网应用 RIA
- RIA结合了C/S 架构反应速度快、交互性强的优点与 B/S 架构传播范围广及容易传播的特性;
- RIA 简化并改进了B/S架构的用户交互;
- 数据能够被缓存在客户端,从而可以实现一个比基于 HTML的响应速度更快且数据往返于服务器的次数更少的用户界面。
MVC

MVP

MVVM

3.3 面向服务的架构 SOA
概念

- 可从企业外部访问、随时可用(服务请求能被及时响应)、
- 粗粒度接口(粗粒度提供一项特定的业务功能,而细粒度服务代表了技术构件方法)、
- 服务分级、
- 松散耦合(服务提供者和服务使用者分离)、
- 可重用的服务及服务接口设计管理、
- 标准化的接口(WSDL、SOAP、XML是核心)、
- 支持各种消息模式、
- 精确定义的服务接口。
总结:
外部访问、可用及时、粗粒度、服务分级、松耦合(提/使)、可重用、标准化、消息模式多,接口精确定义
XML是一种描述语言,WSDL是基于XML的描述服务的,SOAP是简单对象访问协议,用于交换数据的
- 服务构件粗粒度,传统构件细粒度居多;
- 服务构件的接口时标准的,主要是WSDL接口,而传统构件常以具体 API形式出现;
- 服务构件的实现与语言是无关的,而传统构件常绑定某种特定的语言;
- 服务构件可以通过构件容器提供QoS的服务,而传统构件完全由程序代码直接控制。
总结:
服务构件粗粒度,传统细粒度;服务构件接口标准,传统API;服务构件实现语言无关,传统正相反;服务构件有容器QoS,传统代码保证。
关键技术

发现服务
描述服务
消息格式层
编码格式层
SOA的实现方式
WEB Service

- 底层传输层:负责底层消息的传输,采用HTTP、JMS、SMTP协议
- 服务通信协议层:描述并定义服务间通信的技术标准,采用 SOAP和 REST协议
- 服务描述层:采用WSDL协议
- 服务层:对企业应用系统进行包装,通过WSDL定义的标准进行调用
- 业务流程层:支持服务发现服务调用和点到点的服务调用,采用WSDPEL标准
- 服务注册层:采用UDDI协议
补充:
JMS是Java消息服务,Java中面向消息中间件API
底层是传输层,消息传输模块;通信层用一些SOAP和REST协议来封装一下底层消息;描述层采用WSDL协议描述服务;服务层是包装各系统,并采用WSDL标准调用;业务流程层,来提供发现、调用的方式、标准;注册层,用UDDI协议,用于注册。
服务注册表
- 服务注册:应用开发者(服务提供者)在注册表中公布服务的功能。
- 服务位置:服务使用者(服务应用开发者),帮助他们查询注册服务,寻找符合自身要求的服务。
- 服务绑定:服务使用者利用检索到的服务接口来编写代码,所编写的代码将与注册的服务绑定,调用注册的服务,以及与它们实现互动。
企业服务总线 ESB
- 提供位置透明性的消息路由和寻址服务;
- 提供服务注册和命名的管理功能;
- 支持多种的消息传递范型;
- 支持多种可以广泛使用的传输协议;
- 支持多种数据格式及其相互转换;
- 提供日志和监控功能。
4 软件架构复用
5 特定领域软件架构 DSSA
DSSA的三个基本活动
参与 DSSA的四种角色人员
建立 DSSA的过程
定范围-->定元素-->识别约束-->产生架构-->产生构件。 这些过程并发、递归、反复、螺旋的
DSSA的三层次系统模型

6 系统质量属性与架构评估
6.1 软件系统质量属性
可以将软件系统的质量属性分为开发期质量属性和运行期质量属性2个部分。
- (1)易理解性:指设计被开发人员理解的难易程度。
- (2)可扩展性:软件因适应新需求或需求变化而增加新功能的能力,也称为灵活性。
- (3)可重用性:指重用软件系统或某一部分的难易程度。
- (4)可测试性:对软件测试以证明其满足需求规范的难易程度。
- (5)可维护性:当需要修改缺陷、增加功能、提高质量属性时,识别修改点并实施修改的难易程度。
- (6)可移植性:将软件系统从一个运行环境转移到另一个不同的运行环境的难易程度。
理解、扩展、重用、测试、维护、移植的难易程度。
- (1)性能:性能是指软件系统及时提供相应服务的能力,如速度、吞吐量和容量等的要求。
- (2)安全性:指软件系统同时兼顾向合法用户提供服务,以及阻止非授权使用的能力。
- (3)可伸缩性:指当用户数和数据量增加时,软件系统维持高服务质量的能力。例如,通过增加服务器来提高能力。
- (4)互操作性:指本软件系统与其他系统交换数据和相互调用服务的难易程度。
- (5)可靠性:软件系统在一定的时间内持续无故障运行的能力。
- (6)可用性:指系统在一定时间内正常工作的时间所占的比例。可用性会受到系统错误,恶意攻击,高负载等问题的影响。
- (7)鲁棒性:是指软件系统在非正常情况(如用户进行了非法操作、相关的软硬件系统发生了故障等)下仍能够正常运行的能力,也称健壮性或容错性。
性能、安全、伸缩、互操作、可靠、可用、鲁棒
伸缩:能屈能伸,用户量访问量上来能及时调整资源保持系统运行快速,质量不打折扣。
互操作:跟其他系统或人、设备打交道的难易程度
可靠:尽量长时间运行不发生故障
可用:不发生故障运行所占比例(要尽量高) -- 可用可靠都出现首选可用
鲁棒:健壮,容错,比如发生非法操作,意外故障能容错,甚至恢复(比如云服务就有容错机制),这样更健壮。
面向架构评估的质量属性
前面的开发期属性和运行期属性综合一下,针对架构进行评估的质量属性提炼就是这些: 性能、可靠、可用、安全、可修改、功能、可变、互操作。重点记忆钱5个及设计策略。
针对每个质量属性构造质量属性场景,来衡量这个属性对架构的影响程度,就是以下质量属性场景的应用。
质量属性场景是一种面向特定质量属性的需求。它由6 部分组成:

6.2 系统架构评估
三种常用的评估方式

架构评估中的重要概念
- 刺激(事件)
- 环境(事件发生的环境)
- 响应(架构响应刺激的过程)。
6.3 基于场景的评估方法
基于场景的架构分析方法SAAM

架构权衡分析法 ATAM
ATAM方法架构评估实践

成本效益分析法 CBAM
- (1)整理场景(确定场景,并确定优先级,选择三分之一优先级最高的场景进行分析);
- (2)对场景进行细化(对每个场景详细分析,确定最好、最坏的情况);
- (3)确定场景的优先级(项目干系人对场景投票,根据投票结果确定优先级);
- (4)分配效用(对场景响应级别确定效用表,建立策略、场景、响应级别的表格);
- (5)形成“策略-场景-响应级别的对应关系”;
- (6)确定期望的质量属性响应级别的效用(根据效用表确定所对应的具体场景的效用表);
- (7)计算各架构策略的总收益;
- (8)根据受成本限制影响的投资报酬率选择架构策略(估算成本,用上一步的收益减去成本,得出收益,并选择收益最高的架构策略)。
其他评估方法(仅了解)
- (1)对待评估的质量属性进行规约建模。
- (2)为外部和内部的质量属性创建度量准则,先从评估目的(如软件架构比较、最终产品的质量预测),评估角度(如开发者、用户、维护者),评估环境(架构作为最终产品或设计中间产品)出发来定义架构评估的目标,再根据目标相关的属性来提出问题,然后回答每个问题并提出相应的度量准则。
- (3)评估质量属性,包括数据收集、度量和结果分析3个活动。
7 中间件技术

中间件特点
- 负责客户机与服务器之间的连接和通信,以及客户机与应用层之间的高效率通信机制。
- 提供应用层不同服务之间的互操作机制,以及应用层与数据库之间的连接和控制机制。
- 提供多层架构的应用开发和运行的平台,以及应用开发框架,支持模块化的应用开发。
- 屏蔽硬件、操作系统、网络和数据库的差异。
- 提供应用的负载均衡和高可用性、安全机制与管理功能,以及交易管理机制,保证交易的一致性。
- 提供一组通用的服务去执行不同的功能,避免重复的工作和使应用之间可以协作。
按照中间件在分布式系统中承担的职责不同,可以划分以下几类中间件产品。
软件构件
商用构件标准规范-CORBA(公共对象请求代理体系结构)
7.1 典型的应用架构-J2EE
分布式多层应用程序

JAVA企业应用框架

重量级与轻量级之争
7.2 典型的应用架构-.NET

.NET和J2EE 之争
相关文章:

十三 系统架构设计(考点篇)
1 软件架构的概念 一个程序和计算系统软件体系结构是指系统的一个或者多个结构。结构中包括软件的构件,构件 的外部可见属性以及它们之间的相互关系。 体系结构并非可运行软件。确切地说,它是一种表达,使软件工程师能够: (1)分…...

Java-数据结构-二叉树-习题(三)  ̄へ ̄
文本目录: ❄️一、习题一(前序遍历非递归): ▶ 思路: ▶ 代码: ❄️二、习题二(中序遍历非递归): ▶ 思路: ▶ 代码: ❄️三、习题三(后序遍历非递归): ▶ 思路: …...

SpringBoot+Aop+注解方式 实现多数据源动态切换
整体思路: 引入基本依赖SpringBootAopMySqlMyBatislombok在配置文件中配置多个数据源创建数据源配置类用于读取配置编写用于标识切换数据源的注解创建数据源切换工具类DataSourceContextHolder编写切面类用于在注解生效处切换数据源编写配置类,加载数据…...

企业如何高效应对多类型知识产权事务的复杂挑战?
随着企业的发展和创新活动的不断推进,越来越多的企业拥有了大量的专利、商标和软著等知识产权,这些不仅关乎企业的技术创新成果,更直接影响到企业的品牌价值和市场竞争力。然而,当企业拥有多件知识产权时,复杂的申请、…...

openeuler22.03 LTS 源码编译安装nginx1.22.1
openeuler22.03 LTS 源码编译安装nginx1.22.1 下载安装包 #官网下载nginx1.22.1 wget http://nginx.org/download/nginx-1.22.1.tar.gz安装依赖包 #安装依赖包,NGINX是C语言写的,pcre-devel支持正则表达式,openssl 开启加密 [rootproxy ~]…...

图片压缩工具免费怎么找?归纳了这几个压缩工具
有哪些图片压缩工具免费?在数字化时代,图像已成为我们生活中不可或缺的一部分。无论是网站设计、社交媒体分享还是文件传输,高质量的图片都扮演着重要的角色。但高质量往往意味着大文件体积,这可能会导致加载速度变慢或存储空间不…...

【Kubernetes知识点】解读HPA的 thrashing(抖动)问题
【Kubernetes知识点】解读HPA的 thrashing(抖动)问题 目录 1 概念 1.1 什么是 Thrashing 现象?1.2 HPA 中 Thrashing 产生的原因1.3 解决 Thrashing 的优化措施 1.3.1 设置合适的阈值1.3.2 使用自定义指标和基于负载的自动扩缩1.3.3 增加扩…...

Unity 设计模式 之 结构型模式 -【装饰者模式】【外观模式】【享元模式】【代理模式】
Unity 设计模式 之 结构型模式 -【装饰者模式】【外观模式】【享元模式】【代理模式】 目录 Unity 设计模式 之 结构型模式 -【装饰者模式】【外观模式】【享元模式】【代理模式】 一、简单介绍 二、装饰者模式(Decorator Pattern) 1、什么时候使用装…...

Linux上Qt安装相关的内容及在QtCreator使用QChart模块需要的配置
引言 下面是Ubuntu上Qt安装相关的内容及在QtCreator使用QChart模块需要的配置。 关于Qt安装及环境 Qt的模块 查看已经安装的模块 sudo apt search qt5-安装新的模块 sudo apt install qt5-svg # 安装Qt SVG模块3.查看qt已经安装了哪些模块 dpkg -l | grep libqt安装qt,…...

lettuce引起的Redis command timeout异常
项目使用Lettuce,在自己的环境下跑是没有问题的。在给客户做售前压测时,因为客户端环境比较恶劣,service服务和中间件服务不在同一机房。服务启动后不一会就会出现Redis command timeout异常。 经过差不多两周的追查,最后没办法把…...

【Hadoop】一、Hadoop入门:基础配置、集群配置、常用脚本
基础设置 网络设置 创建好一个 centos 虚拟机,修改网络配置文件: /etc/sysconfig/network-scripts/ifcfg-ens33修改 BOOTPROTO 为 static 以及添加 IPADDR、GATEWAY、DNS1 TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY&quo…...

Ollama:本地运行大模型【含UI界面】
文章目录 Ollama 简介安装 ollamaWindows 安装Docker 安装其它平台安装支持的模型模型清单模型参数与运行内存快速启动 llama 模型llama 模型介绍运行 llama3.1 模型通过 HTTP API 访问ollama 命令语法常用示例特别示例自定义模型创建 Modelfile创建模型并运行集成 Web 页面Ope…...

【论文阅读】Grounding Language with Visual Affordances over Unstructured Data
Abstract 最近的研究表明,大型语言模型(llms)可以应用于将自然语言应用于各种各样的机器人技能。然而,在实践中,学习多任务、语言条件机器人技能通常需要大规模的数据收集和频繁的人为干预来重置环境或帮助纠正当前的…...

目标检测:滑块验证
最近在做一些爬虫相关的任务,有时候在登录时候需要去做滑块验证,刚好自己是做AI这一块得,就想着使用目标检测去做检测,然后绕过滑块。...

Unreal Engine 5 C++: 编辑器工具编写入门01(中文解释)
目录 准备工作 1.创建插件 2.修改插件设置 快速资产操作(quick asset action) 自定义编辑器功能 0.创建编辑器button,测试debug message功能 大致流程 详细步骤 1.ctrlF5 launch editor 2.创建新的cpp class,derived from AssetAction…...

力扣上刷题之C语言实现-Day2
一. 简介 本文记录一下,力扣C语言逻辑题。主要涉及 数组方面的知识。 二. 涉及数组的 C语言逻辑题 1. 两数之和 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target…...

Visual Studio 2022 - QT 环境中文字符乱码问题
Visual Studio 2022 - QT 环境中文字符乱码问题 一、Visual Studio 2022 - Qt 环境 在 QT 中使用中文字符串常会出现乱码现象,如下:以下提供了几个解决方法,仅供参考 QString str "百香果真是一直可爱的小猫咪"; qDebug() <…...

获得ASPICE认证需要满足哪些条件?
要获得ASPICE认证,需要满足以下条件: ( 要明确的是:在ASPICE行业中专业来说,ASPICE项目是没有认证,而只有评估。不过,为了方便沟通,人们常将这一评估过程称为认证。) 一、基础条件…...

鸿蒙_异步详解
参考详细链接: 鸿蒙HarmonyOS异步并发开发指南...

linux日志查询搜索view
view 命令实际上是 vim 编辑器的一个只读模式。当你使用 view 打开一个文件时,实际上是在用 vim 查看该文件,只是不能编辑内容。因此,view 下的搜索操作与 vim 类似。 以下是如何在 view 模式下进行搜索: 启动 view 并打开文件&a…...

性能测试工具——JMeter
目录 一、JMeter介绍 1、下载安装JMeter 2、打开JMeter 方式一: 方式二: 3、JMeter基础设置 4、JMeter基本使用流程 (1)启动JMeter (2)在测试计划下添加线程组 (3)在 “线…...

1.《DevOps》系列K8S部署CICD流水线之部署K8S集群~version1.28.2
架构 服务器IP服务名称硬件配置192.168.1.100k8s-master8核、16G、120G192.168.1.101k8s-node18核、16G、120G192.168.1.102k8s-node28核、16G、120G192.168.1.103nfs2核、4G、500G 操作系统:Rocky9.3 后续通过K8S部署GitLab、Harbor、Jenkins 一、环境准备 关…...

c/c++八股文
c基础 一、指针和引用的区别 定义方式: 指针是通过 * 操作符定义的变量,用于存储另一个变量的地址。例如: int* p &x;引用是通过 & 操作符定义的别名,直接引用另一个变量。例如: int& r x; 内存占用: 指针是一个独立的变量,占用一定的内存空间。引用不是独立的…...

Docker配置代理解决pull超时问题
操作系统: CentOS Linux 8 Docker版本: 26.1.3 前置:你需拥有🐱 1. 配置 proxy.conf 1.1 创建配置文件目录 创建 docker.service.d,进入到 docker.service.d 中打开 proxy.conf (没有文件打开会自动创建)。 注意:每个人的路径可…...

ECharts的特点
ECharts是一款基于JavaScript的数据可视化图表库,由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目。ECharts提供了直观、生动、可交互、可个性化定制的数据可视化图表,广泛应用于数据分析和展示领域。以下是关于…...

JVM OutOfMemoryError 与 StackOverflowError 异常
目录 前言 堆溢出 虚拟机栈和本地方法栈溢出 方法区溢出 前言 JVM规范中规定, 除了程序计数器之外, 其他的运行时数据区域, 例如堆栈, 方法区, 都会出现OutOfMemoryError异常. 那么到底是怎么样的代码, 才会引起堆溢出, 栈溢出, 或者是方法区的溢出呢? 如果遇到了又该如何…...

linux防火墙学习
Linux 防火墙配置(iptables和firewalld) Linux 防火墙配置(iptables和firewalld)_iptables配置文件位置-CSDN博客 Linux查看防火墙状态及开启关闭命令_linux 查看防火墙-CSDN博客...

Java面试篇基础部分- Java中的阻塞队列
首先队列是一种前进后出的操作结构,也就是说它只允许从队列前端进入,从队列后端退出。这个前端和后端看个人如何理解,也就是通常所说的入队和出队,队头和队尾。 阻塞队列和一般队列的不同就在于阻塞队列是可以阻塞的,这里所说的并不是说队列中间或者队头队尾被拦截了,而是…...

Go语言并发编程之Channels详解
并发编程是Go语言的一大特色,而channel(通道)则是Go语言中用于实现并发的核心工具之一。它源于CSP(Communicating Sequential Processes)的概念,旨在让多个goroutine之间能够高效地进行通信和同步。本文将深入探讨channel的用法、原理和最佳实践,通过丰富的示例代码和详…...

【Java集合】LinkedList
概要 LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问速度比较慢。另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。 链表 链表是…...