一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
架构基础
概念区分
框架和架构:框架是对技术进行封装,提供更易于使用的方式;架构是定义系统各个组成部分的组织和交互。
模块和组件:模块大多数是从业务角度进行解读,比如:用户模块、商品模块等;组件是具体解决某一技术问题的工具,比如MySQL解决存储、Redis解决缓存。
系统和子系统:这个比较容易理解,包含的关系,系统包含子系统。
架构的目的
我们为什么要做架构设计?相信很多人从来没有思考过这个问题。
我们主要是想通过架构来解决系统中的复杂度问题。比如:我们要求系统高性能、高可用、可扩展、低成本、安全性等等。
如果不做架构设计,是很难满足这些指标的。所以架构设计的目的就是为了解决复杂度。
复杂度的来源
架构是为了解决复杂度,那么软件系统的复杂度有哪些呢?
高性能(高并发):高性能一般指高并发,比如系统能支撑多大的TPS或QPS
高可用:系统中的某一模块、组件、节点挂了,系统还能否正常提供服务
可扩展:主要指系统架构能否应对业务的快速发展或变化
。。。
架构设计原则
简单原则
合适原则
演化原则
架构设计流程
识别复杂度
设计方案和备选方案
评估和选择方案
详细方案设计
高性能
存储高性能
关系型数据库
典型代表MySQL
读写分离
分库分表
NoSQL
not only sql
K-V存储:Redis
文档数据库:Mongo
列式存储:Hbase
全文搜索引擎:Elasticsearch
集群高性能
负载均衡
负载均衡分类
- DNS(一般用于多机房)
- 硬件负载均衡
- 软件负载均衡
- LVS:基于ip的4层负载
- nginx:基于应用层的7层负载
负载均衡算法
- 轮询
- 加权轮询
- Hash(ipHash、urlHash、userIdHash)
- 负载最低优先
高可用
存储高可用
存储高可用都是通过【冗余】的方式实现,也就是存储多份。
但是存储多份会带来数据一致性的问题。
主备:一般主节点负载读写、备节点只负责备份数据
主从:主节点负载读写、从节点只负责读
cluster:去中心化的。比如Eureka、RedisCluster。每个节点都存储数据,会有容量问题
业务高可用
多节点、多机房、多区域部署
异地多活
同城异区
跨城异地
跨国异地
距离越远,延迟越大
接口级别故障处理
降级
熔断
限流
排队
可扩展模式
可扩展主要遵循两个指导方针:拆、分层
拆分:
面向流程拆分
面向服务拆分
面向功能拆分
分层:
架构分层
业务分层
代码分层
分层架构:
SOA
微服务
微内核(OSGI)