系统架构学习笔记-从零开始学架构

Telent系统架构学习系统架构学习大约 12 分钟

系统架构学习笔记-从零开始学架构

学习链接

https://www.bilibili.com/video/BV1kp4y1x7Adopen in new window

课程介绍

什么是架构

  • 是有关软件整体架构与组件的抽象描述,用于指导大型软件系统各个方面的设计
  • 优秀的性能、超强 TPS/QPS 的承载能力、高可用
  • Balance,选择一个投入产出比最优的方案

架构师的职责

  1. 明确需求
  2. 系统能力分解
  3. 技术选型
  4. 制定架构说明书并主导执行落地

架构师成长路径

  • 初级工程师:编写代码,运用框架
  • 中级工程师:编写代码和框架
  • 高级工程师:技术攻关,性能优化
  • 系统架构师:解决所有业务和技术问题

架构师必备能力

  1. 设计能力
  2. 管理能力
  3. 技术能力
  4. 沟通能力
  5. 应急能力
  6. 抽象能力

架构设计分层实现

分层模型演进

  • 分层模型 v0.1 时代-Servlet JSP 时代
    1. Selvet + Tomcat 容器完成 web 接入
    2. 使用 JavaBean + JDBC 完成数据层接入
    3. 使用 JSP 完成页面展示
  • 分层模型 v1.0 时代-SSH 时代
    1. Struct 解决接入及表示层
    2. Spring 解决业务服务、事务处理、会话管理等问题
    3. Hibernate 解决数据存储接入问题
  • 分层模型 v1.5 时代-SSM 时代
    1. SpringMVC 解决接入及表示层
    2. Spring 解决业务服务、事务处理、会话管理等问题
    3. MyBatis 解决数据接入层
  • 分层模型 v2.0 时代-SpringBoot all in one
    1. 整合了所有 Spring 的框架功能
    2. 提供了简单的配置及注解的接入方式
    3. 提供 All in one 的服务
  • 分层模型 v2.0 时代-存在问题
    1. 解决了单一应用内的软件分层,却没有解决整体应用的分层
    2. 单一应用性能瓶颈,无法支撑亿级流量
    3. 团队协作的问题
  • 分层模型 v3.0 时代-分布式分层
    1. 水平扩展
    2. 负载均衡
    3. 高可用
    4. 数据一致性
  • 亿级流量平台分层架构
    1. 访问层:用于 Web 接入、反向代理、负载均衡等
    2. 接口层:用于负责业务 API 网关处理
    3. 服务层:业务服务的核心处理模块,具备服务治理、调度、异步通信等核心服务能力
    4. 存储接入层:用于提供透明的存储结构的访问代理层
    5. 存储层:最终数据的落地及提供数据的能力

访问层架构设计-LVS 接入系统

LVS 介绍

LVS 集群采用 IP 负载均衡技术和基于内容请求分发技术,将请求均衡转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能、高可用的虚拟服务器

LVS 三种模式

  • LVS/NAT
  • LVS-DR
  • LVS/TUN

LVS 调度策略

  • 无脑轮询,带权重的无脑轮询
  • 最少链接,带权重的最少链接
  • IP_HASH, IP_HASH_GROUP

LVS 的强大优势

  • IP 层的负载均衡协议,无应用层回调消耗
  • 通过 LVS-DR 或者 LVS/TUN 模型的特性使得请求返回不过 LVS
  • 自动故障转移,心跳检测
  • 配合主从 KeepAlive 加 VIP 实现自身高可用

访问层架构设计-nginx 原理

nginx 职责分类

  • 接入层 nginx
  • 引用层 nginx

nginx 功能

  • 请求解析
  • 负载均衡
  • 缓存调度
  • 授权认证
  • 接入处理
  • 业务逻辑
  • 响应处理
  • 压缩技术
  • ...

接入层 nginx 主要职责

  • 请求解析
  • 请求业务路由
  • 业务负载均衡
  • 响应压缩

应用层 nginx 主要职责

  • 应用负载均衡
  • 缓存调度
  • 授权认证
  • 业务逻辑
  • 业务限流
  • 业务降级

nginx 高性能原因

  • master-worker 进程模型
  • 流式处理请求 workflow,有主次请求
  • 协程机制
  • nginx lua

API 网关层架构设计-分布式会话管理

会话管理

  • 会话管理

    由于 http 请求的无状态性,因此引入 session 会话管理机制,表示 BS 端之间会话状态

  • 分布式会话管理

    区别于传统的依赖 web server session 的会话管理状态,需要引入集中的会话存储容器,用于鉴别分布式状态下的 BS 端之间的会话标识

会话管理模式

  • 基于 server 端的 session 管理方式

    依赖于 webserver 的 session 容器
    cookie 跨域访问问题处理复杂
    浏览器禁用 cookie 问题

  • 基于 cookie 的管理方式

    cookie 跨域访问问题处理复杂
    浏览器禁用 cookie 问题

  • 基于 token 的管理方式

    有效存储 token,保证每次调用都能拿到 token
    需要应用代码处理将 token 加到 heaer 或接口传参内
    不依赖浏览器 cookie 禁用问题,移动 native 应用 hybrid 开发方式支持好

  • 安全问题

    cookie 并非安全,被劫持概率高,xss,csrf 安全攻击等
    token 凭证被劫持,伪造请求
    Https 请求防泄漏
    风控主动请求及过期机制

分布式会话管理

  • 集中式的会话管理,拼争放到 Redis,MemCache,数据库等
  • 重写 session 处理方式

API 网关层架构设计-接入层控制

通过 API 网关接入控制程序入口处需要实现的逻辑,包括身份验证,流量控制,路由服务,记录调试或同级信息等
使用不同接口层的框架的通用 "Filter" 功能实现

身份验证

  1. 通过会话管理获取登录用户凭证
  2. 通过用户拼争获取到用户身份信息
  3. 验证对应的 URL 是否可以被对应身份的用户访问

流量控制

  1. 对应的 URL 的流量是否可以承载,若不能,限流
  2. 对应服务分级的流量是否可以承载,若不能,限流
  3. 对应整个系统的总流量是否可以承载,若不能,限流

路由服务

  1. 根据对应 url 的规则寻找到响应的服务
  2. 判定服务状态,做服务路由调用

调试或统计信息

  1. 切面打印日志调试信息
  2. 切面打印 cat 监控

API 网关层架构设计-服务调用及聚合

API 网关通过了接入层控制并路由后进入核心的服务调用环节,通过对后端服务的调用并聚合服务输出的数据后返回访问层

分类

  • 重接入

    优点:可以灵活的在 web 层处理业务逻辑,聚合服务
    缺点:服务单一性不够,且过度的 web 层业务聚合能力会导致服务不便于管理

  • 轻接入

    优点:服务单一,可提供配置化的接入
    缺点:聚合服务处理不够灵活,需要由 service provider 提供聚合服务能力

核心服务层架构设计之服务通信-微服务

传统服务

  • 传统服务的缺点

    所有服务耦合在一起
    隔离性弱,互相影响
    部署臃肿
    开发维护困难

微服务

微服务是指开发一个单个小型的但有业务功能的服务,每个服务都有自己的处理和轻量通讯机制,可以部署在单个或多个服务器上

  • 微服务的优点

    服务高内聚,低耦合
    隔离性强,不会互相影响
    单独部署
    独立开发

  • 微服务要解决的问题

    服务治理(服务调用通信,健康管理,限流熔断等) 数据一致性 调用性能 研发流程,调试,部署

核心服务层架构设计之服务通信-Dubbo

Dubbo 是用来解决微服务内服务治理问题的轻量级开源 Java RPC 框架

  • 面向接口的远程方法调用
  • 智能容错和负载均衡
  • 服务自动注册和发现

服务治理的功能

  • 服务提供者注册服务
  • 服务消费者获取服务,并通过负载均衡策略选择服务提供者
  • 动态增减服务提供者和服务消费者
  • 服务监控
  • 服务限流
  • 服务降级
  • 高容错
  • 定制化开发

核心服务架构设计-异步消息服务

异步化消息服务

  • 异步化好处

    不会阻塞原来的业务 服务调用之间解耦,无需互相关注感知

  • ActiveMQ

    点对点:发送中,接收者,一对一发送,每个消息都被发送到一个特定的队列,接收者从队列中获取消息,队列保留着消息,直到他们被消费或超时
    发布订阅:客户端将消息发送到主题,消息队列存放主题,订阅者消费主题消息

  • Kafka

    发布订阅:客户端将消息发送到主题,消息队列存放主题,订阅者消费主题消息,消息持久化到队尾,消费者通过客户端指针,吞吐量高

  • RocketMQ

    发布订阅:客户端将消息发送到主题,消息队列存放主题,订阅者消费主题消息,消息队列维护高可用,并支持事务回溯机制

核心服务层架构设计-任务调度

任务调度

  • 任务:Task,需要依靠计算机程序完成的一系列事情
  • 调度:Control,执行控制任务的指挥,触发,规则程序
  • 任务调度:使用一系列的触发规则在特定的时间点指挥计算机完成一系列的事情

应用场景

  • 业务跑批轮训等待处理
  • 失败异常重试
  • 定时处理任务

单机调度方式及实现

  • Timer 定时器机制
  • ScheduledExecutor
  • Quartz

分布式调度方式的实现

  • Quartz 分布式版本
  • Elastic-Job 分片分布式

核心服务层架构设计-池化技术

池化技术

池化技术是用来减少系统消耗,提升系统性能的

  • 对象池:利用复用对象来减少创建对象,垃圾回收的开销。例如线程池
  • 连接池:(数据库连接池、Redis 连接池、HTTP 连接池)通过复用 TCP 连接来减少创建和释放连接的时间

核心服务层架构设计-缓存、隔离、队列

缓存技术

提供高性能的数据快速访问

  • 设计原则

    将数据写入/读取速度更快的存储
    将数据缓存到离应用最近的位置
    将数据缓存到离用户最近的位置

  • 缓存分类

    CDN 缓存
    反向代理缓存
    分布式 Cache
    本地应用缓存

  • 如何缓存

    实时写入
    异步写入
    读取时实时写入
    读取时异步写入

  • 分级缓存及演示

    CDN nginx 反向代理缓存 nginx lua shared dict 缓存 nginx lua redis 缓存 tomcat 本地缓存 tomcat redis 缓存 数据

  • 缓存不一致性

    容忍性 异步更新

隔离

隔离是指将系统或资源分割卡,系统隔离是为了在系统发生故障时能限定传播范围和影响范围,即发生故障后不会出现滚雪球效应,从而保证只有出问题的服务不可用,其他服务仍可用

  • 常见的隔离维度

    硬件隔离(虚拟机)
    操作系统隔离(容器虚拟化)
    进程隔离(系统拆分)
    线程隔离(线程池独立)
    读写隔离(读写分离)
    动静隔离(动态资源静态资源分离)
    热点隔离(热点账户,热点数据等)

队列

队列在数据结构中是一种线性表,从一段插入数据然后从另一端删除数据

异步处理
系统解耦
流量削峰

  • 流量削峰

    排队并发效率更高
    排队可以控制并发流量涌入

  • 应用场景

    mysql inno db primary key mutex
    redis key update flush
    application implementation

数据存储及接入层架构设计-数据存储

常用的数据存储中间件

  • NAS:网络文件系统,基底层设备,提供文件磁盘
  • 阿里 OSS:阿里云 OSS 网络文件存储
  • SQL 关系型数据库:MySQL,ms SQL,DB2,SQLite 等
  • 非关系型数据库:MongoDB,HBase 等
  • 缓存型数据库:H2,MemCache,Redis

数据存储及接入层架构设计-代理访问

  • 代理对象分类

    反向代理
    数据库代理
    Redis 代理

  • 代理访问定义

    代理一个或一群后端的被访问对象,使得调用端看似在直接访问后端对象一样,代理访问的代理器从而可以实现多种复杂均衡,故障转移,缓存策略等个性化配置,同时有可以分散被代理的后端对象压力

  • 为什么要代理访问

    集中收口逻辑
    负载均衡
    路由策略
    故障转移
    缓存策略
    减少后端被代理对象压力

  • 常见的被代理对象及演示

    后端应用服务器,如 nginx 反向代理
    数据库服务器,如 mycat 代理
    缓存服务器,如 Twemproxy 代理

监控

  • 硬件指标

    CPU Idle Time
    IO Wait Free Memory
    Network free

  • 软件指标

    Cpu Laod Average
    ParNewCount
    ParNewTime
    Old GC Count
    Old GC Time

  • 接口指标

  • 异常指标

  • 大盘指标

限流

  • 限流的维度一

    URL
    Dubbo 接口
    SQL 操作数

  • 限流的维度二

    限制 TPS/QPS
    限制并发数
    限制总数

  • 限制算法原理

    限制并发数:当调用开始时计数 -1,当计数为 0 时返回限流异常,调用结束后计数 +1
    令牌桶算法: 每隔一秒重置桶内的令牌,每次请求发起前取出一个令牌 漏桶算法:匀速流出 tps,若要访问则流入 tps 量不能大于桶内剩余的流量,和令牌桶对比可以允许有突发流量的发生

降级

当系统遇到某些情况下主动或被动采取的一种保护策略,即可以保护系统正常运行,有可以使得用户体验在可接受的损失范围

  • 降级原因

    保护系统
    保护用户体验
    排查问题

  • 降级方案

    关闭接口并设置默认返回
    降级逻辑

上次编辑于:
贡献者: 张振阳