架构设计系列之基础:软件架构设计演化史(二)

2023-12-12 09:20

本文主要是介绍架构设计系列之基础:软件架构设计演化史(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

四、微服务时代的特征与挑战

1 、微服务时代的起源与演变

微服务的起源可以追溯到 2005 年的云计算博览会(Web Services Edge 2005),当时被称为 Micro-Web-Service。作为对 SOA 的轻量级补救方案,微服务最初并没有受到广泛关注,因为它被认为只是对 SOA 的修修补补,难以激发技术人员的兴趣。然而,在最近过去的十年中,微服务经历了思考和演变。

2012 年,Thoughtworks 首席咨询师 James Lewis 在波兰克拉科夫的 33d Degree Conference 上的《Microservices - Java,the Unix Way》主题演讲中,强调了微服务的原则,如单一服务职责、康威定律、自动扩展和领域驱动设计。这标志着微服务开始摆脱对 SOA 的依赖,呼吁重拾 Unix 设计哲学。

真正的崛起发生在 2014 年,由 Martin Fowler 和 James Lewis 合著的文章《Microservices:a definition of this new architectural ter》中,首次明确了微服务的定义。微服务被定义为通过多个小型服务的组合构建单个应用的架构风格,这些服务围绕业务能力而非特定技术标准构建,可以采用不同的编程语言、数据存储技术,运行在不同的进程中。这一定义成为微服务的真正起源。

2 、微服务的核心特征

围绕业务能力构建(Organized around Business Capabilities

微服务强调康威定律的重要性,即团队的结构、规模和能力将产生对应的产品结构、规模和能力。

团队和产品磨合稳定后,将拥有一致的结构,避免了跨团队沟通和高成本的跨团队边界。

分散治理(Decentralized Governance

微服务倡导谁负责谁治理,开发团队直接对服务运行质量负责,不受外界干预,可以选择和其他服务异构的技术来实现自己的服务。

强调对技术栈的选择权,并不强迫统一。

通过服务来实现独立自治的组件(Componentization via Services

强调通过服务而不是类库来构建组件,因为服务是进程外组件,通过远程调用提供功能,带来隔离与自治的能力。

服务的独立性是通过远程调用的代价来实现的。

产品化思维(Products not Projects

微服务要求将架构看作是一种持续改进和提升的过程,避免将软件研发视为完成某种功能的任务。

开发团队应为整个软件产品的生命周期负责,强调软件的持续改进和用户反馈。

数据去中心化(Decentralized Data Management

微服务提倡将数据按领域分散管理、更新、维护和存储。

不同服务对同一数据实体的抽象形态可能是不同的,避免了中心化存储导致的服务互相影响和失去独立性的问题。

例:

比如,一个商品,在销售域中关注的是价格,在仓储域中关注的是库存数量,在商品展示域中关注的是商品详情。

如果作为中心化的存储,那这里所有域都必须修改和映射到同一个实体中,就会导致不同的服务之间,可能会互相产生影响,丧失各自的独立性。

轻量级通讯机制(Smart Endpoints and Dumb Pipes

微服务倡导简单直接的通信方式,强调弱管道(Dumb Pipes)机制机制,反对过于复杂的通信机制,比如 SOAP 、 BPM 等。

通过类似于 Unix 过滤器的简单通信方式,比如 RESTful 风格,实现服务之间的通信。

容错性设计(Design for Failure

微服务接受服务总会出错的现实,要求在设计中考虑自动故障检测、隔离和服务恢复的机制。

容错性设计的目的是防止一两个服务的崩溃引发雪崩效应。

可靠系统完全可以由会出错的服务来组成,这也是微服务架构最大的价值所在。

演进式设计(Evolutionary Design

微服务设计应该能够被淘汰,而不是期望服务的长期存在。

良好的设计应该是可演进的,不可更改和无可替代的服务反映了系统设计的脆弱性。

微服务强调独立自治,鼓励设计能够随着需求的变化而演进。

基础设施自动化(Infrastructure Automation

微服务架构下,基础设施的自动化(如 CI/CD)降低了构建、发布、运维的复杂性。

面对微服务的数量级增长,团队更加依赖基础设施的自动化来应对挑战。

3 、微服务时代的挑战

微服务架构的广泛应用降低了软件研发的复杂性,但也带来了新的挑战。

对于开发者而言,微服务提供了友好的开发体验,但对架构师则提出了史无前例的要求。架构师需要具备广泛的知识面,以便在面临选择时能够权衡利弊。

微服务架构没有统一的规范和约束,各种中间件层出不穷,服务注册发现、负载均衡、认证授权等问题需要根据具体情况选择适当的解决方案。比如,在服务间通信方面,存在多种解决方案如 RMI、Thrift、Dubbo、gRPC、Motan2、Finagle、brpc、Arvo、JSON-RPC、REST 等。对于服务发现,可选的方案有 Eureka、Consul、Nacos、ZooKeeper、etcd、CoreDNS 等。

微服务时代的中间件百花齐放,架构师需要具备对这些工具和框架的熟悉程度,以便做出明智的选择。

总体而言,微服务架构为开发者提供了更灵活的开发和部署方式,但对于架构师来说,需要面对更高的决策难度和挑战。

微服务时代的演进既为软件架构带来了新的活力,也要求从业者不断学习和适应。

五、云原生时代的挑战与演进

1 、云原生时代的背景与挑战

随着微服务架构的普及,云原生时代迅速崛起,跨越了软件与硬件之间的界限。

在微服务架构中,诸如注册发现、跟踪治理、负载均衡、传输通信等问题一直存在,但是否一定要由分布式系统解决呢?

先不看架构层面的解决方案,仅看这些问题本身的解决方案:

  • 系统需要伸缩扩容,一般是采购服务器,多部署几套副本实例来分担压力
  • 系统需要负载均衡,一般是搭建负载均衡器,并选择合适的均衡算法来分流
  • 系统需要安全传输,一般是搭建 TLS 传输链路,配置 CA 证书,保证通信不被窃听篡改
  • 系统需要服务发现,一般设置 DNS 服务器,让服务访问依赖稳定的服务名而非易变的 IP 地址

因此,这些问题基本上都有专门的基础设施来解决。

但在微服务架构中不得不在应用服务层面而不是基础设施层面去解决这些问题,归根到底是因为硬件构成的基础设施,跟不上由软件构成的应用服务的灵活性。

2 、基础设施的演进:容器化技术的巨大贡献

容器化技术,特别是Docker的出现,为解决分布式系统特有问题的事后提供了新的途径。

通过虚拟化和容器化技术,基础设施得以发展到多个容器构成的集群,软件和硬件之间的界限变得模糊。

3 、容器生态的历史里程碑:Kubernetes 的崛起

2017 年,Kubernetes 在容器生态中取得了胜利,成为容器编排系统的代表。

Kubernetes 的出现标志着容器生态的发展迈出了重要的一步,使得虚拟化的基础设施从单个服务的容器扩展到多个容器构成的集群。在这个集群中,所有通信、存储设施得以实现,软件和硬件的边界变得模糊。

4 、云原生时代的演进

云原生时代的演进并非只是简单地解决了之前的问题,而是提出了一种新的思维方式。

在云原生时代,软件和硬件的界限不再是绝对的,硬件能够跟得上软件的灵活性。

因此,那些与业务无关的技术问题可以从软件层面剥离出来,在硬件的基础设施内解决掉,使软件能够更专注于业务。

这就是云原生时代追求的目标。

5 、云原生时代的挑战:服务网格的边车代理模式

云原生时代虽然解决了许多问题,但仍然面临着新的挑战。它并不能完美解决一些处于应用系统与基础设施边缘的问题。

例:

图中微服务 A 调用了微服务 B 中发布的两个服务 B1 和 B2,如果 B1 正常,但是 B2 出错,此时正常做法是对 B2 进行熔断,避免出现雪崩效应。但是如果在基础设施层面来做,就会切断 A 到 B 的通路,这样就会影响正常服务 B1 的使用。当然这个问题在 Spring Cloud 的应用代码是很好解决的,但从基础设施层面就很难,因为它是针对整个容器进行管理的,粒度比较粗。而且在服务的监控、认证、授权、安全、负载均衡上均有细化管理的需求。

为了解决这一问题,基础设施进行了第二次演进,即服务网格(Service Mesh)的边车代理模式(Sidecar Proxy),边车即在基础设施中由系统自动地在服务的资源容器(比如 Kubernetes 中的 prod)中注入一个通信代理服务器,用类似网络安全里中间人攻击的方式进行流量劫持,在应用无感知的情况下,接管应用所有对外通信。这个代理除了会实现正常的服务调用以外(数据平面通信),还接手来自控制器的指令(控制平面通信),根据控制平面中的配置,分析数据平面通信的内容,实现熔断、认证、度量、监控、负载均衡等附加功能。

6 、云原生时代的未来展望

云原生时代的未来充满了机遇和挑战。

随着技术的不断演进,云原生架构将继续迭代,解决新的问题,提供更好的开发和部署体验。

同时,从业者需要不断学习和适应,面对云原生时代带来的新挑战。

在这个演进的过程中,软件和硬件之间的关系将更加紧密,为构建更强大、灵活和可靠的系统奠定基础。

六、无服务时代的崭新篇章

1 、无服务时代的兴起

无服务时代的起源可以追溯到 2012 年,当时 iron.io 公司首次提出了无服务(Serverless)的概念。

分布式架构最初的目标是解决单台机器性能瓶颈的问题,但随着技术的发展,新的问题应运而生。而无服务时代的兴起正是为了解决分布式架构中面临的容错能力、技术异构、职责划分等问题。

2 、无服务时代的商业化与认可

2014年,AWS发布了Lambda,成为商业化无服务应用的开创者,逐渐被认可并发展成全球最大的无服务运行平台。

2019年,阿里云、腾讯云等也相继推出了相应的无服务产品。

这标志着无服务时代取得了商业化的成功。

3 、学术界的预言与验证

UC Berkeley 大学于 2009 年发表的论文《Above the Clouds:A Berkeley View of Cloud Computing》预言了云计算的价值、演进和普及在未来十年逐一被验证。

随后,2019 年发布的《Cloud Programming Simplified:A Berkeley View on Serverless Computing》再次预言无服务将成为未来云计算的主流方式。

4 、无服务的简单之美

无服务的魅力在于其简单性,它仅涉及后端设施(Backend)和函数(Function)两部分。

  • 后端设施:指数据库、消息队列、日志、存储等用于支撑业务逻辑运行,但本身无业务含义的技术组件,都在云上,被称为后端即服务(BaaS)
  • 函数:指业务逻辑代码,运行在云端,无需考虑算力和容量问题(仅技术不考虑,财务还是需要考虑钱的),被称为函数即服务(FaaS)

5 、无服务的优势与便利性

无服务的设计初衷是为了让开发者只需要纯粹地关注业务,不需要考虑技术组件,这些在无服务中都是现成的,可以直接使用,不存在采购、版权和技术选型的烦恼;

同时不需要考虑如何部署,整个部署过程都是托管给云,云端自动完成;

再就是不需要考虑算力,只要你有钱,它背后是整个数据中心的支撑,算力可以默认为无限大;

最后就是不需要运维,系统的稳定性由云服务商来保证,不需要开发者操心。

6 、无服务时代的挑战和局限性

尽管无服务架构的前景看好,但在短期内的发展并非一帆风顺。

与单体架构、微服务不同,无服务具有天生的特点,如冷启动、无状态、运行时间限制等,使得它并非一种普适性的架构模式。

适用场景受到限制,主要在不需要交互的大规模计算、Web资讯类网站、小程序、公共API服务、移动应用服务端等场景。而在一些信息系统、网络游戏应用、业务逻辑服务依赖服务端状态、响应速度要求高、需要长链接的应用场景来说,无服务架构是不太适合的。

结语

架构演进是一个不断推陈出新的过程。

微服务并非终点,无服务也只是演进历史中的一部分。未来,我们期待看到更多新的架构模式的涌现,为构建更强大、灵活和可靠的系统提供更多可能性。

在这个不断变化的技术领域,我们需要持续关注创新,灵活适应新技术的发展,并在实践中不断总结经验教训。

无论是单体、微服务还是无服务,都是为了更好地满足业务需求而服务的工具,选择合适的架构模式需要综合考虑业务特点、团队实力以及技术栈的适配性。

通过对架构演进历史的了解,我们可以更好地应对未来的挑战,构建出更加稳健和创新的系统。

附录

图灵名言

We can only see a short distance ahead,but we can see plenty there that needs to be done.

尽管目光所及之处,只是不远的前方,即使如此,亦然可以看到那里有需要值得去完成的工作在等待我们。

—— Alan Turing,Computing Machinery and Intelligence,1950

问题探讨

  1. Unix 设计哲学说保持接口与实现的简单性,比系统的任何其他属性都更加重要,那在你现在负责和参与的系统架构方案中,是如何看待简单的?
  2. 微服务、云原生时代的到来,那在未来的发展中,单体架构会是什么一样的一个发展路径呢?
  3. 你现在负责和参与的系统架构方案是微服务的架构模式吗?如果是,它符合九大特征吗?如果不是,那你们适合微服务架构模式吗?
  4. 分布式架构到了服务网格的时代,是最好的时代吗?今天的云原生架构模式还有哪些问题呢?

这篇关于架构设计系列之基础:软件架构设计演化史(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/484076

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机