第一章-前言


《架构思考》-前言

互联网架构演变历史

1. 业务架构

1.1 单体架构
在互联网早期发展中,主要以单体架构为主,按照业务->应用层->数据层进行简单划分;
每一个业务系统就是一个单独的业务团队,数据和人员(组织关系)都是独立的,造成数据隔离和组织单体化的问题;

1.2 中台战略
由阿里提出来的,理念是共享,共享业务、系统、组织架构上的一种落地方式和实施办法;
关键字:共享、节约成本、协助;
中台战略主要分为数据中台和业务中台两层能力,如图所示:

#TODO

1.3 去中台战略

  1. 中台的复用率不高,提炼和维护中台所花费的代价抵不上中台复用带来的价值

2. 数据架构

  • 数据库架构
  1. 单体数据库架构
    web项目通过JDBC直连单体数据库

  2. 主从读写
    数据库采用读写分离架构,主库负责写操作,从库负责读操作;
    涉及到的中间件:sharding-jdbc,mycat

  3. 分库分表
    分库分表有两种方式:一种是横向切分,一种是纵向切分:

  • 横向拆分指的是按照记录进行拆分

  • 纵向拆分指的是按照字段进行拆分

  • 高速缓存
    引入redis来解决热数据的问题;
    缓存带来的问题:

  1. 缓存击穿(单一key失效)
  2. 缓存穿透(无效key访问)
  3. 缓存雪崩(大量key失效)
  4. 缓存一致性
  • 数据多样化
  1. 分布式文件系统:HDFS,FastDFS
  2. nosql:mongodb,redis
  3. 搜索引擎:Elasticsearch

3. 应用架构

  1. 单机调优
    上古时代使用tomcat或者jboos进行部署时,对单机进行调优,比如JVM参数优化、数据库连接池优化等;

  2. 动静分离
    前端静态资源独立部署到前置服务器上

  3. SOA架构
    SOA架构需要引入ESB(企业服务总线)来进行整体调度

  4. 微服务架构
    微服务架构是SOA架构的一种改进,微服务架构是一套系统和理念;

4. 部署架构

  1. 单机部署
    小型项目直接部署到单机上

  2. 集群部署
    集群部署主要是为了解决单机瓶颈问题,比如单机CPU、内存、IO瓶颈;

  3. 多层代理
    多层代理使用负载均衡器来解决单机瓶颈问题;

  4. 异地访问
    异地访问主要是为了解决跨地域访问延迟问题;

  5. 云平台
    云平台主要是为了解决自建机房的成本问题,通常使用docker、k8s等技术;

5. 架构思想

  1. 知行合一,做之前,先思考意义
  2. 原生由于定制,约定大于配置
  3. 什么都要,最后什么都要不了
  4. 控制技术欲,不要瞎折腾
  5. 留下扩展,但是不要想到100年以后
  6. 没有最好的,只有最合适的
  7. 够用就好,用的越花,风险越大
  8. 简约最美

容器化技术概览

应用部署方式的演变:从硬件虚拟化(操作系统虚拟化))到容器虚拟化(容器虚拟化的演变;

什么是容器化

容器化是将应用程序或服务及其依赖或者配置,一起打包为容器映像的一种软件构建及部署技术;

容器化架构

  • 什么是docker

docker是go语言研发的容器引擎,基于容器化技术和沙箱机制的应用部署技术;
可适用于自动化测试、打包、持续集成、发布等场景,以下是Docker的优点:

  1. 更高效的系统资源利用率
  2. 更快速的启动时间
  3. 一致的运行环境
  4. 持续交付和部署
  5. 更轻松的迁移

当然docker也有缺点:

  1. 隔离性不如虚拟机
  2. 性能高于虚拟机,但是低于物理机

docker的应用场景:
1.微服务部署场景
2. DevOps场景

额外需要注意的是,对docker文件的修改只会体现在当前层,对其他层的修改会采用标记删除-复制修改的方式进行;

Zookeeper

Zookeeper基础及高级应用

  • Zookeeper数据模型
    Zookeeper的数据模型是一个树形目录结构,类似于文件系统的目录结构,通过k-v的方式来进行存储,key是由’/'分割的路径;
    每个Znode节点可以存储的数据大小为1MB,选择1Mb的原因是基于zookeeper作为分布式协调服务的高性能和稳定性考量,其设计初衷就是用于协调服务,而非存储大量数据;

  • Zookeeper节点类型

  1. 持久化节点(默认类型)
  2. 持久化顺序节点
  3. 临时节点
  4. 临时顺序节点
    另外还有容器节点和超时节点等

Zookeeper应用场景

  • 分布式锁

分布式锁指的是在分布式环境下,跨进程\跨主机\跨网络的共享资源,实现互斥访问,保证一致性;在Zookeeper中,锁就是一个数据节点;

普通实现:通过注册临时节点,各个客户端抢占创建临时节点的方式,来获取锁,其他未抢占到该节点的客户端通过监听该节点的变化来重新获取锁;
这种方式存在的问题是: 羊群效应,指的是持有锁的客户端释放锁之后,其他所有客户端由于是通过watch机制监听该节点,导致所有客户端都会收到通知,然后重新发起竞争锁的请求,从而造成大量无效竞争;
解决方案是:通过临时顺序节点,每个客户端在创建锁的时候,都会创建一个临时顺序节点,然后通过监听前一个节点的变化来获取锁;

  • 分布式锁-读写锁

通过Zk实现分布式读写锁,是通过将临时顺序节点分为读锁节点写锁节点来进行实现;

  1. 读请求时,通过判断当前读节点,如果没有比自己更小的节点或者比自己小的节点都是读节点,那么获取读锁成功,如果比自己小的节点中有写锁节点,那么获取读锁失败;
  2. 写请求时,通过判断当前写节点,如果没有比自己更小的节点,那么获取读锁成功,如果自己不是最小的节点,那么获取读锁失败;
  3. 读锁或者写锁完成操作后,都要进行释放;
  • 配置中心

使用zookeeper作为配置中心,主要是通过客户端来监听配置节点的变化来实现;

  • 注册中心

使用zookeeper作为注册中心,是通过客户端来注册服务节点,调用端监听服务节点的变化来实现;

  • Curator客户端的实现
  1. InterProcessMutex:分布式可重入排他锁
  2. InterProcessSemaphoreV2:分布式信号量

Zookeeper选举策略

  • ZAB协议

Zookeeper的选举策略是基于ZAB协议来进行实现的,ZAB协议是一种对Paxos算法的简化实现,是专门未Zookeeper设计的支持崩溃恢复的原子广播协议;
基于该协议zk实现了一种主备模式(即Leader和Follower模式)的系统架构来保证集群中的各个节点的数据一致性;
在ZAB协议下,节点分为两个角色:LeaderFollower,第三个角色是Observer,Observer不参与投票;
Leader: 唯一,负责写操作和协调,一个zk集群中同一时刻只会有一个Leader,Leader发起并维护与各个follower和Observer的心跳,Leader通过心跳来维护集群中各个节点的状态,同时将写操作广播到各个节点
Follower: 多数,负责读操作并参与选举,同时Follower会响应Leader的心跳,并且接受Leader的写操作广播;Follower也可以响应客户端的写操作,然后将写操作转发给Leader,来进行完成;
Observer: 可选,专注于读操作,不参与选举,Observer的设计是为了提供读能力,因此被设计为数据是满足最终一致性的,因此可能会有读取数据延迟的问题,解决这个问题的方法是:1.强制Sync,2.客户端优先连接到Leader或者follower,3.对于强一致性的业务场景不使用Observer;

  • ZAB协议的两种模式
  1. 崩溃恢复模式:一旦Leader服务器进入崩溃或者网络原因导致与集群中的过半follower失去连接,那么就会进入崩溃恢复模式;zk集群会进入选举阶段,通过投票的方式来选出新的Leader;
  2. 消息广播模式:Leader选出之后,就会进入消息广播模式;在该模式下,Leader会进行消息广播,需要注意的是满足过半节点即可,这是和Paxos算法的区别;
  • zk的选举过程
    Zookeeper的选举过程分为两类,第一类是服务器启动时的Leader选举流程异常恢复场景Leader的选举过程
    首先介绍几个概念:
  1. zxid:zxid是一个64位的数字,高32位是epoch(leader纪元),低32位是当前leader纪元内事务ID,节点初始化时为0|0;
  2. serverid:也被称为myId,代表服务器的ID,是一个32位的数字,初始化是通过myid文件进行初始化的;
  3. Quorum:集群中过半的节点数量;

leader选举流程大致可以分为以下几个步骤:

  1. 集群启动时,每个节点都会初始化自己的zxid和serverid;
  2. 集群启动时,每个节点都会发起投票,投的都是自己,并且将投票信息广播出去
  3. 每个节点通过对比自己的(zxid,serverid)和接收到的投票信息,来确定自己的投票结果,并且将投票信息广播出去;
  4. 当某个节点收到的投票信息数量达到过半时,该节点就会成为Leader;
  5. Leader选举完成后,Leader会进行消息广播;

Apollo配置中心

Apollo是分布式配置中心,主要用于管理分布式系统的配置信息;

@TODO

Skywalking…

微服务系统监控的三要素

度量单位:QPS,RT,CPU使用率,接口调用量,接口成功率
日志:业务日志,数据日志,异常日志
链路追踪:记录一个请求的完整路径

分布式链路的组成

  1. 数据采集阶段
  2. 数据持久化阶段
  3. 数据展示阶段

opentraceing规范

  • trace

一个Trace代表一个事务、请求或者是流程在分布式系统中的执行过程;OpenTracing中的一个Trace由多个Span组成,一个Spen代表系统中具有开始时间
和执行时长的逻辑单元,Span一般会有一个名称,一个Trace中的Span是首尾相连接的;

  • Span

Span代表系统中具有开始时间和执行时长的逻辑单元,Span之间通过嵌套或者顺序排列建立逻辑因果关系;

配置

  1. 使用javaagent的方式,在启动时添加参数,设置ServiceName;

网络编程

网络IO模型

  1. 同步阻塞IO
    同步阻塞IO:由于是依赖于操作系统的IO操作,因此会导致线程阻塞,并且由于线程数量的限制,无法创建大量IO线程;

  TOC