从零开始学架构笔记

220 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

架构基础

概念区分

框架和架构:框架是对技术进行封装,提供更易于使用的方式;架构是定义系统各个组成部分的组织和交互。
模块和组件:模块大多数是从业务角度进行解读,比如:用户模块、商品模块等;组件是具体解决某一技术问题的工具,比如MySQL解决存储、Redis解决缓存。
系统和子系统:这个比较容易理解,包含的关系,系统包含子系统。

架构的目的

我们为什么要做架构设计?相信很多人从来没有思考过这个问题。
我们主要是想通过架构来解决系统中的复杂度问题。比如:我们要求系统高性能、高可用、可扩展、低成本、安全性等等。
如果不做架构设计,是很难满足这些指标的。所以架构设计的目的就是为了解决复杂度。

复杂度的来源

架构是为了解决复杂度,那么软件系统的复杂度有哪些呢?
高性能(高并发):高性能一般指高并发,比如系统能支撑多大的TPS或QPS
高可用:系统中的某一模块、组件、节点挂了,系统还能否正常提供服务
可扩展:主要指系统架构能否应对业务的快速发展或变化
。。。

架构设计原则

简单原则
合适原则
演化原则

架构设计流程

识别复杂度
设计方案和备选方案
评估和选择方案
详细方案设计

高性能

存储高性能

关系型数据库

典型代表MySQL
读写分离
分库分表

NoSQL

not only sql
K-V存储:Redis
文档数据库:Mongo
列式存储:Hbase
全文搜索引擎:Elasticsearch

集群高性能

负载均衡

负载均衡分类

  1. DNS(一般用于多机房)
  2. 硬件负载均衡
  3. 软件负载均衡
    • LVS:基于ip的4层负载
    • nginx:基于应用层的7层负载

负载均衡算法

  1. 轮询
  2. 加权轮询
  3. Hash(ipHash、urlHash、userIdHash)
  4. 负载最低优先

高可用

存储高可用

存储高可用都是通过【冗余】的方式实现,也就是存储多份。
但是存储多份会带来数据一致性的问题。

主备:一般主节点负载读写、备节点只负责备份数据
主从:主节点负载读写、从节点只负责读 cluster:去中心化的。比如Eureka、RedisCluster。每个节点都存储数据,会有容量问题

业务高可用

多节点、多机房、多区域部署

异地多活

同城异区
跨城异地
跨国异地
距离越远,延迟越大

接口级别故障处理

降级
熔断
限流
排队

可扩展模式

可扩展主要遵循两个指导方针:拆、分层

拆分:
面向流程拆分
面向服务拆分
面向功能拆分

分层:
架构分层
业务分层
代码分层

分层架构:
SOA
微服务
微内核(OSGI)