后端架构 演进过程
架构的发展并非一蹴而就,本文将根据时间线梳理后端架构的演进。
一、原始分布式
“使用多个独立的分布式服务共同构建一个更大型系统” 的设想和尝试,比大型单体系统来得更早。
在微型计算机(下文简称为计算机)发展初期,由于运算处理能力的限制,单台计算机难以满足大型系统的运行需求。为了克服硬件的限制,人们开始探索采用多台计算机共同协作的方案。
这一阶段是对分布式架构的最原始的探索。尽管从结果来看,它并没有解决分布式的各种难题,但这一探索过程为后续的技术发展奠定了基础。
这次尝试最大的收获就是对 RPC、DFS 等概念的开创,以及得到了一个价值千金的教训:某个功能能够进行分布式,并不意味着它就应该进行分布式,强行追求透明的分布式操作,只会自寻苦果。
—— Kyle Brown,IBM Fellow
二、单体架构
随着计算机的发展,摩尔定律稳定发挥作用,计算机的性能以每两年增长一倍的速度提升。很快,仅需一台计算机即可支撑大型系统,单体架构开始占据主流。
单体架构具有以下特点:
- 优点:
- 便于开发、测试、部署
- 与 IPC(InterProcess Communication,进程间通信)、RPC(Remote Procedure Call,远程过程调用)相比,系统中的相互调用都是进程内调用,运行效率更高
- 缺点:
- 对代码的拆分(分层、分模块)只能实现开发时的隔离,无法实现运行时的隔离,所有的代码都运行在同一个进程中,可能因某个 Bug 导致整个系统的全面崩溃
- 整个系统一同部署,无法做到针对某一模块的单独更新
- 难以实现技术异构,要求系统中的每个模块均使用相同的语言甚至技术栈
三、微服务
在微服务架构下,一个大型系统将由若干个小型服务组成。这些小型服务基于业务划分,可以独立开发、测试、部署。
微服务架构具有以下特点:
- 优点:
- 服务独立自治,加上熔断降级等运维手段,不会 “一崩皆崩”,可以保证整个系统的高可用
- 各服务可以选择不同的技术栈
- 可以根据服务的特点、重要程度、运行压力,更精准地分配计算资源
- 缺点:
- 服务治理、负载均衡、RPC、配置中心、服务容错、链路追踪、网关等问题并没有被广泛认可的解决方案,尽管 Spring Cloud 通过统一的接口屏蔽了不同组件的差异,使得普通开发者无需关心具体组件,但架构师在技术选型时需要投入较大的时间精力
四、后微服务(云原生)
在微服务架构中,我们会引入大量的组件,包括:Spring Cloud Nacos、 Spring Cloud Gateway、Spring Cloud LoadBalancer 等,这些组件都是为了解决微服务问题而存在。针对这些问题,之所以选择在应用层而非基建层解决,是因为基建的发展速度相对较慢,无法满足需求。
随着以 Kubernetes 为代表的容器编排技术的发展,微服务问题在基建层面有了可行的解决方案,如下:
Kubernetes | Spring Cloud | |
---|---|---|
弹性伸缩 | Autoscaling | |
服务发现 | KubeDNS / CoreDNS | Spring Cloud Nacos |
配置中心 | ConfigMap / Secret | Spring Cloud Nacos |
服务网关 | Ingress Controller | Spring Cloud Gateway |
负载均衡 | Load Balancer | Spring Cloud LoadBalancer |
服务安全 | RBAC API | Spring Cloud Security |
跟踪监控 | Metrics API / Dashboard | Spring Cloud Sentinel |
降级熔断 | Spring Cloud Sentinel |
在此背景下,后微服务(云原生)架构应运而生。应用层无需再过多关注微服务治理,而是将更多精力集中在业务本身;服务部署在 Kubernetes 之上,借助容器编排技术对微服务进行治理。
需要注意的是,Kubernetes 并非针对微服务而生,在微服务治理上,与微服务组件相比,它的能力存在缺失和倒退。
例如:
- 并不支持降级熔断
- 只支持简单负载均衡,无法支持复杂规则
五、服务网格(Service Mesh)
一方面,我们不希望在应用层中保留微服务组件;另一方面,后微服务(云原生)架构的微服务治理能力难以满足要求。在这种背景下,服务网格(Service Mesh)架构开始出现。
服务网格本质上是边车代理模式(Sidecar),它以流量劫持的方式,为服务间通信额外增加连接稳定性、安全性、可管理性和可观测性。具体来说:
- Pod 中会被自动注入一个额外的网络代理服务器,它会以类似中间人攻击的方式进行流量劫持,在服务无感知的情况下接管通信
- 网络代理服务器会与控制器进行通信(Control plane tra),以接受指令、上报数据
- 网络代理服务器会接管服务间通信(Data plane traffic,数据平面通信),以实现微服务治理
五、无服务(Serverless)
随着云计算技术和云计算平台的发展,Serverless 出现。
Serverless 由云计算平台提供,无需考虑部署、运维等问题。
可以将 Serverless 看作一个 “无限性能” 的服务器,因此,不再需要考虑分布式架构,只需要通过这个 “无限性能” 的服务器就可以支撑起大型系统。
但是,代码的书写方式发生改变,从传统的单体架构变为分散的函数