架构初探 | 青训营笔记

120 阅读8分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天。

前言

本节课将以实际案例切入,深入浅出,帮助同学理解软件架构的定义及形态。 之后将立足于企业视角,通过生动的案例讲解目前架构在企业的具体实践及其应用。 面对日新月异的技术环境,实际工作中的后端研发也面临着更多挑战,最后将从基础设施及用户层面展开,分析目前企业的后端架构所面临的难题。

架构

什么是架构--定义

架构,又称软件架构,是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。

Q: 定义还是太抽象,能不能再通俗一点?

  • 实现一个软件有很多种方法,架构在方法选择上起着至关重要的指导作用。

Q:架构的重要性?

  • 地基没打好,大厦容易倒
  • 地基坚实了,大厦才能盖得高
  • 站在巨人肩膀上,才能看得远

什么是架构--单机

软件系统需要具备对外提供服务,单机,就是把所有功能都实现在一个进程里,并部署在一台机器上。

问题

C10K problem,也即单机处理10k个并发连接的问题。随着epoll、kqueue 等技术的不断发展,高性能网络编程逐渐回答了C10K问题。但在互联网飞速发展的今天,我们正陆续面临C10M、C10B 等问题。也就是说,单体服务一定是有架构瓶颈的。

运维需要停服。任何运维操作都需要停服,因为只有一个单体服务,有用户使用的时间点没有办法运维。

单机服务的模式,除了简单之外没有任何优点。当今互联网时代,单机服务的形态一般只适合出现在预研或初创阶段,但凡业务有发展和迭代的诉求,就应该快速做架构迭代。

什么是架构--单体、垂直应用|垂直切分

  • 单体架构:分布式部署

  • 垂直应用架构:按应用垂直切分的单体

优点: 水平扩容;运维不需要停服

问题: 职责太多,开发效率不高;爆炸半径大

这种经过垂直切分的架构,尝试解决了单机服务的水平扩容、运维停服问题。当然这里面很多细节还没有提及,比如,多个机器上部署的进程如何保证数据致性。 虽然它们解决了单机服务的两个最重要的问题,但也面临着很多挑战。这其中,有两个问题使得我们不得不放弃单体和垂直应用架构:

  1. 随着业务场景越来越复杂,服务的职责也越来越多。学过面向对象程序设计的同学都知道单一职责的重要性,在软件架构里也是一样的。 开发者不仅要关心Web后端业务逻辑,还要关心缓存、持久化存储,甚至跟机器打交道。长此以往,RD很难分出精力专注于业务能力的开发

  2. 业务发展需要上线、变更,将会影响所有其他不涉及的场景。一旦出问题,影响面不可估量

什么是架构--SOA、微服务|水平切分

SOA (Service-0riented Architecture)

  1. 将应用的不同功能单元抽象为服务

  2. 定义服务之间的通信标准

这里有两个相对比较重要的概念:

  • 服务,是根据功能抽象出来的概念。比如说,处理用户登录信息的Passport服务,负责持久化存储的数据库服务,以及为了加快查询速度的缓存服务等
  • 通信标准,是服务之间通信的基石。没有实现定义好的通信标准,就好比多个做蛋糕的师傅语言不通,难以协作

为了服务之间更好的通信,有两个大的发展方向: 中心化和去中心化。因为中心化的方案形态较重,拓展性不佳,普及性不佳,我们跳过不讲,感兴趣的同学可以自己了解一下。而去中心化的方向,最终的形态就是微服务架构。

这下,

  1. 不同模块的RD可以专心于自己的业务逻辑了,开发迭代效率得到显著提高
  2. 各个服务独立运维,变更操作的影响面可控,应用整体的稳定性得到了提高

最后,我们还需要回答垂直切分和水平切分所产生的一系列问题:

  • 由单机部署演进来的分布式架构,如何解决数据致性
  • 服务越来越多,依赖越来越复杂,如何做到高可用
  • 一个团队甚至一个人可能同时管理多个微服务,如何运维 微服务的目标是强化单一职责,控制爆炸半径,如何在解耦和过微之间取舍

企业级后端架构剖析

云计算

云计算: 是指通过软件自动化管理,提供计算资源的服务网络,是现代互联网大规模数据分析和存储的基石。

基础:

  1. 虚拟化技术:硬件(虚拟机)、操作系统(容器)、网络
  2. 编排方案:虚拟机编排方案(OpenStack) 、容器编排方案(Kubernetes)

架构:

  1. laaS (Infrastructure as a Service)
  • 买房子vs房屋租赁平台
  1. PaaS (Platform as a Service)
  • 清包vs全包
  1. SaaS (Software as a Service)
  • 从零培训vs雇佣培训过的师傅
  1. FaaS (Funct ion as a Service)
  • 纯手工制作vs蛋糕机批量生产

云原生

聊完云计算,有必要马上来看一下云原生。 云原生,实际是云原生(计算) 的简称,它是元计算发展到现在的一种形态。

云原生技术为组织(公司)在公有云、自由云、混合云等新型的动态环境中,构建和运行可弹性拓展的应用提供了可能。它的代表技术有: 容器化、服务网格、微服务、不可变基础架构、声明式API等。

云原生主要涉及四个大方面:

  • 弹性资源:基于虚拟化容器以及灵活的编排调度机制,可以为云服务提供快速扩缩容能力,而且极大程度地提高了物理资源的利用率。在这方面,kubernetes 技术已经成为了业界的标准
  • 微服务架构:还记得前面我们聊到的微服务架构么?没错,它也是云原生的重要基石之一。依托于功能单元结构,使得云服务具备了快速迭代的可能,业务得以迅速发展:统一的通信标准能够帮助越来越多的组件加入到云原生的大家庭,同时也使得各组件之间的交互变的更容易
  • DevOps:设计- >开发- >测试- >交付- >开发- >测试- >交付,自动化的流程使得软件的工作流程更高效,将微服务架构的优势发挥的淋漓尽致
  • 服务网格:如果说微服务架构的重要进步,是将庞大的单体服务按照业务功能解耦开来,那么,服务网格的重要进步就是将业务逻辑与网络通信和治理解耦开来。业务不再需要关心异构系统中RPC中间件治理能力的不统一,也使得复杂的治理能力的落地成为可能

企业级后端架构的挑战

离线在线资源并池

image.png

核心收益:

  • 降低物理资源成本
  • 提供更多的弹性资源,增加收入

解决思路: 离在线资源并池

在线业务的特点: IO密集型为主; 潮汐性、实时性

离线业务的特点: 计算密集型占多数; 非实时性

自动扩缩容

image.png

核心收益: 降低业务成本

解决思路: 自动扩缩容; 利用在线业务潮汐性自动扩缩容

微服务亲合性部署

image.png

核心收益: 降低业务成本; 提高服务可用性

解决思路: 微服务亲合性部署

  • 将满足亲合性条件的容器调度到一台宿主机
  • 微服务中间件与服务网格通过共享内存通信
  • 服务网格控制面实施灵活、动态的流量调度

流量治理

核心收益:

  • 提高微服务调用容错性
  • 容灾
  • 进一步提高开发效率,DevOps 发挥到极致

解决思路: 基于微服务中间件&服务网格的流治理

  • 熔断、重试
  • 单元化
  • 复杂环境(功能、预览)的流量调度

引用参考

  1. 字节跳动内部课程

  2. C10K 问题