微服务系列之初探“微服务架构”

news2025/1/19 16:35:32

随笔

有时你必须对你想得到的东西充满敬畏。
在这里插入图片描述
参考书籍:

  1. “凤凰架构”
  2. “微服务架构设计模式”

在了解微服务架构之前我们有必要解答“什么是架构”、“什么是架构的风格”这两个问题,同时需要带着“架构并不是被发明出来的,而是持续演进的结果”这种思想去看待软件架构。

什么是软件架构?

计算机系统的软件架构是构建这个系统所需要的一组结构,包括软件元素 、它们之间的关系以及两者的属性

  • Bass 等注 < Documenting Software Architectures: Views and Beyond>

上面是卡耐基梅隆大学软件工程研究所的Les Bass及其同事对于软件架构的定义,上述的定义是非常抽象的以至于理解起来会比较吃力,那么我们应该怎么去理解这句话呢?下面是个人对于这个定义的一些见解:

软件架构可以类比于“土木工程”(土木老哥:没想到这里也可以cue到我,真的是会蟹!)中的对于建筑的“蓝图”,这个蓝图会描述建筑中表示承重结构的布置情况,构件类型,尺寸大小及构造做法,同时还会描述建筑不同结构之间该如何去组合、拼接(混泥土等是他们组合、拼接的介质)

个人声明:本人对土木这个行业了解并不多,上面的见解是通过查阅文献所总结,有描述不太对的地方,请见谅!

按照上面我们对于软件架构的描述,我们不难得出“软件架构是将软件分解成元素以及定义这些元素之间的关系”。一份完整的建筑“蓝图”中,会根据其专业内容或作用的不同,然后划分不同的模块去描述对应的内容(像结构、管线、电气等)。与其对应的“软件架构”也是如此,Phillip Krutchen 在他经典的论文( Architectural Blueprints—— The 4+1View Model of Software Architecture 》中提出了软件架构的4+1视图。

在这里插入图片描述

每个视图描述的内容(引用自“微服务架构设计模式”一书):

  1. 逻辑视图:开发人员创建的软件元素。在面向对象的语言中,这些元素是类和包。它们之间的关系是类和包之间的关系,包括继承、关联和依赖
  2. 实现视图:构建编译系统的输出。此视图由表示打包代码的模块和组件组成,组件是由一个或多个模块组成的可执行或可部署单元。在Java 中,模块是JAR 文件,组件通常是WAR文件或可执行JAR文件 。它们之间的关系包括模块之间的依赖关系以及组件和模块之间的组合关系
  3. 进程视图:运行时的组件。每个元素都是一个进程,进程之间的关系代表进程间通信
  4. 部署视图:进程如何映射到机器 。此视图中的元素由(物理或庭拟)计算机和进程组成。机器之间的关系代表网络。该视图还描述了进程和机器之间的关系
  5. 场景视图:是其它几个视图的补充,用于通过use case将其它几个视图串联起来。

虽然最早的4+1视图由Philippe Kruchten于1995年提出,但是“经典永远都是经典”这句话在它身上体现的淋淋尽致。4 +1 视图是描述应用程序架构的绝佳方式。每一个视图都描述了架构的一个重要侧面(如何去画好这几个视图对每个架构师都是一个不小的挑战,而且挑战难度于系统的复杂是成正比的)。

这个时候有些小伙伴可能会有疑惑“我平时开发不用画架构图也可以完整的开发一套系统”,博主以前也是这样认为的,不过随着对于软件架构知识的不断积累,对这个问题也有了一些不同的看法。我们将一个系统从需求的层面进行划分,可以包含:

  1. 功能型需求:这些需求决定一个应用程序做什么。 这些通常都包含在用例(use case)或者用户故事(user story)中(像支付、扣款等就是
  2. 非功能型需求:我们把这类需求也称之为质量属性需求 ,或者简称为 “ 能力” 。

应用的架构其实跟功能性需求没什么关系,这种需求我们可以使用任意的架构去实现,甚至,你可以自定义自己喜欢的方式去实现。但是这些非功能性需求决定一个应用程序在运行时的质量,比如可扩展性和可靠性(设计模式)。它们也决定了开发阶段的质量,包括可维护性、可测 试性、可扩展性和可部署性。为应用程序所选择的架构将决定这些质量属性。

听到这里,对于什么是架构与架构的重要性有了一个更加深刻的理解,我们再来看看什么是架构的风格

架构风格

架构风格确定可以在该风格的实例中使用的组件和连接器的词汇表,以及关于如何组合它们的一组约束 – 《微服务架构设计模式》

还是通过cue“土木工程”的好兄弟来解释“架构风格”这个概念,在物理世界中,建筑物的建筑通常遵循特定的风格,例如维多利亚式 、美国工匠式或 装饰艺术式,每种风格都是一系列设计决策,限制了建筑的特征和建筑材料。建筑风格的概念也适用于软件。应用程序通常使用多种架构风格的组合,上篇博客我们说的“单体架构”(将应用程序构建为单个可执行和可部署组)其实就是一种软件架构风格与“单体架构风格”对应的就是“微服务架构风格”(将应用程序构建为松糯合、可独立部暑的一组服务),这两种架构风格可以作用在4+1视图中的任意视图中。

单体架构我们上篇文章已经具体介绍过了,微服务架构着重放在后面文章去介绍,接下来我们去研究一下应用系统中的4+1视图中其他的视图实例:“MVC分层架构风格”、“六边形架构风格”

分层式架构风格

分层架构将软件元素按“层” 的方式组织。每个层都有明确定义的职责。分层架构还限制了层之间的依赖关系。每一层只能依赖于紧邻其下方的层如果严格分层)或其下面的任何层。

在这里插入图片描述

我们可以将分层架构应用于前面讨论的四个视图中的任何一个。流行的三层架构是应用于逻 辑视因的分层架构。它将应用程序的类组织到以下层中:

  1. 表现层 :包含实现用户界面或外部API 的代码
  2. 业务逻辑层:包含业务逻辑。
  3. 数据持久化层:实现与数据库交互的逻辑。

这种分层架构风格是我们平时开发中使用最多的一种架构风格,这种架构风格的优点:

  1. 简化设计:各司专职,而不必将自己活成全才。
  2. 高复用:比如在设计某系统时,发现某层具有通用性,就可把它抽取独立出来,在设计其它系统时使用。
  3. 横向扩展:可以让我们更容易做横向扩展。如果系统没有分层,当流量增加时我们需要针对整体系统来做扩展。但是,如果我们按照上面提到的三层架构将系统分层后,就可以针对具体的问题来做细致的扩展。

但是这种架构风格也有很明显的弊端:

  1. 单个表现层:它无法展现应用程序可能不仅仅由单个系统调用的事实。
  2. 单一数据持久化层 :它无法展现应用程序可能与多个数据库进行交互的事实。
  3. 将业务逻辑层定义为依赖于数据持久化层:理论上,这样的依赖性会妨碍你在没有数据库的情况下测试业务逻辑。

此外,分层架构错误地表示了精心设计的应用程序中的依赖关系。业务逻辑通常定义数据访问方法的接口或接口库。数据持久化层则定义了实现存储库接口的DAO 类。换句话说,依赖关系与分层架构所描述的相反。

六边形架构

分层架构风格有不少的缺点,六边形架构风格是克服这些弊端的分层架构风格的替代架构

在这里插入图片描述

六边形架构风格选择以业务逻辑为中心的方式组织逻辑视图。应用程序具有一个或多个入站适配器 ,而不是表示层,它通过调用业务逻辑来处理来自外部的请求。同样,应用程序具有一个或多个出站适配器,而不是数据持久化层,这些出站适配器由业务逻辑调用并调用外部应用程序。此架构的一个关键特性和优点是业务逻辑不依赖于适配器。相反,各种适配器都依赖业务逻辑。

业务逻辑具有一个或多个端口(port)。端口定义了 一组操作,关于业务逻辑如何与外部交互。例如,在Java 中,端口通常是Java 接口。有两种端口:人站和出站端口。入站端口是业务逻辑公开的API,它使外部应用程序可以调用它。入站端口的一个实例是服务接口, 它定义服务的公共方法。出站端又是业务逻辑调用外部系统的方式。出站端口的一个实例是存储库接口,它定义数据访问操作的集合

业务逻辑的周围是适配器 。与端口一样,有两种类型的适配器:入站和出站。入站适配器通过调用入站端口来处理来自外部世界的请求。入站适配器的一个实例是Spring MvC Controller,它实现一组REST接口(endpoint)或一组Web页面。另一个实例是订阅消息的消息代理客户端。多个入站适配器可以调用相同的入站端口。

出站适配器实现出站端口,并通过调用外部应用程序或服务处理来自业务逻辑的请求。 出站适配器的一个实例是实现访问数据库的操作数据访问对象( DAO)类。另一个实例是调用远程服务的代理类。出站适配器也可以发布事件。

六边形架构是描述微服务架构中每个服务的架构的好方法,其优点:

  1. 六边形架构风格的一个重要好处是它将业务逻辑与适配器中包含的表示层和数据访问层的逻辑分离开来。业务逻辑不依赖于表示层逻辑或数据访问层逻辑。由于这种分离,单独测试业务逻辑要容易得多。另一个好处是它更准确地
  2. 反映了现代应用程序的架构。可以通过多个适配器调用业务逻辑,每个适配器实现特定的API 或用户界面。业务逻辑还可以调用多个适配器,每个适配器调用不同的外部系统。

六边形架构的初衷是为了解决技术与业务系统的解耦合问题,以及技术与技术间的解耦合问题,这一架构从设计模式中来,从业务的实体服务出发,将面向接口的设计具体化的端口协议和适配器实现,将业务实体实现自服务的完备性,可以看作是微服务的一个理论基础。

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

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

相关文章

[AI] LRTA*ls(k)搜索算法

LRTA*LS[K]一、LRTA*(K)算法的缺点二、LRTA∗LS(k)LRTA*_{LS}(k)LRTA∗LS​(k)算法1、选择局部空间2、更新局部空间论文在这里&#xff01; 一、LRTA*(K)算法的缺点 LRTA*(K)算法每次要更新队列Q里的state&#xff0c;但有三点缺陷&#xff1a; 如果state y进入 Q&#xff0c…

【网络工程】6、防火墙介绍及配置实操

接上篇《5、路由器介绍及配置实操》 之前我们讲解了网络设备路由器的介绍&#xff0c;以及完成了路由器的相关配置实操。本篇我们来讲解防火墙的基础知识以及相应的实操案例。 一、什么是防火墙&#xff1f; 防火墙是一个安全产品&#xff0c;它可以把安全的内网和不安全的外网…

【前端】jQuery-概述+基本使用+常用API

目录 一、jQuery概述 1.1JavaScript库 1.2jQuery的概念 二、jQuery的基本使用 2.1jQuery的下载 2.2jQuery的使用步骤 2.3jQuery的入口函数 2.4jQuery的顶级对象$ 2.5jQuery对象和DOM对象 三、jQuery常用API 3.1jQuery选择器 3.1.1jQuery基础选择器 3.1.2jQuery层级选…

Linux下C语言实现HTTP文件服务器和TCP协议实现网络数据传输

在实际开发中经常用到web框架&#xff0c;比如Servlet&#xff0c;SpringBoot等&#xff0c;这些开发框架提高了我们的开发效率&#xff0c;节省了开发时间。但是这会令我们技术人员处于浮云之上&#xff0c;看不到其本质。说实话&#xff0c;Java语言那么流行&#xff0c;其本…

springboot-自动配置

一、简介 在搭建springboot应用的时候&#xff0c;无需像之前spring的时候&#xff0c;要一堆繁琐的配置文件之类的。一个main的方法&#xff0c;就能把springboot的项目run起来。和其他框架整合也是非常的简单&#xff0c;只需要使用到Enablexxxxx注解就可以搞起来。 二、原理…

外卖项目09---Redis了解

目录 Redis了解 141 一、Redis入门 143 1.1Redis简介 143 1.2Redis下载与安装 143 1.3Redis入门---Redis服务启动 144 1.3.1Redis服务启动 1.3.2设置密码远程连接 二、Redis数据类型 145 三、Redis常用命令 146 3.1Redis常用命令---字符串string操纵命令 3.2Redis…

现代密码学导论-21-分组密码

目录 3.6.3分组密码及其操作模式 ECB(Electronic Code Book) 电码本模式 CBC(Cipher Block Mode) 密文分组链接方式 THEOREM 3.32 CBC模式的CPA安全 连锁CBC模式 OFB(Output Feedback Mode) 输出反馈模式 CTR(Counter) 计数器模式 THEOREM 3.33 CTR多明文PCA安全 THE…

C语言学习之路(基础篇)—— 复合类型(自定义类型)

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 结构体 1) 概述 数组&#xff1a;描述一组具有相同类型数据的有序集合&#xff0c;用于处理大量相同类型的数据运算。 结构体&#xff1a;将多个…

工具分享:Springboot+Netty+Xterm搭建一个网页版的SSH终端

一. 简述 搭建一个web ssh&#xff0c;主要是借助websocket和xterm&#xff0c;可以实现一个类似于xshell的效果&#xff0c;如图&#xff1a; 二. 技术栈 这里使用了springboot、netty、jsch、react、Ts,xterm。 这里我用了springboot和netty实现了websocket&#xff0c;js…

稳了,我用 Python 可视化分析和预测了 2022 年 FIFA 世界杯

许多人称足球为 “不可预测的游戏”&#xff0c;因为一场足球比赛有太多不同的因素可以改变最后的比分。 预测一场比赛的最终比分或赢家确实是很难的&#xff0c;但在预测一项比赛的赢家时就不是这样了。在过去的5年中&#xff0c;Bayern Munich 赢得了所有的德甲联赛&#xf…

如何发布一个属于自己的 npm 包

如何发布一个属于自己的 npm 包 start 在日常的工作中&#xff0c;我们会接触很多 npm 包。 例如&#xff1a; npm install jquerynpm install vue/clinpm install axios# ... 等等有时候会想到&#xff0c;构建一个属于自己的 npm 包&#xff0c;应该超级酷吧&#xff1f; …

zabbix基础环境部署

目录 一、环境准备 二、部署LNMP 1、安装Nginx及其依赖包 2、修改nginx配置 3、测试页面 三、部署zabbix服务端 1、下载zabbix 2、安装源码zabbix 3、为zabbix创建数据库与数据库账户 4、搭建Zabbix页面 4.1、第1步 Check of pre-requisites 4.2、第2步 Configure D…

Python代码的编写运行方式

Python代码的编写运行方式介绍 python官方运行环境可到网站https://www.python.org/downloads/找到合适版本下载安装。 安装比较容易&#xff0c;特别强调&#xff0c;安装过程建议勾选“Add Python to PATH”&#xff08;将Python添加到PATH环境变量&#xff09;【注1】&…

Docker安装Minio

寻找Minio镜像 Docker Hub 查找官方镜像 下载Minio镜像 下载最新版Minio镜像 docker pull minio/minio等同于 docker pull minio/minio:latest下载指定版本的Minio镜像 docker pull minio/minio:RELEASE.2022-11-26T22-43-32Z.fips检查当前所有Docker下载的镜像 docker …

第六章TCP/IP——网络传输硬件设备

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。个人爱好: 编程&#xff0c;打篮球&#xff0c;计算机知识个人名言&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石…

Linux进程通信之消息队列

目录 1.消息队列的原理&#xff1a; 2.消息队列的接口&#xff1a; &#xff08;1&#xff09;创建消息队列 &#xff08;2&#xff09;向消息队列发送消息 &#xff08;3&#xff09;接收消息 &#xff08;4&#xff09;操作消息队列的接口 1.消息队列的原理&#xff1a; 消…

docker 安装 Heimdall 导航页

前言 随着群晖中使用的功能越来越多&#xff0c;各种端口太多容易忘&#xff0c;所以就有了使用导航页的想法&#xff08;使用收藏夹的朋友除外&#xff09;。群晖也有自带的WEB套件管理&#xff0c;不过个人感觉相对麻烦&#xff0c;使用 Heimdall 导航页可以设置密码登录&am…

【数字信号调制】16QAM信号调制解调【含Matlab源码 2050期】

⛄一、QAM调制与解调&#xff08;附实验题目说明&#xff09; 1 引 言 数字振幅调制、数字频率调制和数字相位调制是数字调制的基础,然而,这3种数字调制方式都存在不足之处。如频谱利用率低、抗多径衰落能力差、功率谱衰减慢、带外辐射严重等。为了改善这些不足,几十年来人们不…

yocto machine class解析之st-partitions-image

yocto machine class解析之st-partitions-image stm32mp157 yocto的meta-st-stm32mp layer中提供了几个class,后续几篇文章重点分析这些class文件&#xff1a; 第一篇就从st-partitions-image.bbclass 开始&#xff0c;st所有创建image的bb文件都会引用st-partitions-image&am…

「UWB」精准定位黑科技,开启座舱雷达新蓝海

基于厘米级定位、超低功率、强抗干扰、超大容量等技术特点&#xff0c;UWB&#xff08;超宽带&#xff09;技术在消费电子、智能汽车等领域的应用前景被赋予厚望。 值得一提的是&#xff0c;利用UWB雷达还可实现舱内活体检测、脚踢尾箱等&#xff0c;这意味着新一轮座舱感知革…