第一章 概述与基本概念

1.1 概述

服务端架构多种多样,选择合适的后端架构能够在满足任务要求的情况下节省大量的资源

1.2 基本概念和约定

  1. Tomcat和Nginx

    Tomcat 是一个免费的开放源代码的Web 应用服务器,其上可部署前端和后端应用服务,虽然不严谨,但是下文均以Tomcat代指Web应用

    Nginx是一个 轻量级/高性能的反向代理Web服务器,以下均用Nginx代指反向代理服务器

  2. 并发

    一个时间段中有多个程序都处于已启动运行到运行完毕之间,即多个线程操作同一个对象,或者说多个人(访问请求)同时与一个人(服务器)说话

  3. 分布式

    分布式就是将一个复杂的业务系统,拆分成多个子业务系统,部署在不同的服务器上面,通过交换信息协作共同完成一个业务

  4. 高可用

    系统中的部分节点(功能)失效时,其他的节点能够代替失效的节点提供服务

  5. 集群运算

    集群就是同一个子业务系统复制成多份,每一个副本作为一个节点,将其分别部署在多台服务器上作为一个整体提供服务,这个整体(群体的集合)叫做集群,使用时客户端往往能够连接任X意一个节点获得服务。如果集群中的某一个节点掉线,其他的节点能够自动接替他继续提供服务(集群具有高可用性)

  6. 均衡负载

    系统能够将收到的大量请求均匀分发到不同的节点来处理,使得各个节点的处理压力较为平均

  7. 正向代理

发送的请求直接到达目标服务器

  1. 反向代理

外部请求统一被均衡负载服务器接收,如Nginx反向代理服务器接收到之后,按照一定的规则分发给业务处理服务器进行处理

第二章 架构介绍

2.1 单机架构

项目整体(Tomcat、数据库)在同一台服务器上

  • 优点:成本低廉,配置简单
  • 缺点:只能应对小数据量请求

Tomcat的并发能力默认只有150,通过提高服务器配置可以提高最大并发能力,但是最高也不过1K左右

不同的数据库系统有不同的并发能力,不做赘述

2.2 数据库分离

为了避免数据库系统与Tomcat竞争资源,将其分开部署在不同的服务器上

  • 优点:Tomcat和数据库系统各自独占一台服务器的资源,有较高的性能

此时实现了简单的分布式系统

2.3 缓存引入

虽然数据库和Tomcat本身的资源竞争问题得到了解决,但是随着并发访问量的提高,数据库的读写性能逐渐成为制约系统性能的瓶颈

在Tomcat服务器或Tomcat运行的JVM(Java Virtual Machine)中添加缓存,更进一步在服务器外部增加分布式缓存。将经常访问的数据写在缓存中,从而能够大幅度降低数据库的处理压力。

但是实际应用中通常使用Redis来处理缓存问题,因为Redis的缓存数据在内存中,普通数据库的数据存储在磁盘中,访问内存的速度比访问磁盘快很多

  • 优点:大幅低降低了数据库的处理压力,再一次提高了并发能力
  • 缺点:部署和配置较为复杂,面临的问题更多,如一致性问题、缓存雪崩、数据失效等问题

2.4 引入反向代理

虽然经过层层处理较大程度地提高了系统的并发能力,但此时整个系统仍然由部署在单个服务器上的Tomcat和数据库承担全部的处理任务。由于缓存的引入减轻了数据库方面的压力,所以随着并发访问量的进一步提升,压力点又落到了Tomcat身上。

此时单机的性能已不足以应对需求,需要引入反向代理(请求分发)软件

常用的有Nginx。
Nginx是一个 轻量级/高性能的反向代理Web服务器,一个Nginx服务器可以承载2-3万的并发连接数

该架构将Tomcat从单机环境变为多机环境,即将Tomcat部署到多个服务器上使它们共享一个缓存和数据库环境。人工按照每台服务器的性能和业务需求分配权值,外部访问请求通过反向代理软件(Nginx)将外部的请求发放到各个Tomcat服务器上从而实现负载均衡

  • 优点:避免了单个Tomcat服务器带来的性能瓶颈稳定性问题,此时系统已经能应对万级并发
  • 缺点:成本和复杂性进一步提高

此时Tomcat实现了简单的集群架构

2.5 数据库读写分离

解决了Tomcat的瓶颈问题后压力又来到了数据库方面(doge)

读写分离是指将数据库分为读库和写库,通过同步机制把写库的数据同步到读库。如果需要即时查询,可以把数据写入写库的同时在缓存中也写一份。

常用数据库中间件(中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务,衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。)来处理这个问题。

例如Mycat,可以用来组织数据库的分离读写和库表

优点:略
缺点:数据同步较为繁复

注意:数据实时性要求比较高的场景下不推荐使用

2.5.1 按功能模块拆分数据库或数据库表

  1. 拆分服务:不同服务(功能模块)之间数据库占用情况不同,会影响整体的数据库性能,因此可以给不同的服务分别创建自己的数据库。进一步,可以给不同的服务分出读库和写库。
  2. 拆表:分为水平分表和垂直分表具体情况具体分析

优点:暂时性解决了数据库的瓶颈问题
缺点:
1. 显著增加了数据库的维护难度,对DBA(Database Administrator 数据库管理员)的要求较高
2. 跨业务的表无法直接关联

此时数据库可以称之为MPP(大规模并行处理)架构,或者说是血统不纯的分布式架构

2.6 引入均衡负载集群或硬件进行负载均衡

不能多层Nginx套娃,因为不论如何部署,都会有最上层的单个Nginx服务器承载全部外部的请求分发压力。

常用使用LVS和F5为代表的均衡负载解决方案

LVS(Linux Virtual Server)Linux虚拟服务器,是一个虚拟的服务器集群系统,可以对TCP请求和更高级的网络协议进行转发,支持的网络协议更多,性能也远高于Nginx。

F5,是一种均衡负载硬件,其性能比LVS更高,但是价格一般在几千到几十万不等。(略)

注意:此时的Tomcat一般会被分组,按组连接不同的Nginx服务器,这样可以显著提高Tomcat的数量

优点:略
缺点:
LVS:因为是虚拟出来的服务器集群,本质上还是单机系统,因此风险较高,一般会与多个备份一起使用
F5:贵

此时可承载的并发数量达到几十万,Web服务的用户可以达到上亿级别,并且此时项目一般会部署在不同地区的机房内以提高不同地区用户的使用体验

2.7 以数据类型拆分数据库

现在压力又重新回到了数据库身上,当数据库中的数据量到达了一定的量级,普通数据库系统的查询能力会逐渐到达瓶颈。根据不同的数据类型可以使用不同的解决方案。

  • 文件数据:使用分布式文件系统如HDFS
  • 对于键值对数据:使用HBase或Redis

2.8 功能拆分实现微服务和分布式架构

将整个系统按照不同的功能拆分成单独的模块,不同的模块可以使用上述的各种方案来进行部署,实现分布式架构。应用之间涉及到的公共配置可以使用分布式配置中心Zookeeper配置。

由于各功能模块间可能存在公共的细分功能,为了解除耦合和简化更新步骤,可以将这些公共的细分功能进一步拆除出来形成微服务。

服务和模块之间通过HTTP或TCP请求通信

优点:略
缺点:

  1. 对项目逻辑功能设计和开发规范要求较高,稍有不慎便会造成逻辑混乱,增加维护难度和程序员血压。
  2. 显著提高了运维难度
  3. 扩展性变差,新增节点的部署难度增加

2.8.1 容器化、SOA架构

  • 容器化:
    容器化是指将项目各种服务和功能模块打包成容器的镜像(可以理解为安装文件)。使用该技术可以一定程度上降低运维难度,例如要新增节点的话,仅需在服务器上准备容器的运行环境,然后将打包好的项目运行在容器中即可

    常用的容器化技术:Docker
    常用的容器管理服务:K8S

  • SOA架构:
    SOA又叫做面向服务架构,其目的是将拆分后的各服务接口统一,方便开后期维护和系统升级

总结:
实际开发中要依据实际选择架构,按需选择,不能为了提高并发而提高并发