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

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

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. 分布式架构到了服务网格的时代,是最好的时代吗?今天的云原生架构模式还有哪些问题呢?
相关推荐
车载诊断技术1 小时前
什么是汽车中的SDK?
网络·架构·汽车·soa·电子电器架构
弥琉撒到我5 小时前
微服务swagger解析部署使用全流程
java·微服务·架构·swagger
_.Switch12 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
韩楚风13 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
_.Switch18 小时前
Python机器学习:自然语言处理、计算机视觉与强化学习
python·机器学习·计算机视觉·自然语言处理·架构·tensorflow·scikit-learn
feng_xiaoshi1 天前
【云原生】云原生架构的反模式
云原生·架构
架构师吕师傅1 天前
性能优化实战(三):缓存为王-面向缓存的设计
后端·微服务·架构
团儿.1 天前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构
艾伦~耶格尔1 天前
Spring Boot 三层架构开发模式入门
java·spring boot·后端·架构·三层架构
_.Switch2 天前
Python机器学习框架介绍和入门案例:Scikit-learn、TensorFlow与Keras、PyTorch
python·机器学习·架构·tensorflow·keras·scikit-learn