什么是架构?网络架构中都有什么?

作者:大数据DT
来源:大数据DT

导读:理解架构这个词的意思是十分重要的。它可能被过度使用,并且使用在各种环境中。如果缺少一致的理解,将会有交流失败的风险。那么架构这个词到底是什么意思呢?
在这里插入图片描述

01 什么是架构?

架构是一个过程、一个结果和一门学科

  • 作为一个过程,它涉及将组件与设计元素结合,以此来形成一个有目的的实体。

  • 作为一个结果,它描述了由其形式所定义的一系列实体。对于我们熟知的“哥特式大教堂”这种架构形式,它的特点是一系列公认的设计元素与方法,目的可能是构建一个礼拜场所,但“哥特式大教堂”实际上意味着更多。

  • 作为一门学科,架构就是架构师接受训练要掌握的本领。计算机科学领域从设计物理实物的学科中借用了这个术语,例如建筑物和城市,其中包含广受认可的培训与认证过程。

架构的三个方面都适用于“真实的建筑”与计算机科学。

1. 作为一个过程

我的定义有两个重要的方面:将组件整合在一起并应用于某个目的。

  • 将组件整合在一起:这是计算机科学家在考虑模块、接口、依赖、分层、抽象以及组件复用等问题时所做的工作。

    • 这些都是设计模式,计算机科学家接受了相关的训练,在思量设计挑战时需要考虑这些设计模式。
  • 应用于某个目的:设计过程必须按照工件的预期目的来塑造,

    • 例如,是一所医院而不是一座监狱,是一个低功率处理器而不是超级计算机,是汽车中将刹车踏板挂在刹车上的网络而不是因特网。作为架构的一部分,设计师必须解决系统不能做什么(或者做得很好)与将要做什么。
    • 在计算机科学中,系统设计存在着一种危险,这是众所周知的,它被称为第二系统综合征,即首先构建一个或许把一些事做得很好的系统,然后再提出一个试图把所有事情都做得很好的替代方案的趋势。

2. 作为一个结果

在建筑设计实践中,设计通常会产生一份结果。也有一些例外,例如排房,其中一个设计会建造很多次,但大多数建筑物都只有一座。

在描述结果时,架构这个术语通常意味着一类设计,以其最显著的特征为代表(例如飞拱)。这个术语适用于这个抽象类,尽管架构师必须在建筑团队接管之前将建筑描述到非常精细的程度。

当计算机科学家重新使用架构这个术语时,他们稍微重新定义了一下。

关于因特网,有很多不同的网络都是基于同样的设计:我们称之为“因特网”的公共全球网络,属于企业、军队等的私有网络,以及金融网络等特殊用途的网络。

在这种环境下,架构一词仅描述所构建的部分内容,给定示例的大部分设计过程都发生在之后的环节中,可能由不同的组来描述。
在这里插入图片描述

3. 作为一门学科

真正的”建筑师——那些设计楼房的人——去学校里学习这一行业。

作为外行,了解他们的培养方式对于我们也是有教育意义的。架构(相对于结构工程)不是建立在基础科学与工程原理之上的设计学科。建筑师通常不关心结构工程等问题,并将这些留给别人。

当然,技术考虑可能需要尽早进入设计过程,因为建筑师要处理诸如能源效率或抗震等问题,但是建筑师主要是在设计过程中训练出来的。

他们学的不是工程而是建筑。他们通过案例研究来学习,需要观察大量的建筑物,看它们有多适合(或不适合),看它们是否满足用户的需求,在视觉上是否有吸引力,如何处理设计权衡,等等。

在计算机科学中,我们往往希望设计能基于强大的工程基础、具有限制性的理论以及优先的设计选项等,但(至少在过去)系统架构的大部分业务都更类似于建筑师的业务(例如,从以前的设计中学习,问问什么运转良好、什么效果不佳,问问这个设计是否与目标相符合)。

我们在理论和实践方面对计算机科学家进行训练,但往往不赞成研究以前的设计,我们认为它们“不科学”或“未基于基本原理”。

我个人对试图使架构更加严谨而感到兴奋,但是不应该用“凭直觉”设计这样的短语来反对我们今天所做的事情。我们的学科是一门设计学科,就像建筑架构一样,我们应该努力超越它,而不是摒弃它

因此,如果因特网的架构不是完整的规范,而只是该规范的一部分,那么架构中包含哪些内容呢

我们可以说说不包括什么。看看基于因特网技术的所有不同网络的例子,或者全球因特网的不同区域,试着发现它们的不同之处。

我们看到它们在性能、弹性、对移动性的容忍、对安全性的关注等方面存在差异。

这个级别的设计决策构建在核心架构之上,但是没有被核心架构指定。那么,我们应该在这个核心架构中看到什么呢?
在这里插入图片描述

02 网络架构的要素

确定了可以决定某个特定问题是否上升到架构级别的几个标准:对于系统的正常工作,是否需要就该问题达成一致;就该问题达成一致是否方便;该问题是否定义了系统的基本模块性或功能依赖;或者该问题随着时间的推移是稳定的这一点是否重要。

1. 对于系统的正常工作,我们必须一致同意的问题

例如,因特网架构是基于包的使用,以及假设包头总是具有相同的格式(不同的设计可能允许在不同的区域使用不同的格式,在这种情况下,架构可能会选择描述为所需的转换提供什么样的架构支持)。

另一个例子是,当我们第一次设计因特网时,认为设计依赖于单一的全球地址空间。现在很显然这种假设是不必要的,不需要就地址的统一含义达成全球一致。

网络地址转换设备或“NAT箱”,允许因特网边缘的区域使用私有地址空间,并仅在数据包向外传输到公共因特网时才将这些地址转换为全局路由地址。

有趣的是,一旦因特网设计师意识到他们可以使用具有不同地址空间的区域来构建网络,就不需要急于扩展架构来对不相交地址空间是如何互连的提供任何支持或指导。

2. 便于达成一致的问题

我们没有要求应用使用域名系统(DNS),但由于基本上所有应用设计人员都使用它,因此它已经强制成为因特网的一部分,尽管DNS不是最初设计的一部分。

类似地,尽管通信应用没有必要使用TCP,但是许多应用都依赖于它,以至于它也成为因特网的强制组成部分。

3. 系统的基本模块性

计算机科学使用模块这个词来描述系统的子组件:

一个模块有一个特定的接口,通过这个接口可以连接到系统的其他部分,而接口下面的模块内部结构是隐藏的,不能从模块外部访问。

模块的设计人员通常会保持接口规范不变,因为其他模块可能依赖于该接口,但是可以自由更改模块的内部结构,因为这些是模块的私有结构。因特网协议(IP)的规范定义了三个模块接口。

它定义了两层接口:

  • 服务接口(在其上构建更高级别的服务)和IP层下的技术接口。

  • 它还(隐式地和部分地)定义了AS接口:因特网中不同AS之间的接口。

服务接口是因特网的尽力而为包级的传送模型:如果端节点发送一个数据包,并在数据包中使用有效的目的地IP地址,就目前的网络能力而言,因特网的路由器将把数据包转发到由该IP地址定义的目的接口。

服务接口隐藏了如何使用特定技术在因特网内提供通信路径的所有细节。

因此,这个服务接口定义了网络和端节点之间的抽象接口。该接口的技术细节依赖于用于连接到端节点的特定网络技术,并根据技术的具体情况而有所不同,因此这些细节不属于架构规范的一部分
在这里插入图片描述

4. 功能依赖

架构的一个方面是明确设计的功能依赖。我将用因特网来说明这意味着什么。

因特网的基本操作很简单。路由器在后台计算路由表,这样它们就知道到因特网所有部分的路由。

当收到数据包时,它们会查找最佳的路由,并将数据包发送到该路由上。虽然在因特网内有很多东西在运行,但在内核上,它所做的就是这个。因特网的正常运行必然取决于路由器的正常运行。

但是因特网还需要什么来提供服务呢?

事实上,因特网的早期设计师试图限制使用的服务或要运行的组件的数量,以确保数据包流动。

早期的设计目标如下:“如果有两台计算机挂到网络上,并且每台计算机都知道另一台计算机的地址,那么它们应该能够通信。不应当再需要其他任何东西”。

这种设计偏好可以表示为“最少功能依赖”的目标。一些互联网设计建议具有更多的功能依赖——它们依赖于更多的服务来启动和运行,从而使基本通信成功。在出错时,它们正在用(或许)更弱的弹性来换取功能。

5. 系统中被视为持久不变的方面

在像因特网这样的系统中,我们知道很多东西将会改变。事实上,变化、升级和替换系统某些方面的能力,是成功长寿的关键。

但是在某种程度上,有些方面看起来像是持久不变的,将它们指定为设计的一部分可以提供稳定的点,系统的其他部分可以围绕这些点向前演化。
在这里插入图片描述

03 总结:关于架构的思考

对于我所说的架构这个词,我已经有了一个基本的概念。在我看来,一个关键的原则是架构的极简性。在计算机科学的背景下,系统的架构不应该试图描述系统的每个方面

这种架构的概念似乎与建筑物的架构有所不同。当楼房建筑师把设计图交给建造者时,规范就会完整到细节——不仅仅是形状和结构,还有电源插座的位置。

但是我不认为大部分决策是架构性的。就像我之前说的,建筑物的架构和像因特网这样的人工制品的架构之间的区别之一是,有很多网络是使用相同的因特网技术构建的,而不仅仅是一个。

如果可以在不同的环境中使用因特网技术,则会有明显的好处:商业产品更便宜,也可能更成熟,几乎所有计算机系统都有相关的软件,等等。

然而,对于安全性、弹性以及其他方面,这些网络可能没有完全相同的要求,所以架构的力量不在于定义了如何构建网络(就像建筑规划描述如何建造楼房一样),而在于允许这些需求得到满足,或许在不同的环境中以不同的方式来满足这些需求

改述一下爱因斯坦的话,我认为架构应该尽可能小,但不要过小。

有人可能会说,正如我所描述的,因特网架构最基本的方面是其偏好极简性。考虑到这一观点,给定架构所要解决的需求,我们认为的网络系统架构的范围,应该只包括那些属于我在这里列出的框架内的那些方面。

<think>好的,用户现在想了解微服务架构的定义、特点及工作原理。我需要结合之前的对话和提供的引用内容来组织回答。首先,用户之前的问题是关于如何撰写项目记录文章,但现在的提问转向了微服务架构,这可能意味着用户可能在项目文档中需要涉及技术架构部分,或者他们在技术选型时考虑微服务。 首先,我需要明确用户的需求:他们需要基础的定义、特点和工作原理。根据提供的引用,引用[2]给出了微服务的定义,强调小型、自治的服务单元。引用[1]和[3]讨论了服务拆分、通信模式等设计考虑。引用[4]提到了Netflix的案例,说明微服务的实际应用。 接下来,我需要结构化回答。按照用户的要求,分定义、特点和工作原理三个部分。定义部分直接引用[2],特点部分需要从拆分、独立性、技术多样性、可扩展性等方面组织,可能结合引用[3]提到的服务拆分和独立部署。工作原理部分可能需要涉及服务拆分原则、通信机制(引用[1]提到的RPC和消息)、基础设施(如容器化、监控,引用[4]的Netflix案例)。 需要注意使用中文,并且按照用户之前的示例,使用$...$和$$...$$格式。同时,要生成相关问题,可能需要包括微服务的优缺点、拆分策略、单体架构的比较等,这些在引用中都有涉及。 还要检查引用标注是否正确,每个引用的来源是否对应正确的内容。例如,引用[1]提到服务拆分、通信模式等,适合在拆分原则和通信机制部分引用;引用[4]的Netflix案例可以用在实践案例中。 最后,确保回答清晰分步骤,结构符合用户之前的回答模板,比如分点列出,使用标题,代码块或公式示例等。可能需要使用Mermaid图表,但用户示例中没有,所以可能用文字描述。同时,保持语言简洁,技术术语适当解释,比如提到RPC和消息队列时简要说明。</think>### 微服务架构的定义、特点及工作原理 #### 一、定义 微服务架构(Microservices Architecture)是一种将**单体应用拆分为多个小型、独立服务单元**的软件设计模式。每个服务单元(称为微服务)**聚焦单一业务功能**,拥有独立的数据存储、开发框架和部署能力,并通过轻量级通信协议协同工作[^2][^3]。 例如,电商系统可拆分为: $$ S_{\text{电商}} = \{ \text{用户服务}, \text{订单服务}, \text{支付服务}, \text{库存服务} \} $$ #### 二、核心特点 1. **服务原子化** 每个微服务实现**单一职责原则**(SRP),例如用户服务仅处理身份验证和权限管理[^3]。 2. **独立性自治性** - **独立部署**:修改支付服务逻辑时无需重新部署订单服务 - **技术异构**:允许不同服务使用Java、Go或Python等语言开发 - **数据隔离**:订单服务使用MySQL,推荐服务使用MongoDB[^2] 3. **弹性可扩展性** 通过容器化技术(如Docker)实现动态扩缩容: $$ \text{实例数} = \left\lceil \frac{\text{当前QPS}}{\text{单实例承载上限}} \right\rceil $$ 例如当QPS达到$5000$时自动扩展为5个实例(假设单实例承载$1000$ QPS)[^4] 4. **去中心化治理** 各服务团队可自主选择CI/CD工具链(如Team A用Jenkins,Team B用GitLab CI) #### 三、工作原理 1. **服务拆分原则** - **业务边界驱动**:按领域驱动设计(DDD)划分限界上下文 ```mermaid graph TD A[电商系统] --> B(用户域) A --> C(商品域) A --> D(交易域) ``` - **康威定律应用**:组织结构映射系统架构(如支付团队独立维护支付服务)[^1] 2. **通信机制** - **同步通信**:通过RPC(如gRPC)或REST API实现服务调用 ```python # 订单服务调用支付服务 response = requests.post("http://payment-service/api/charge", json=order_data) ``` - **异步通信**:使用消息队列(如Kafka)解耦服务 $$ \text{订单创建事件} \xrightarrow{\text{Kafka}} \text{库存服务} \xrightarrow{\text{扣减库存}} $$ - 通信模式选择需权衡**一致性****可用性**(CAP定理)[^1] 3. **基础设施支撑** - **服务注册发现**:通过Consul或Eureka实现动态服务路由 - **分布式追踪**:使用Jaeger或Zipkin监控跨服务调用链 ``` 用户请求 → 网关服务 → 订单服务 → (支付服务 + 库存服务) ``` - **熔断机制**:通过Hystrix实现故障隔离,防止级联失败[^4] 4. **典型工作流程** 以用户下单场景为例: ``` 1. 用户请求 → API网关路由 → 订单服务 2. 订单服务 → 同步调用支付服务 3. 支付服务 → 异步发送消息到库存服务 4. 库存服务更新后 → 通知物流服务 ``` 此过程涉及4个独立服务,通过事件驱动架构保证最终一致性[^1][^3] #### 四、实践案例 Netflix通过微服务架构实现全球化扩展: - 将视频转码、推荐算法、计费等功能拆分为500+微服务 - 使用AWS云基础设施实现自动弹性伸缩 - 每天处理超过$2\times10^{9}$次服务调用[^4] --相关问题-- 1. 微服务架构单体架构在性能指标上有何量化差异? 2. 如何设计微服务之间的数据一致性保障机制? 3. 服务网格(Service Mesh)如何增强微服务通信的可靠性? 4. 微服务拆分不当会导致哪些典型问题?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值