这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天。
前言
本节课将以实际案例切入,深入浅出,帮助同学理解软件架构的定义及形态。 之后将立足于企业视角,通过生动的案例讲解目前架构在企业的具体实践及其应用。 面对日新月异的技术环境,实际工作中的后端研发也面临着更多挑战,最后将从基础设施及用户层面展开,分析目前企业的后端架构所面临的难题。
架构
什么是架构--定义
架构,又称软件架构,是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。
Q: 定义还是太抽象,能不能再通俗一点?
- 实现一个软件有很多种方法,架构在方法选择上起着至关重要的指导作用。
Q:架构的重要性?
- 地基没打好,大厦容易倒
- 地基坚实了,大厦才能盖得高
- 站在巨人肩膀上,才能看得远
什么是架构--单机
软件系统需要具备对外提供服务,单机,就是把所有功能都实现在一个进程里,并部署在一台机器上。
问题
C10K problem,也即单机处理10k个并发连接的问题。随着epoll、kqueue 等技术的不断发展,高性能网络编程逐渐回答了C10K问题。但在互联网飞速发展的今天,我们正陆续面临C10M、C10B 等问题。也就是说,单体服务一定是有架构瓶颈的。
运维需要停服。任何运维操作都需要停服,因为只有一个单体服务,有用户使用的时间点没有办法运维。
单机服务的模式,除了简单之外没有任何优点。当今互联网时代,单机服务的形态一般只适合出现在预研或初创阶段,但凡业务有发展和迭代的诉求,就应该快速做架构迭代。
什么是架构--单体、垂直应用|垂直切分
-
单体架构:分布式部署
-
垂直应用架构:按应用垂直切分的单体
优点:
水平扩容;运维不需要停服
问题:
职责太多,开发效率不高;爆炸半径大
这种经过垂直切分的架构,尝试解决了单机服务的水平扩容、运维停服问题。当然这里面很多细节还没有提及,比如,多个机器上部署的进程如何保证数据致性。 虽然它们解决了单机服务的两个最重要的问题,但也面临着很多挑战。这其中,有两个问题使得我们不得不放弃单体和垂直应用架构:
-
随着业务场景越来越复杂,服务的职责也越来越多。学过面向对象程序设计的同学都知道单一职责的重要性,在软件架构里也是一样的。 开发者不仅要关心Web后端业务逻辑,还要关心缓存、持久化存储,甚至跟机器打交道。长此以往,RD很难分出精力专注于业务能力的开发
-
业务发展需要上线、变更,将会影响所有其他不涉及的场景。一旦出问题,影响面不可估量
什么是架构--SOA、微服务|水平切分
SOA (Service-0riented Architecture)
-
将应用的不同功能单元抽象为服务
-
定义服务之间的通信标准
这里有两个相对比较重要的概念:
- 服务,是根据功能抽象出来的概念。比如说,处理用户登录信息的Passport服务,负责持久化存储的数据库服务,以及为了加快查询速度的缓存服务等
- 通信标准,是服务之间通信的基石。没有实现定义好的通信标准,就好比多个做蛋糕的师傅语言不通,难以协作
为了服务之间更好的通信,有两个大的发展方向: 中心化和去中心化。因为中心化的方案形态较重,拓展性不佳,普及性不佳,我们跳过不讲,感兴趣的同学可以自己了解一下。而去中心化的方向,最终的形态就是微服务架构。
这下,
- 不同模块的RD可以专心于自己的业务逻辑了,开发迭代效率得到显著提高
- 各个服务独立运维,变更操作的影响面可控,应用整体的稳定性得到了提高
最后,我们还需要回答垂直切分和水平切分所产生的一系列问题:
- 由单机部署演进来的分布式架构,如何解决数据致性
- 服务越来越多,依赖越来越复杂,如何做到高可用
- 一个团队甚至一个人可能同时管理多个微服务,如何运维 微服务的目标是强化单一职责,控制爆炸半径,如何在解耦和过微之间取舍
企业级后端架构剖析
云计算
云计算: 是指通过软件自动化管理,提供计算资源的服务网络,是现代互联网大规模数据分析和存储的基石。
基础:
- 虚拟化技术:硬件(虚拟机)、操作系统(容器)、网络
- 编排方案:虚拟机编排方案(OpenStack) 、容器编排方案(Kubernetes)
架构:
- laaS (Infrastructure as a Service)
- 买房子vs房屋租赁平台
- PaaS (Platform as a Service)
- 清包vs全包
- SaaS (Software as a Service)
- 从零培训vs雇佣培训过的师傅
- FaaS (Funct ion as a Service)
- 纯手工制作vs蛋糕机批量生产
云原生
聊完云计算,有必要马上来看一下云原生。 云原生,实际是云原生(计算) 的简称,它是元计算发展到现在的一种形态。
云原生技术为组织(公司)在公有云、自由云、混合云等新型的动态环境中,构建和运行可弹性拓展的应用提供了可能。它的代表技术有: 容器化、服务网格、微服务、不可变基础架构、声明式API等。
云原生主要涉及四个大方面:
- 弹性资源:基于虚拟化容器以及灵活的编排调度机制,可以为云服务提供快速扩缩容能力,而且极大程度地提高了物理资源的利用率。在这方面,kubernetes 技术已经成为了业界的标准
- 微服务架构:还记得前面我们聊到的微服务架构么?没错,它也是云原生的重要基石之一。依托于功能单元结构,使得云服务具备了快速迭代的可能,业务得以迅速发展:统一的通信标准能够帮助越来越多的组件加入到云原生的大家庭,同时也使得各组件之间的交互变的更容易
- DevOps:设计- >开发- >测试- >交付- >开发- >测试- >交付,自动化的流程使得软件的工作流程更高效,将微服务架构的优势发挥的淋漓尽致
- 服务网格:如果说微服务架构的重要进步,是将庞大的单体服务按照业务功能解耦开来,那么,服务网格的重要进步就是将业务逻辑与网络通信和治理解耦开来。业务不再需要关心异构系统中RPC中间件治理能力的不统一,也使得复杂的治理能力的落地成为可能
企业级后端架构的挑战
离线在线资源并池
核心收益:
- 降低物理资源成本
- 提供更多的弹性资源,增加收入
解决思路: 离在线资源并池
在线业务的特点: IO密集型为主; 潮汐性、实时性
离线业务的特点: 计算密集型占多数; 非实时性
自动扩缩容
核心收益: 降低业务成本
解决思路: 自动扩缩容; 利用在线业务潮汐性自动扩缩容
微服务亲合性部署
核心收益: 降低业务成本; 提高服务可用性
解决思路: 微服务亲合性部署
- 将满足亲合性条件的容器调度到一台宿主机
- 微服务中间件与服务网格通过共享内存通信
- 服务网格控制面实施灵活、动态的流量调度
流量治理
核心收益:
- 提高微服务调用容错性
- 容灾
- 进一步提高开发效率,DevOps 发挥到极致
解决思路: 基于微服务中间件&服务网格的流治理
- 熔断、重试
- 单元化
- 复杂环境(功能、预览)的流量调度