大白话给你讲分布式架构,3分钟让你学一遍

引言随着越来越多的人参与到互联网的浪潮来 , 曾经的单体应用架构越来越无法满足需求 , 所以 , 分布式集群架构出现 , 也因此 , 分布式搭建开发成为了Web开发者必掌握的技能之一 。
那什么是分布式呢?怎么实现分布式以及怎么处理分布式带来的问题呢?本系列文章就来源于对分布式各组件系统的学习总结 。
包含但不限于Zookeeper、Dubbo、消息队列(ActiveMQ、Kafka、RabbitMQ)、Nosql(Redis、MongoDB)、Niginx、分库分表MyCat、Netty等内容 。
一、什么是分布式简单的说 , “分工协作 , 专人做专事”就是分布式的概念 。
就好比你是你们公司唯一的码农 , 那么前后端都需要你自己来开发(单体架构) , 但随着业务的增长 , 你确实忙不过来了 , 老板给你招来了一个前端 , 那么你就只需要专注后端开发就行了(分布式) 。
但是软件的分布式搭建远远不像现实例子中这么简单 , 需要考虑和处理很多方面的问题 , 我们先了解以下几个常见的概念:

  • 集群:你们公司业务增长的非常快 , 老板发现你一个后端忙不过来了 , 就又招了几个后端开发来协助你 , 这就是后端集群;再往后 , 发现前端也忙不过来了 , 又配备几个前端 , 就是前端集群 。 所以也不难看出 , 将应用拆分后 , 你可以有针对性地扩展单个服务 , 做成集群 , 这就是分布式的好处之一 。
  • 节点:这个也非常好理解 , 一个服务就是一个节点 , 比如你就是后端集群中的一个节点 , 而集群本身也可以看成是整个应用的一个集群节点 。
  • 副本:副本就是为服务和数据提供的冗余 , 保证高可用 。
  • 中间件:为开发者提供便利 , 屏蔽复杂的底层的一类框架组件 。 如服务管理通信、序列化、负载均衡等组件 。

大白话给你讲分布式架构,3分钟让你学一遍文章插图
上图就是一个简单的分布式架构 , 但并不是所有的应用一开始就要设计为分布式架构 。
因为一开始业务量并不大 , 没有必要耗费大量的时间和成本去完成一个分布式架构 , 甚至有可能到最后都用不上 , 因此在设计时我们应该遵循演进原则 , 由简入深 。
下面就来简单分析一下分布式架构的演进过程 。
二、分布式架构的演化过程单机版以商城为例 , 为了简单说明 , 这里就只列出用户、订单、配送服务 。
大白话给你讲分布式架构,3分钟让你学一遍文章插图
如图 , 大部分应用最开始都是将应用和数据库放到一台物理机上提供服务 , 但随着访问量的提升 , 服务器负载越来越高 。
我们首先会优化代码、对机器做垂直扩容(内存、容量)等 , 但单台机器的性能是存在上限的 , 且对单机扩容的性价比会随着性能的提升越来越低 , 那我们就会想到增加服务器 。
将应用服务器和数据库服务器分离在一开始 , 我们可能只会增加一台服务器 , 并将应用和数据库分离:
大白话给你讲分布式架构,3分钟让你学一遍文章插图
搭建应用服务器集群随着访问量的继续增加 , 单台应用服务器也无法满足需求了 , 我们就需要搭建应用服务器集群来对外提供服务了
大白话给你讲分布式架构,3分钟让你学一遍文章插图
但是 , 在搭建应用服务器集群之后 , 问题就出现了 , 用户在访问时 , 应该到哪个服务器上去?
如何平均服务器压力?以及用户的session如何维护(A首先访问了1号应用服务器并登陆 , 但下次请求可能是去到2号服务器 , 但这台服务器上并没有用户的session信息)?
我们可以在用户层和应用层之间加上一个负载均衡器来平衡服务器的负载 , session可以采取同步的方式 , 或者增加单独的session共享服务器 。