应用架构变迁学习

部分阐述来自 : https://icyfenix.cn/architecture/architect-history/soa.html 半原创, 学习笔记

单体

所有模块在一个应用里面, 缺点很明显. (这里就不写了)

SOA (Service-Oriented Architecture 面向服务架构 )

动机

既然单体不好, 那么就进行拆分 ,如何拆分呢?
为了对大型的单体系统进行拆分,让每一个子系统都能独立地部署、运行、更新,开发者们曾经尝试过多种方案,这里列举以下三种较有代表性的架构模式,具体如下

烟囱式架构(Information Silo Architecture)

使用这种架构的系统也被称为孤岛式信息系统或者烟囱式信息系统。它指的是一种完全不与其他相关信息系统进行互操作或者协调工作的设计模式。

微内核架构(Microkernel Architecture)

微内核架构也被称为插件式架构(Plug-in Architecture)。

img

事件驱动架构(Event-Driven Architecture)

基于事件的分发又可以分为两种不同的模式

Mediator Topology

img

Broker Topology

img

    SOA 的概念最早由 Gartner 公司在 1994 年提出,当时的 SOA 还不具备发展的条件,直至 2006 年情况才有所变化,由 IBM、Oracle、SAP 等公司共同成立了 OSOA 联盟(Open Service Oriented Architecture),用于联合制定和推进 SOA 相关行业标准。2007 年,在结构化资讯标准促进组织(Organization for the Advancement of Structured Information Standards,OASIS)的倡议与支持下,OSOA 由一个软件厂商组成的松散联盟,转变为一个制定行业标准的国际组织,联合 OASIS 共同新成立了的Open CSA组织(Open Composite Services Architecture),这便是 SOA 的官方管理机构。

    软件架构来到 SOA 时代,许多概念、思想都已经能在今天微服务中找到对应的身影了,譬如服务之间的松散耦合、注册、发现、治理,隔离、编排,等等。这些在今天微服务中耳熟能详的名词概念,大多数也是在分布式服务刚被提出时就已经可以预见的困难点。SOA 针对这些问题,甚至是针对“软件开发”这件事情本身,都进行了更加系统性、更加具体的探索。

微服务

    What is microservices

    Microservices is a software development technique — a variant of the service-oriented architecture (SOA) structural style.

    微服务是一种软件开发技术,是一种 SOA 的变体形式。

                                    —— Wikipedia,Microservices

img

这个我们就熟悉了, 下图中右边 Spring Cloud 使用的应用框架就是微服务框架.

img

需要注意的是, 从单体到 SOA 再到微服务, 我们并没有提到虚拟化容器化技术, 但是假如我们真的要实现微服务, 例如某个应用需要的CPU资源比较多, 另外一个需要的内存比较多, 势必需要虚拟化容器化技术来实现.

后微服务架构

简单来说就是以k8s为代表的服务编排工具的诞生与运用使得微服务架构的搭建, 编排等更加得遍历高效.

    2017 年是容器生态发展历史中具有里程碑意义的一年。在这一年,长期作为 Docker 竞争对手的RKT 容器一派的领导者 CoreOS 宣布放弃自己的容器管理系统 Fleet,未来将会把所有容器管理的功能移至 Kubernetes 之上去实现。在这一年,容器管理领域的独角兽 Rancher Labs 宣布放弃其内置了数年的容器管理系统 Cattle,提出了“All-in-Kubernetes”战略,把 1.x 版本时就能够支持多种容器编排系统的管理工具 Rancher,从 2.0 版本开始“反向升级”为完全绑定于 Kubernetes 这单一种系统。在这一年,Kubernetes 的主要竞争者 Apache Mesos 在 9 月正式宣布了“Kubernetes on Mesos”集成计划,由竞争关系转为对 Kubernetes 提供支持,使其能够与 Mesos 的其他一级框架(如HDFS、Spark 和Chronos等)进行集群资源动态共享、分配与隔离。
    
    在这一年,Kubernetes 的最大竞争者 Docker Swarm 的母公司 Docker,终于在 10 月被迫宣布 Docker 要同时支持 Swarm 与 Kubernetes 两套容器管理系统,也即在事实上承认了 Kubernetes 的统治地位。这场已经持续了三、四年时间,以 Docker Swarm、Apache Mesos 与 Kubernetes 为主要竞争者的“容器编排战争”终于有了明确的结果,Kubernetes 登基加冕是容器发展中一个时代的终章,也将是软件架构发展下一个纪元的开端。

动机

    上节提到的分布式架构中出现的问题,如注册发现、跟踪治理、负载均衡、传输通信等,其实在 SOA 时代甚至可以说从原始分布式时代起就已经存在了,只要是分布式架构的系统,就无法完全避免,但我们不妨换个思路来想一下,这些问题一定要由软件系统自己来解决吗?

    如果不局限于采用软件的方式,这些问题几乎都有对应的硬件解决方案。譬如,某个系统需要伸缩扩容,通常会购买新的服务器,部署若干副本实例来分担压力;如果某个系统需要解决负载均衡问题,通常会布置负载均衡器,选择恰当的均衡算法来分流;如果需要解决传输安全问题,通常会布置 TLS 传输链路,配置好 CA 证书以保证通信不被窃听篡改;如果需要解决服务发现问题,通常会设置 DNS 服务器,让服务访问依赖稳定的记录名而不是易变的 IP 地址,等等。
    
    经过计算机科学多年的发展,这些问题大多有了专职化的基础设施去解决,而之所以微服务时代,人们选择在软件的代码层面而不是硬件的基础设施层面去解决这些分布式问题,很大程度上是因为由硬件构成的基础设施,跟不上由软件构成的应用服务的灵活性的无奈之举。软件可以只使用键盘命令就能拆分出不同的服务,只通过拷贝、启动就能够伸缩扩容服务,硬件难道就不可以通过敲键盘就变出相应的应用服务器、负载均衡器、DNS 服务器、网络链路这些设施吗?

    当虚拟化的基础设施从单个服务的容器扩展至由多个容器构成的服务集群、通信网络和存储设施时,软件与硬件的界限便已经模糊。一旦虚拟化的硬件能够跟上软件的灵活性,那些与业务无关的技术性问题便有可能从软件层面剥离,悄无声息地解决于硬件基础设施之内,让软件得以只专注业务,真正“围绕业务能力构建”团队与产品。

是呀, 我们认真一想, 我们微服务中的熔断, 负载均衡, 假如都由外部的设备去完成, 而容器本身完成业务逻辑就够了. 那么后时代的微服务到底解决的是什么问题呢 ? 继续往下看

    笔者在表 1-1 列出了在同一个分布式服务的问题在传统 Spring Cloud 中提供的应用层面的解决方案与在 Kubernetes 中提供的基础设施层面的解决方案,尽管因为各自出发点不同,解决问题的方法和效果都有所差异,但这无疑是提供了一条全新的、前途更加广阔的解题思路。

注意一个是应用层面 , 一个是基础设施层面 , 曾经记得上操作系统课程的时候讲到的内存管理章节, 老师讲到的地址转化过程是用硬件来做的, 无可否认的是硬件来做更加高效, 性能更好 .

img

上面的图, 举一个例子 ,例如在我们应用层面中定时任务是使用Quartz来编写代码, 然后作为一个应用程序(例如一个 jar), 而 k8s 则是使用 k8s 中的 Job 来完成 ,而不是到应用层面去实现

云原生

    从软件层面独力应对分布式架构所带来的各种问题,发展到应用代码与基础设施软、硬一体,合力应对架构问题的时代,现在常被媒体冠以“云原生”这个颇为抽象的名字加以宣传。云原生时代与此前微服务时代中追求的目标并没有本质改变,在服务架构演进的历史进程中,笔者更愿意称其为“后微服务时代”。

这是理想的状态呀 ! 相比于经常讲到的云原生这种高大上的叫法, 我更加同意凤凰架构作者的叫法---"后微服务时代", 比较云原生更像是一个最终的理想目标, 当前的"原生"还不够原生.

服务网格 ( Service Mesh) 和边车模式 (SideCar)

    Kubernetes 成为容器战争胜利者标志着后微服务时代的开端,但 Kubernetes 仍然没有能够完美解决全部的分布式问题——“不完美”的意思是,仅从功能上看,单纯的 Kubernetes 反而不如之前的 Spring Cloud 方案。这是因为有一些问题处于应用系统与基础设施的边缘,使得完全在基础设施层面中确实很难精细化地处理。举个例子,微服务 A 调用了微服务 B 的两个服务,称为 B1和 B2,假设 B1表现正常但 B2出现了持续的 500 错,那在达到一定阈值之后就应该对 B2进行熔断,以避免产生雪崩效应。如果仅在基础设施层面来处理,这会遇到一个两难问题,切断 A 到 B 的网络通路则会影响到 B1的正常调用,不切断的话则持续受 B2的错误影响。

img

图 1-4 是否要熔断对服务 B 的访问?

    以上问题在通过 Spring Cloud 这类应用代码实现的微服务中并不难处理,既然是使用程序代码来解决问题,只要合乎逻辑,想要实现什么功能,只受限于开发人员的想象力与技术能力,但基础设施是针对整个容器来管理的,粒度相对粗旷,只能到容器层面,对单个远程服务就很难有效管控。类似的情况不仅仅在断路器上出现,服务的监控、认证、授权、安全、负载均衡等都有可能面临细化管理的需求,譬如服务调用时的负载均衡,往往需要根据流量特征,调整负载均衡的层次、算法,等等,而 DNS 尽管能实现一定程度的负载均衡,但通常并不能满足这些额外的需求。

    为了解决这一类问题,虚拟化的基础设施很快完成了第二次进化,引入了今天被称为“服务网格”(Service Mesh)的“边车代理模式”(Sidecar Proxy),如图 1-5 所示。所谓的“边车”是一种带垮斗的三轮摩托,我小时候还算常见,现在基本就只在影视剧中才会看到了。这个场景里指的具体含义是由系统自动在服务容器(通常是指 Kubernetes 的 Pod)中注入一个通信代理服务器,相当于那个挎斗,以类似网络安全里中间人攻击的方式进行流量劫持,在应用毫无感知的情况下,悄然接管应用所有对外通信。这个代理除了实现正常的服务间通信外(称为数据平面通信),还接收来自控制器的指令(称为控制平面通信),根据控制平面中的配置,对数据平面通信的内容进行分析处理,以实现熔断、认证、度量、监控、负载均衡等各种附加功能。这样便实现了既不需要在应用层面加入额外的处理代码,也提供了几乎不亚于程序代码的精细管理能力。

img

图 1-5 边车代理流量示意
图来自 Istio 的配置文档,图中的 Mixer 在 Istio 1.5 之后已经取消,这里仅作示意

    很难从概念上判定清楚一个与应用系统运行于同一资源容器之内的代理服务到底应该算软件还是算基础设施,但它对应用是透明的,不需要改动任何软件代码就可以实现服务治理,这便足够了。服务网格在 2018 年才火起来,今天它仍然是个新潮的概念,仍然未完全成熟,甚至连 Kubernetes 也还算是个新生事物。但笔者相信,未来 Kubernetes 将会成为服务器端标准的运行环境,如同现在 Linux 系统;服务网格将会成为微服务之间通信交互的主流模式,把“选择什么通信协议”、“怎样调度流量”、“如何认证授权”之类的技术问题隔离于程序代码之外,取代今天 Spring Cloud 全家桶中大部分组件的功能,微服务只需要考虑业务本身的逻辑,这才是最理想的Smart Endpoints解决方案。

为了解决这一类问题,虚拟化的基础设施很快完成了第二次进化,引入了今天被称为“服务网格”(Service Mesh)的“边车代理模式”(Sidecar Proxy) 什么问题呢? 基础设施不好解决, 得由应用层面来解决, 但是又不想影响应用层面的逻辑("高内聚,低耦合") .

第一代 Service Mesh

第一代Service Mesh由一系列独立运行的单机代理服务构成.
img

(整体图有点像出租屋)

img

第二代 Service Mesh

第一代Service Mesh由一系列独立运行的单机代理服务构成,为了提供统一的上层运维入口,演化出了集中式的控制面板,所有的单机代理组件通过和控制面板交互进行网络拓扑策略的更新和单机数据的汇报。这就是以Istio为代表的第二代Service Mesh。

img

img

看一下 Istio 的介绍
img

总结

本片整理了应用架构变迁的过程 : 单体 -> SOA -> 微服务 -> 后微服务 (云原生) , 理解这些感觉要从动机出发去理解 .明白了各种模式解决了哪些痛点.

参考资料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章