这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记
架构是什么
架构,又称软件架构
- 是有关软件整体结构与组件的抽象描述
- 用于指导软件系统各个方面的设计
为什么需要架构
- 需求量越来越大,需要更多人手完成任务
- 业务场景越来越复杂,需要分工配合
架构演进
单机架构
单机架构即把所有的功能都实现在一个进程里,并部署在一台机器上。
单机架构优点是简单,但是会带来很多问题
一个很经典的问题就是 C10K 问题,即单机处理 10K 个并发连接问题。随着epoll,kqueue等技术的不断发展,高性能网络编程逐渐回答了C10K问题,但我们一定要明白,单体服务一定是有架构瓶颈的。
另外一个问题是运维需要停服。只有一个单体服务,有用户使用的时间点没有办法运维。
单体、垂直应用 | 垂直切分
面对单机架构的问题,我们可以考虑将服务进行垂直切分,将不同服务进行分割并部署在多个机器上,并引人负载均衡。
什么是垂直切分呢,例如蛋糕店,单机架构就是一个蛋糕师父负责所有的蛋糕制作,垂直应用架构则是不同蛋糕师父负责一种蛋糕的制作。
优点:
- 水平扩容
- 运维不需要停服
虽然单体和垂直应用架构有一些优点,但是还是会有很多问题:
随着业务场景越来越复杂,服务的职责也越来越多。开发者不仅要关心Web后端业务逻辑,还要关系缓存、持久化存储。这样很难进行业务逻辑的开发。简单来说,就是职责划分不明显。
SOA、微服务 | 水平切分
SOA
SOA(Service Oriented Architecture)面向服务架构,有两个特点
- 将应用的不同功能单元抽象为服务
- 定义服务之间的通信标准
SOA需要一个统一的服务治理和服务发现平台管理每个服务的运行。能够带来一些优点:
- 提高开发效率
- 降低系统耦合
- 易于扩展
虽然SOA架构对应用的功能做了一定的分割,但还是会有很多功能的耦合,同时因为SOA需要有一个中心化的管理平台,这不能保证服务的高可用性。
微服务
微服务架构,即SOA的去中心化演进
微服务架构在SOA的基础上进行了去中心化演进,使得提高了服务的可用性也保留了SOA架构的一些优点
但还是带来很多问题:
- 开发人员需要面对分布式系统的复杂性。使得测试更为困难、需要保证服务通信、需要分布式的事务管理等
- 部署比较复杂
- 增大内存开销
企业级后端架构
云计算
云计算:是指通过软件自动化管理,提供计算资源的服务网络,是现代互联网大规模分析和存储的基石
基础:
-
虚拟化技术
- 硬件层面(VM虚拟机): KVM 、 Xen 、 VMware
- 操作系统层面(Container容器): LCX 、 Docker 、 Kata Container
- 网络层面 : Linux Bridge 、 Open v Switch
-
编排方案
- 虚拟机编排方案:OpenStack
- 容器编排方案:Kubernetes
云计算架构:
- laaS (lnfrastructure as a Service) 基础设施即服务,即底层的基础设施资源
- PaaS (Platfrom as a Service) 平台即服务,处于中间层,提供基础设施底层服务,类似于操作系统
- SaaS (Software as a Service) 软件即服务,处于最上层的基于软件的服务,用于满足客户需求
- FaaS (Function as a Service)函数即服务,即提供平台,允许客户开发、运行和管理应用程序功能,而无需构建和维护程序相关的基础架构的复杂性。
云原生
云原生,实际是云原生(计算)的简称,它是元计算发展到现在的一种形态。
云原生技术为组织(公司)在公有云、自由云、混合云等新型的动态环境中,构建和运行可弹性拓展的应用提供了可能。 它的代表技术:
云原生,实际是云原生(计算)的简称,它是元计算发展到现在的一种形态。
云原生技术为组织(公司)在公有云、自由云、混合云等新型的动态环境中,构建和运行可弹性拓展的应用提供了可能。 它的代表技术:
- 弹性资源
弹性资源是基于虚拟化容器以及灵活的编排调度机制,可以为云服务提供快速扩容缩容能力,而且极大程序地提高了物理资源的利用率
- 微服务架构
微服务架构依托于功能单元解构,使得云服务具备了快速迭代的功能,业务得以迅速发展;统一的通信标准能够帮助更多组件加入云原生,也使得各组件之间交互变得更容易
- DevOps
DevOps是一组过程、方法与系统的统称,用于促进开发。表现为:设计 -> 开发 -> 测试 -> 交付 -> 开发 -> 测试 -> 交付,这套自动化的流程使得软件工作更为高效
- 服务网格
服务网络将业务逻辑与网络通信和治理解耦开来。业务不再需要关心异构系统中RPC中间件治理能力的不统—,也使得复杂的治理能力的落地成为可能
弹性资源
基于虚拟化技术,提供的可以快速扩缩容的能力。可以分为弹性计算资源和弹性存储资源。
弹性计算资源
弹性计算资源类型:
- 在线计算 - Spark Stream
- 离线计算 - MapReduce 消息队列
- 在线队列 :作用是削峰、解耦
- 离线队列:结合数据分析的方案,如ELK
弹性存储资源
-
经典存储
- 对象存储 :视频、图片等
- 大数据存储:应用日志、用户数据等
-
关系型存储
-
元数据
-
NoSQL
- KV存储 : 如Redis
- 文档存储 : 如MongoDB
服务架构
通信标准:
- HTTP - (RESful API)
- RPC - (Thrift , gRPC)
如何在 HTTP 和 RPC 之间选择?
-
性能 - RPC 协议往往具备较好的压缩率,性能较高。如 Thrift, Protocol Buffers
-
服务治理 - RPC 中间件往往集成了丰富的服务治理能力。如 熔断、降级、超时等
-
可解释性 - HTTP 通信的协议往往首选 JSON,可解释性、可调试性更好
DevOps
DevOps是云原生时代软件交付的方法,贯穿整个软件开发周期
服务网络
服务网络是:
-
微服务之间通讯的中间层
-
一个高性能的 4 层网络代理
-
将流量层面的逻辑与业务进程解耦
没有什么是加一层代理解决不了的问题,服务网格相比较于 RPC/HTTP 框架:
-
实现了异构系统治理体验的统一化
-
服务网格的数据平面代理与业务进程采取进程间通信的模式,使得流量相关的逻辑(包含治理)与业务进程解耦,生命周期也更容易管理