浅谈系统架构设计-从架构设计原理、架构设计原则、架构设计方法展开

news2024/10/7 18:28:48

 

我们工作中一直强调要做架构设计、系分,最近前端同学在追求前端质量提升的时候,也在进行架构设计、前端系分的推广,那到底什么是架构设计和系分?该怎么做架构设计和系分?本文尝试对架构设计进行全面的介绍和分享,希望统一相关认识和术语,推动我们自己架构设计和系分工作的专业发展。

架构发展历程


第一次软件危机与结构化程序设计(20 世纪 60 年代~20 世纪 70 年代)


《人月神话》作者布鲁克斯率领的IBM System/360操作系统开发,2000多个程序员共计5000人/年的工作量,将近100万行源码,总共投入5亿美元,是美国的“曼哈顿”原子弹计划投入的1/4,项目进度却一再延迟,软件质量也得不到保障。为了解决问题,1968、1969年,提出了“软件工程”和“结构化程序设计”两种解决方案。“结构化程序设计”就是面向过程的设计思想。


第二次软件危机与面向对象(20 世纪 80 年代)


第二次软件危机主要体现在软件的“扩展”变得非常复杂,促进了面向对象设计思想的发展。面向对象真正开始流行是在 20 世纪 80 年代,主要得益于 C++ 的功劳,后来的 Java、C# 把面向对象推向了新的高峰。到现在为止,面向对象已经成为了主流的开发思想。


软件架构的真正流行(20 世纪 90 年代开始)


软件架构的出现有其历史必然性。20 世纪 60 年代第一次软件危机引出了“结构化编程”,创造了“模块”概念;20 世纪 80 年代第二次软件危机引出了“面向对象编程”,创造了“对象”概念;到了 20 世纪 90 年代“软件架构”开始流行,创造了“组件”概念。我们可以看到,“模块”“对象”“组件”本质上都是对达到一定规模的软件进行拆分,差别只是在于随着软件的复杂度不断增加,拆分的粒度越来越粗,拆分的层次越来越高。

相关概念定义


软件开发过程包括了分析、设计、实现、测试、验证、部署、运维等多个环节。一个成功的软件设计是要适应并满足业务需求,同时不断“演化”的。设计需要根据业务的变化、技术的发展不断进行“演进”,这就决定了这是一个动态活动,出现新问题,解决新问题,没有所谓的“一招鲜”。
系统:

泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能独立完成的工作能力的群体。
子系统:也是由一群关联的个体组成的系统,多半是在更大的系统中的一部分。
模块:

就是从逻辑上将系统分解, 即分而治之, 将复杂问题简单化。模块的粒度可大可小, 可以是系统,几个子系统、某个服务,函数, 类,方法、 功能块等等。
组件:

可以包括应用服务、数据库、网络、物理机、还可以包括MQ、容器、Nginx等技术组件。
框架:

是组件实现的规范,例如:MVC、MVP、MVVM等,是提供基础功能的产品,例如开源框架:Ruby on Rails、Spring、Laravel、Django等,这是可以拿来直接使用或者在此基础上二次开发。
架构:

是经过系统性地思考, 权衡利弊之后在现有资源约束下的最合理决策, 最终明确的系统骨架: 包括子系统, 模块, 组件. 以及他们之间协作关系, 约束规范, 指导原则.并由它来指导团队中的每个人思想层面上的一致。
系统架构:
国际标准化组织(ISO)系统和软件工程标准认为,系统的架构是一系列基本概念或者系统在其环境中表现出来的属性,体现在它的元素、关系及设计和发展的原则中。根据ISO给出的这一架构定义,系统架构包括系统元素、基本系统属性、设计和发展原则3个主要方面。
架构设计:
是以干系人提出的业务需求为源头、以技术管理和过程改进体系为工作流程、以质量为重心的一项系统工程。架构设计往往首先关注系统的主要构成部分及它们相互之间的关系,然后进一步挖掘每个构成部分的细节,以便确定模块、组件、接口等元素,并确保这些元素满足既定的架构设计原则。比如常用的MVC框架。

系分(前端系分、后端系分、测试系分):

系分的全称是“系统设计、业务分析”,阿里的“系分”文化,要求每一个程序员都要会写系分,后端要写后端系分,前端要写前端系分,测试要写测试系分,如果没有做系分,是不允许直接进入研发工作的,我们公司也是如此。

系统架构师:
架构师是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清单。在软件开发的整个过程中起着很重要的作用。

在系统工程中,业务需求需要进行分析和抽象、过程需要进行管理和改进、设计质量需要进行保障,完成包含这些活动在内的整个系统架构设计工作的角色就是架构师。因此架构师具备能力:理解业务,全局把控,选择合适技术,解决关键问题、指导研发落地实施。

系统分析师:

分析师主要职责是对软件进行整体规划、需求分析、设计软件的核心架构、指导和领导项目开发小组进行软件开发和软件实现,并对整个项目进行全面的管理工作。

架构师和分析师的区别:

系统分析师和系统架构设计师都是软考高级科目,分析师偏向需求分析;架构师主做系统架构设计,偏技术,含金量和考试难度都很高,实际工作中边界不好区分,应用的方法和工具大都可以复用。

注:软考中、高级科目是我国为数不多的国家承认的软件行业资格认证,以考代评,各凭本事,推荐各位技术同学积极尝试,做一个“有证”的工程师。

我们公司的系统规模和需求颗粒度较小,日常系分和架构区别不大,本文统一以系统架构设计的角度进行分享和介绍。

架构设计原则


SOLID 原则


单一职责:与 Unix 哲学所倡导的“Do one thing and do it well”不谋而合;
开闭原则:用新增(扩展)来取代修改(破坏现有封装),这与函数式的 immutable 思想也有异曲同工之妙;
里式替换:父类能够出现的地方子类一定能够出现,这样它们之间才算是具备继承的“Is-A”关系;
接口隔离:不要让一个类依赖另一个类中用不到的接口,简单说就是最小化组件之间的接口依赖和耦合;
依赖反转:依赖抽象类与接口,而不是具体实现;让低层次模块依赖高层次模块的稳定抽象,实现解耦。

其他通用原则


正交性:架构同一层次拆分出的各组件之间,应该尽量保持正交,即彼此职责独立,边界清晰,没有重叠;
高内聚:同一组件内部应该是高度内聚的(cohesive),像是一个不可分割的整体(否则就应该拆开);
低耦合:不同组件之间应该尽量减少耦合(coupling),既降低相互的变化影响,也能增强组件可复用性;
隔离变化:许多架构原则与模式的本质都是在隔离变化 —— 将预期可能变化的部分都隔离到一块,减少发生变化时受影响(需要修改代码、重新测试或产生故障隐患)的其他稳定部分。

架构设计思想

面向过程设计(POD:Procedure Oriented Design)


面向过程其实是一种与人的思维方式很一致的设计方法,将一个事情的处理步骤按照顺序的去执行。在这过程中一般都会使用Top-Down的方法,自顶向下逐步求精的逐步分解一个任务。并且在这个过程中考虑分层,模块化等具体的组织方式,从而分解软件的复杂度。当软件的复杂度不是很大或者要实现的功能的模型与面向过程的设计很契合的情景中,面向过程是一种简单直观的设计方法,也能得到很好的效果。

面向对象设计(OOD:Object Oriented Design)


面向对象的程序设计通过将现实世界中的事物概念映射到程序设计中的“对象”概念上,现实世界中事物的属性和行为映射到“对象”的属性和方法。程序通过各种对象之间的调用以及协作,从而实现计算机软件的功能。跟很多工程方法一样,面向设计的初衷就是一种处理软件复杂度的设计方法。

领域驱动设计(DDD:Domain-Driven Design)


是面向对象设计的一种方法,是一种与敏捷开发相适应的对系统进行逐步迭代的面向对象的分析和建模方法。

面向切面编程(AOP:Aspect Oriented Programming)


可以通过预编译方式和运行其动态代理实现在不修改源代码的情况下给程序动态统一添加某种特定功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。
AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。
而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。

架构设计分类


可细分为业务架构、应用架构、技术架构, 代码架构, 部署架构。业务架构是战略,应用架构是战术,技术架构是装备。


业务架构(俯视架构)


包括业务规划,业务模块、业务流程,对整个系统的业务进行拆分,对领域模型进行设计,把现实的业务转化成抽象对象。


应用架构(剖面架构,也叫逻辑架构图)


硬件到应用的抽象,包括抽象层和编程接口。应用架构和业务架构是相辅相成的关系。业务架构的每一部分都有应用架构。


数据架构


数据架构指导数据库的设计. 不仅仅要考虑开发中涉及到的数据库,实体模型,也要考虑物理架构中数据存储的设计。


代码架构(也叫开发架构)


子系统代码架构主要为开发人员提供切实可行的指导,如果代码架构设计不足,就会造成影响全局的架构设计。比如公司内不同的开发团队使用不同的技术栈或者组件,结果公司整体架构设计就会失控。


技术架构


技术架构,确定组成应用系统的实际运行组件(lvs,nginx,tomcat,php-fpm等),这些运行组件之间的关系,以及部署到硬件的策略。


部署拓扑架构图(实际物理架构图)


拓扑架构,包括架构部署了几个节点,节点之间的关系,服务器的高可用,网路接口和协议等,决定了应用如何运行,运行的性能,可维护性,可扩展性,是所有架构的基础。这个图主要是运维工程师主要关注的对象。

四种架构框架


单体架构(MVC)


初级架构,典型的三级架构,前端(Web/手机端)+中间业务逻辑层+数据库层。这是一种典型的Java Spring mvc或者Python Drango框架的应用。


分布式架构(SOA)


中级架构,分布式应用,中间层分布式+数据库分布式,是单体架构的并发扩展,将一个大的系统划分为多个业务模块,业务模块分别部署在不同的服务器上,各个业务模块之间通过接口进行数据交互。数据库也大量采用分布式数据库,如redis、ES、solor等。通过LVS/Nginx代理应用,将用户请求均衡的负载到不同的服务器上。
SOA即面向服务的架构,这种架构在九几年的时候就被提出了。SOA往往与企业服务总线联系在一起,通过业务将项目划分为不同的服务,部署在不同的服务器上,即我们以前常说的分布式即指SOA架构的应用。服务之间可以通过WebService等中间件进行通讯,像现在比较流行的Dubbo应用也属于SOA架构的应用。


微服务架构(容器化)


主要是中间层分解,将系统拆分成很多小应用(微服务),微服务可以部署在不同的服务器上,也可以部署在相同的服务器不同的容器上。当应用的故障不会影响到其他应用,单应用的负载也不会影响到其他应用,其代表框架有Spring cloud、Dubbo等。


Serverless架构(云原生)


当我们还在容器的浪潮中前行时,已经有一些革命先驱悄然布局另外一个云计算战场:Serverless架构。
Serverless架构能够让开发者在构建应用的过程中无需关注计算资源的获取和运维,由平台来按需分配计算资源并保证应用执行的SLA(服务等级协议),按照调用次数、调用时长等方式进行计费,有效的节省应用成本。

四种架构方法


方法一:UML


架构师使用模型来表述系统,从需求的层次上,建模的主要对象是系统需求。而模型是一个抽象概念,需要借助于特定工具进行表述,目前使用最广泛的建模工具是UML。
三个主要的模型:
功能模型:从用户的角度展示系统的功能,包括用例图。
对象模型:采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类别图、对象图。
动态模型:展现系统的内部行为。包括序列图,活动图,状态图。
UML依然应该是每个程序员的制图工具箱中最常用和必备的工具之一。


方法二:4+1 View Model


系统架构的五种视图
逻辑视图(Logical view):描述系统为终端用户提供的功能,一般会通过UML中的类图和状态图来表示;关注系统功能,包括:逻辑层次划分、子系统、子模块划分、功能接口、业务逻辑关系;
过程视图(Process view):描述系统的动态行为,包括流程和交互等,一般会通过 UML 中的时序图、活动图和通讯图来表示;关注系统的并发和同步问题,包括:进程、线程、对象实例、并发、同步、通信、可伸缩、高可用、安全性;
开发视图(Development view):从程序员的视角来阐述系统,也被称为“实现视图”,一般会通过 UML 中的组件图和包图来表示;关注程序实现,包括:源程序、第三方SDK、程序框架、类库、程序的可扩展、可重用、可移植、操作系统、中间件选型;
物理视图(Physical view):从系统工程师的角度来描述系统,包括系统组件的物理拓扑、各组件之间的物理连接,也被称为“部署视图”,一般会通过 UML 中的部署图来表示;关注系统的安装和部署问题,包括:物理设备和网络的部署、软件安装、部署、系统软件选型、物理节点拓扑;
场景(Scenarios):通过一小组用例或场景来描述架构,包括系统中各种对象和进程之间的交互时序,也被称为“用例视图”。这些场景会被用于识别架构元素(architectural elements)以及阐述和验证整个架构设计,也可以被作为架构原型的测试起点。
补充:数据视图:关注持久化数据的存储,包括:实体及实体关系、数据存储方式、格式、数据传递、复制、同步策略;


方法三:C4 Model


Context、Container、Component 和 Code(可选)
C4 模型通过容器、组件、代码以及人这几个抽象来描述一个软件系统的静态结构,它的核心理念是希望像 Google Map 一样,通过不同层次的细节,为代码建立一种可以放大和缩小的导览图。它最关键的思想就是自顶向下对系统的静态结构进行逐级拆分,依次描述各层次对象的职责、关系和外部依赖。除了核心的层次化静态结构视图,它还可以包含动态视图、部署视图等补充视图
L1:系统顶层大图(System Context diagram, big picture)视角。包括最中心的软件系统、周边的用户以及其他有交互的系统。其中最关键的两个概念分别是:人和软件系统。
L2:容器图(Container diagram)视角。容器图不仅展示了系统的进一步职责拆分,还包括了主要的技术选型、容器之间的通讯方式等关键架构信息。这类图可以面向全部的技术人员,既包括架构师、开发者,也包括运维人员、技术支持等。
L3:组件图(Component diagram)视角。包括各个组件的职责定义、技术与实现细节等。随着层次的下沉和细节的增多,组件图的受众范围进一步缩窄,一般只适用于软件架构师和开发者(其他角色没必要理解,一般也理解不了)。
L4:代码(Code)视角。以图的形式(e.g. UML 类图、数据库 E/R 图)展示类或文件粒度的代码结构,并不是真正的代码本身。


方法四:arc42


arc42 并不是一种架构制图方法,而是一个架构文档模板。
本质上 arc42 中提倡的制图方法与C4模型是等价和兼容的,完全可以配合使用:以 arc42 作为架构文档框架,其中的架构制图采用更具体的 C4 模型。

各阶段架构要点

架构视图

关注点

工具&输出

业务架构

包括业务规划,业务模块、业务流程,对整个系统的业务进行拆分,对领域模型进行设计,把现实的业务转化成抽象对象

PRD、用例图、业务流程图

应用架构

应用架构定义系统有哪些应用、以及应用之间如何分工和合作。这里所谓应用就是各个逻辑模块或者子系统。

应用架构图关键有2点:

① 职责划分:明确应用(各个逻辑模块或者子系统)边界

逻辑分层;子系统、模块定义;关键类。

②职责之间的协作:

接口协议:应用对外输出的接口。

协作关系:应用之间的调用关系。

逻辑架构图、时序图、接口文档

数据架构

1数据是集中还是分布存储的?如何考虑分布式存储

2领域模型到数据库表的转换?表结构关系的设计

3实体如何设计?充血模型和贫血模型

4使用什么数据库 关系型还是非关系形

数据架构图、ER图、uml类图

技术架构

确定组成应用系统的实际运行组件(lvs,nginx,tomcat,php-fpm等),这些运行组件之间的关系,以及部署到硬件的策略。技术架构主要考虑系统的非功能性特征,对系统的高可用、高性能、扩展、安全、伸缩性、简洁等做系统级的把握

部署架构图(抽象)

代码架构

1分层结构设计

2开发语言、开发框架、开发工具

3模块划分

4开发规范

5软件质量属性

开发脚手架、开发规范、测试规范、接口文档

部署架构

拓扑架构,包括架构部署了几个节点,节点之间的关系,服务器的高可用,网路接口和协议等,决定了应用如何运行,运行的性能,可维护性,可扩展性,是所有架构的基础

物理架构图(实际)

质量评估标准

功能适合性

与产品实际需求一致

需求评审,系分评审,测分评审

性能效率

有无压测

是否进行压力测试 记录性能指标

兼容性

前端系统兼容,系统升级接口兼容

多平台(机型)兼容性测试,新老版本接口兼容性测试

可用性

与产品实际需求一致

需求评审

可靠性

是否有监控告警,是否是单点

架构设计,系分评审

安全性

安全扫描 编码规范

云服务使用waf/IDC

可维护性

方便修改/扩展

架构设计,系分评审

问题和规划

问题:

公司项目上线初期该具备的文档/图都具备,只是在后续需求的迭代过程中,存在更新不及时的情况,如架构图时更新不及时,导致后续的维护/查阅产生相应的不便。

目前各业务线目前需求较多,暂时没有时间去补充相应的材料,且随着业务的变化,有些系统在迭代过程中已经或是将要发生调整,可以在确认后再进行梳理。

规划:

1、各业务线相关资料(全局库)更新及时,业务线人员对系统状态理解一致,方便用于了解相关业务最新情况。

2、推动开发内部最佳实践的积累,规避常见工具使用不当引发的问题,减少因技术栈/工具不统一,中间件使用不规范带来的后续维护成本的增加。

3、关注公共组件和中台能力的开发及应用,在日常需求开发中,对复用程度高的代码和模块进行组件化封装和中台化建设,比如前端活动组件、埋点组件;后端日志组件、消息组件;中台消息中心、扶摇活动引擎、星火投放等 。

其他相关内容

软件设计模式


设计模式简介 | 菜鸟教程
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。
根据设计模式的参考书 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 中所提到的,总共有 23 种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)

软件质量模型


功能适合性:功能完整度、功能正确性和功能恰当性;
性能效率:时间表现(e.g. 响应时间)、资源利用和容量;
兼容性:共存能力(e.g. 多版本组件共存)和互操作性;
可用性:可学习性、可运维性、用户错误保护(e.g. 自动纠错)、UI 美观度、可访问性;
可靠性:成熟度、可用性、容错性、可恢复性;
安全性:机密性、完整性、不可伪造性、权威性和可审计;
可维护性:模块度、可复用性、可分析性、可修改性、可测试性;
可移植性:可适配性、可安装性、可替代性。

架构设计面临的挑战


应用程序负载变化大。
用户接口类型更加复杂。
需要支持移动应用(前端架构)。
应用程序的拓扑结构更复杂。

参考资料

《大型网站技术架构:核心原理与案例分析》

《亿级流量网站架构核心技术》

《架构即未来》

《分布式服务架构:原理、设计与实战》

知乎文章:真正的架构设计应该是什么样子? - 知乎

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

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

相关文章

【机器学习】SVM入门-硬间隔模型

本站原创文章,转载请说明来自《老饼讲解-机器学习》ml.bbbdata.com 目录 一. SVM的目标和思想 1.1 SVM硬间隔模型的原始目的 1.2 SVM的直接目标 1.3 什么是支持向量 二. SVM的支持平面的表示方式 2.1 支持面表示方式的初步思路 2.2 初步思路的缺陷与改进 2…

基于Vue+ElementUI+MySQL+Express的学生管理系统(2)

2.搭建Express Web服务器 1.在E:\vue\shiyan9路径下创建score-server的文件夹放置Express Web服务器的相关文件。 图3 初始化package.json的信息 2.用Vscode打开score-server。并创建如图4所示的项目结构图。 以下目录中的文件依次为: 考试信息增删改查的接口。…

【BP回归预测】改进的鲸鱼算法优化BP神经网络回归预测(多输入单输出)【含Matlab源码 2184期】

⛄一、鲸鱼算法优化BP神经网络简介 1 鲸鱼优化算法(Whale Optimization Algorithm,WOA)简介 鲸鱼优化算法(WOA),该算法模拟了座头鲸的社会行为,并引入了气泡网狩猎策略。 1.1 灵感 鲸鱼被认为是世界上最大的哺乳动物…

DBCO-mPEG,5 kDa,二苯并环辛炔-MPEG, 5 KDA白色结晶状

●外观以及性质: DBCO-mPEG,5 kDa白色结晶状,其的分子量有多种,10kDa,20kDa,30kDa等一系列的。DBCO活化的聚乙二醇化试剂通过无铜“点击化学”反应与叠氮化物反应,形成稳定的三唑,不需要铜催化剂…

evpp mingw64编译过程

evpp是奇虎360的基于libevent的网络通讯库,源代码不错: https://github.com/Qihoo360/evpp/blob/master/readme_cn.md 它提供vs的编译结构,我用的是mingw64cmake,使用gnu12,把修改过程分享给大家。 步骤1. 修改CMake…

软考中级系统集成项目管理工程师自学好不好过?

可以试试,中级系统集成算是比较好考的一科目,每天的通过率都有30%的!是软考中通过率比较高的。 至于是否自学,有时间有精力就可以自学,在校生一般学习时间多,可以各个渠道搜集信息资料,可以自学…

高分子PEG点击试剂DBCO-PEG20K-OMe,二苯并环辛炔-PEG20K-甲基

DBCO-PEG20K-OMe​产品描述: DBCO-PEG20K-OMe属于高分子PEG点击试剂,DBCO 试剂是一类点击化学标记试剂,含有非常活泼的 DBCO((二苯并环辛炔)基团,​DBCO 试剂可以通过无铜点击化学与叠氮化物标…

vscode连接远程服务器进行cmake调试

一、cmake安装 cmake cmake-3.17.4.tar.gz : https://cmake.org/files/v3.17/cmake-3.17.4.tar.gz sudo apt-get install libssl-dev tar xvf cmake-3.17.4.tar.gz cd cmake-3.17.4 ./configure --prefix/usr make -j18 && sudo make install测试 二、配置 准备两…

如何找回删除的文件?数据恢复,看这几个方法

如果您的电脑出现了问题,或者是因为使用不当而删除了一些文件,那么您需要了解一下如何找回删除的文件。想要清理电脑文件数据,很多人会将其直接删除。其实这种做法是不可取的,因为这种做法可能会造成损失。如何找到已经删除的文件…

怎么把开源项目放到自己的github,gitee,gitea上

一、创建仓库(大部分可以不填) 二、删除.git文件夹 三、执行初始化命令(初始出.git文件夹) 在本地项目下执行命令 git init 四、与远程仓库建立关系 git remote add origin ssh://gitxx.xx.xx.xx:61022/shengbaitong/inst_ops…

IOC和DI入门案例

IOC案例 创建BookDao接口、BookDaoImpl类和BookService接口、BookServiceImpl类 1.BookDao package dao;public interface BookDao {public void save(); }2.BookDaoImpl类 package dao;public class BookDaoImpl implements BookDao{public void save(){System.out.printl…

Invisible Backdoor Attack with Sample-Specific Triggers 论文笔记

1. 论文信息 论文名称Invisible Backdoor Attack with Sample-Specific Triggers作者Yuezun Li(香港大学)出版社ICCV 2021pdf在线pdf 本地pdf代码TensorFlow简介提出了 sample-specific 以及 invisible 的 trigger。使用数字水印技术生成看不见的后门 …

MCE | 肿瘤微环境在癌症中的作用

在过去数十年中,通过使用免疫疗法、靶向疗法和联合方案,癌症治疗领域取得了很大的进步。但这些治疗方案中的绝大多数最终都无法治愈患者,甚至对治疗有显著初始反应的肿瘤也经常复发为耐药恶性肿瘤。另一方面,越来越多的证据表明&a…

A-Level经济例题解析及练习Budget Constraint

知识点:Budget Constraint例题 Question: Budget Constraint Hurley’s income: $1200, Prices: PF $4 per fish, PM $1 per mango A. If Hurley spends all his income on fish, how many fish does he buy? B. If Hurley spends all his income on mangos…

Java开发基础_04

六. 集合框架 #mermaid-svg-g9w5yNcJQzio5Xvm {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-g9w5yNcJQzio5Xvm .error-icon{fill:#552222;}#mermaid-svg-g9w5yNcJQzio5Xvm .error-text{fill:#552222;stroke:#55222…

【总结】Idea 编译maven项目报错NoSuchMethodError DefaultModelValidator

从网上git clone了一个项目,本地编译compile、打包package都没问题。 但是启动服务,启动不了,且查看Dependency Analyzer 没有任何依赖信息。执行Reimport时,报错如下。 错误信息 org.codehaus.plexus.component.repository.exc…

Git的简单使用

Git的简单使用一、关于版本控制1、文件的版本2、版本控制软件1.本地版本控制系统2.集中化的版本控制系统3.分布式的版本控制系统二、Git的简介1、什么是Git2、SVN的差异比较3、Git的记录快照4、Git中的三个区域5、使用Git的基本流程三、Git的基本操作1、配置Git1. 配置用户信息…

集合~List

List List集合概述和特点 List集合概述 有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素与Set集合不同,列表通常允许重复的元素 List集合特点 …

【JavaSE】String类总结,StringBuilder、StringBuffer、String的区别讲解

文章目录String对象的构造String类的一些常用方法求字符串的长度字符串判空字符串对象的比较字符串对象的查找字符串对象的转化字符串对象的截取字符串对象的替换字符串对象的拆分字符串对象的大小写转换常用方法总结StringBuilder与StringBuffer字符串为什么不可变String Stin…

Alibaba架构师内部最新发布SpringCloud开发手册,Github限时开源

微服务是SOA之后越来越流行的体系结构模式之一! 如果您关注行业趋势,就会发现,如今商业机构不再像几年前那样,开发大型应用程序,来管理端到端之间的业务功能,而是选择快速灵活的微服务。 通过微服务,架构师…