什么是分布式?
权威定义:
利用物理架构形成多个自治的处理元素,不共享内存,但是通过发送信息合作。——Leslie Lamport
分布式的作用
实际工作中的痛点
- 工程臃肿
- 测试、上线繁琐
- 开发效率低
单体应用的问题
- 应用代码耦合严重,功能扩展难
- 新需求开发交互周期长,测试工作量大
- 新加入的开发同事需要很长时间才能熟悉系统
- 升级维护也很困难(改动任何一点地方都要升级整个系统)
- 系统性能提升艰难,可用性低,不稳定
分布式的好处
- 增大系统容量
- 加强系统可用
- 因为模块化,所以系统模块重用度更高
- 因为软件服务模块被拆分,开发和发布速度可以并行并变得更快
- 系统扩展性更高
- 团队协作流程也会得到改善
- 技术升级
分布式和单体结构的对比
传统单体架构 | 分布式架构 | |
---|---|---|
新人的学习成本 | 业务逻辑成本高 | 架构逻辑成本高 |
部署、运维 | 容易 | 发布频繁、发布顺序复杂、运维难 |
隔离性 | 一损俱损,殃及鱼池 | 故障影响范围小 |
架构设计 | 难度低 | 难度指数级上升 |
系统性能 | 响应快、吞度量小 | 响应慢、吞吐量大 |
测试成本 | 低 | 很高 |
技术多样性 | 技术单一且封闭 | 技术多样且开放 |
系统扩展性 | 扩展性差 | 扩展性很好 |
系统管理成本 | 成本低 | 成本高 |
CAP定理
CAP
-
C(Consistency ,一致性):读操作是否总能读到前一个写操作的结果
-
A(Availability ,可用性):非故障节点应该在合理的时间内作出合理的响应
-
P(Partition tolerance ,分区容错性):当出现网络分区现象后,系统能够继续运行,即网络断开,不能互相通信时的情况
-
三者最多只能选其二,不可兼得
CAP怎么选
什么时候可用性高于一致性?
- 有一个网站,一更新没必要所有人都同步,可以稍微延迟一点,但是要求无论何时访问网站,都能看得到
什么场合一致性高于可用性?
- 支付场合,可以允许暂时不可用,但是决不允许不一致
集群: 是对整个系统复制多份,部署到不同的服务器上,用于分散压力。
分布式: 是把系统拆分成子系统,部署到不同的服务器上,用于分散能力。
实际项目中通常是分布式+集群部署。
集群、分布式、微服务的区别
集群和分布式的区别
分布式:一个业务拆分多个子业务,部署在不同的服务器上(模块中相互通信)
集群:同一个业务,部署在多个服务器上(一个单体服务部署到多台机器上,每个集群都是一套代码,通过负载均衡去调度。不同机器可以不通信。就像每个店各有一个厨师)
集群和微服务的区别
集群:分散压力(把压力通过复制机器的方式分散出去)微服务:分散能力(把能力拆分)
微服务和分布式的区别
微服务是架构设计方式,按逻辑角度对架构进行拆分,是逻辑架构。把大服务拆除小服务,独立部署,服务间通过通信进行调用,每个服务独立开发测试
分布式是系统部署的方式,机器和机器间会遇到哪些通信上的问题,如何容错,考虑物理架构
先做逻辑架构,再做物理架构
分布式的拆分
分布式的核心就一个字:拆。只要是将一个项目拆分成了多个模块,并将这些模块分开部署,那就算是分布式。有两种拆分方式:水平拆分,或垂直拆分。
水平拆分
-
将一个项目根据“三层架构”拆分成表示层(JSP+Servlet) 、业务逻辑层(Service) 和数据访问层(DAO),然后再分开部署:把表示层部署在服务器A上,把Service和DAO层部署在服务器B上,然后服务器A和服务器B之间通过dubbo等RPC进行进行整合。
-
这种不是微服务的架构设计,但是使用的分布式部署。
垂直拆分
-
将项目拆分成几个模块,例如用户模块,订单模块等,分别部署到各个服务器上,
-
这种属于微服务的架构设计,并且使用分布式部署。