单体、服务化架构一点概念

浅析单体架构和服务化架构的一些概念

Posted by Hyuga on September 18, 2018

概念

单机:一个人(买菜洗菜做饭洗碗)[整体事件]

集群:多个人(买菜洗菜做饭洗碗)[整体事件]

分布式:一个(买菜)一个(洗菜)一个(做饭)一个(洗碗)[单体事件]

分布式集群:多个(买菜)多个(洗菜)多个(做饭)多个(洗碗)[单体事件]

SOA(面向服务的架构):把单体系统分离成不同的服务,多个服务系统之间通信是将服务接口暴露注册到注册中心,使用接口来进行数据交互,最终达到整合系统的目的

微服务:分布式概念比较广,微服务架构其实就是分布式服务架构的子集,稍微不同的是部署方式可能不同

单机架构

一个项目包含了所有业务模块,部署到一台服务器上。

优点:

  • 易于开发、测试、部署,集中式管理
  • 成本低,一台服务器即可

缺点:

  • 开发效率低:所有的开发在一个项目改代码,递交代码相互等待,代码冲突不断
  • 代码维护难:业务模块间通过方法调用,代码功能耦合在一起,新人不知道何从下手
  • 部署不灵活:构建时间长,任何小修改必须重新构建整个项目,这个过程往往很长
  • 稳定性不高:一个微不足道的小问题,可以导致整个应用挂掉
  • 扩展性不够:无法满足高并发情况下的业务需求,单机处理能力有限,业务量到了一定程度,单机硬件资源撑不住业务需求

小型项目可以采用单机架构,但单机局限性是很高的,比如一个功能出了问题,有可能导致整个项目停服,项目上线过程遇到问题,可能要停服,部署有问题导致停服,反正就一台服务器,任何问题都可能对客户和业务造成很不好的影响。

集群架构

解决高可用

单机处理到达瓶颈,将单机上的项目copy部署到其他的几台服务器上,这就是集群。每一台服务器就是该集群的一个节点,每个节点提供的服务都是一样的。

集群是需要配合负载均衡服务器一起使用的,负载均衡服务器作用在于按每个节点的负载情况分配用户请求,以达到每个节点负载平衡。

优点:

  • 系统处理能力提升
  • 避免单机宕机风险
  • 系统拓展很容易,加一台服务器copy项目部署即可,最多也就配置下负载均衡配置

缺点:

  • 代码耦合度还是高
  • 当业务发展到一定程度,在怎么增加节点整个集群性能提升也不明显,这个时候考虑下分布式架构

分布式架构

解决高性能、高并发

集群对项目代码是近乎无改动的,只需要copy部署多几台服务器就好了。但分布式则不同,需要将原有项目按功能或者模块等进行拆分,拆分成多个独立的子系统,每个子系统能独立运行在服务器上,通过RPC方式通信。

分布式一般会有一个注册中心的概念,比如zookeeper等,用于各系统间对外的服务注册,便于各系统通过接口模式通信。

优点:

  • 系统间耦合度大大降低,可独立开发、部署、测试
  • 系统间边界明确,排错相对容易,开发效率也会提高很多
  • 系统便于扩展,比如某个服务业务量大了,可以只针对这个服务增加集群节点
  • 服务复用性更高,分布式系统对外提供服务,其他系统都可以使用,不需要重复开发

缺点:

  • 运维更复杂,一个系统拆分后,每个子系统都得配置部署监控等
  • 投入成本更多,人员、服务器、研发周期等
  • 项目相对原来的单项目模式显得更为庞大复杂
  • 分布式跨网络调用,性能受网络延迟和带宽影响
  • 数据一致性,分布式事务管理需要在C(一致性)A(可用性)P(分区容错性)中做出选择

微服务架构

其实微服务的意思也是将模块拆分成一个个独立的服务单元通过接口来实现数据交互,也是属于分布式的一种,与分布式的细微差别是,微服务的应用不一定是分散在多个服务器上,他也可以是同一个服务器。

分布式和微服的架构很相似,只是部署的方式不一样而已。

优点:

  • 边界清晰,开发测试维护简单:每个服务职责清晰,只关注于一个业务功能
  • 技术栈灵活:每个服务开发语言可不同,只需要把服务注册到注册中心,统一协议
  • 松耦合:各个服务间不像单体架构一样通过方法调用
  • 可用性:单个服务宕机,不影响其他服务访问,可能影响业务,如果有关联
  • 按需扩展:某个服务需要做硬件升级,比如集群,硬件升级等,不影响其他服务

缺点:

  • 分布式带来的复杂性:网络延迟、容错性、消息序列化、数据一致性、异步机制、版本华、差异化等
  • 运维开销成本增加:整体应用可能只需部署至一小片应用服务区集群,而微服务架构可能变成需要构建/测试/部署/运行数十个独立的服务,并可能需要支持多种语言和环境。
  • 服务版本问题:当某个服务接口版本升级,其他调用的单体服务可能都要进行升级

集群和分布式的区别

  • 集群:一个项目多台服务器
    • 物理形态:copy项目,加机器部署
    • 分担客户端请求压力
  • 分布式:一个项目拆分多个业务模块,部署多台服务器上
    • 工作方式:拆分项目,每个模块部署到新的服务器上
    • 空间换时间

集群一般采用的是负载均衡集群,也就是nginx集群,服务请求经过nginx服务器判断那台系统服务器的负载不重,就将请求分发到那一台去完成。

nginx集群是指:采用nginx服务器来做负载均衡集群,nginx服务器可以是一台,也可能是多台集群。

单纯的分布式和集群是不一样的,集群服务挂了一台,其他的服务器一样可以用,只是服务器压力会变大,但不会直接停服。而单纯的分布式是指一个项目多模块拆分成多个模块系统,每个模块系统部署到新的一台服务器上,形成分布式架构。

那么问题来了,只有一个节点的模块系统,一旦节点垮了,这个业务就不可调用了。所以就有新的组合玩法:分布式集群

分布式集群:单机项目拆分成分布式后,分布式架构的某一个模块系统也可以采用集群架构,也就是所谓的分布式集群。

其实分布式和集群就是概念性的东西,集群就是copy,分布式就是拆分,可以单纯的copy,也可以拆分后再copy.

举个简单的栗子:

  • 单机:一个电商项目部署在一台服务器上
  • 集群:一个电商项目部署在多台服务器上,通过nginx等技术做负载均衡集群
  • 分布式:一个电商项目多个模块拆分成多个系统,比如支付系统,用户系统,商品系统,订单系统等等,每个系统都部署到对应的新服务器上,这就是分布式
  • 分布式集群:一个整体项目分布式拆分后,每个模块系统再采用集群方式架构

服务负载均衡方式

客户端寻址有两种方式,如下:

  1. nginx集群:调用者->nginx->提供者(基于服务端的负载均衡,请求发出后由nginx分发到某个ip)

  2. dubbo、cloud:调用者去注册中心拿要调用的ip,然后再去调用相应ip的服务(基于客户端的负载均衡,请求发出前)

集群是通过提高单位时间内执行的任务数来提升效率,而分布式是以缩短单个任务的执行时间来提升效率。

再举个栗子:

如果一个任务由10个子任务组成,每个子任务单独执行需1小时,则在一台服务器上执行改任务需10小时。

分布式方案:提供10台服务器,每台服务器只负责处理一个子任务,不考虑子任务间的依赖关系,执行完这个任务只需一个小时。(这种工作模式的一个典型代表就是Hadoop的Map/Reduce分布式计算模型)

集群方案:同样提供10台服务器,每台服务器都能独立处理这个任务。假设有10个任务同时到达,10个服务器将同时工作,10小后,10个任务同时完成,这样,整体来看,还是平均1小时完成一个任务!