集群、分布式概念:
对食物没有太高要求的人在肚子饿的时候一般都会选择去兰州拉面、沙县小吃等小饭馆,这类小饭馆有个很显著的特点:洗菜、切菜、炒菜都是同一个人完成,如果厨子不舒服可能饭馆还会歇业。而一些人流量较大的饭馆的分工则不像小饭馆那样“随便”,厨房中可能有多个洗菜的、多个切菜的、多个炒菜的,每个人都各司其职,就算其中一个炒菜的大厨生病了也不会导致饭馆歇业,顶多影响一下上菜速度。
在上述例子中,我们可以将洗菜、切菜、炒菜视作一个独立的模块,小饭馆中的大厨同时需要干这三件事可以抽象成多个功能模块部署在一个项目中、小饭馆里只有一个厨子可以抽象成服务单体部署、厨子生病可以抽象成服务挂了,如下图所示。
在大饭馆中,洗菜、切菜、炒菜等工作分配给了不同的人,不再是由一个人完成,并且每份工作有多个人在做,相当于把功能模块进行了抽离,模块不再内嵌到一个项目中,而是拆分成多个服务部署到不同机器上,形成一个完整的系统,如下图所示。
在上图中,洗菜有两个人负责、切菜有两个负责、炒菜也有两个人负责,这就是集群的概念,假设其中一个炒菜的生病了,另外一个炒菜的也能接替它的工作,系统能照常运行。
做菜的每个流程都有专门的人来负责就是分布式的概念。洗菜、切菜、炒菜的多个人共同协作一起完成做菜这件事。
总结:
集群:指多个人做一样的事情(多台机器提高相同的服务)。
分布式:指多个人做不一样的事情(每台机器提供不同的服务),这些事可以合并起来变成一件大事(不同服务组合,变成一个完善的系统)。
系统架构演进:
(1)单体架构:业务模块(如用户模块、订单模块等)不进行拆分,放在同一个项目中。
优点:开发、部署都很方便
缺点:
1、可靠性差,一个模块出了问题会导致整个系统不可用。
2、可伸缩性差,不能将系统中的一个模块单独抽离出来集群部署。
3、扩展性差,新需求产生新模块时,还是只能将新模块放在一个应用中。
(2)垂直架构:拆分功能模块,放到不同项目中(系统拆分成多个单体架构)。
优点:相对于单体架构,模块间的耦合度降低,可靠性、可伸缩性、扩展性都有所提升。
缺点:假设有一个用户模块E,两个应用都需要用到这个模块,那么只能将模块E分别集成到两个应用中,造成功能重复。
(3)分布式架构:将系统中的公用模块抽离出来,放到一个新的项目中;作为独立的服务供其它服务消费,实现服务的共享和重用。
由于部署在不同的机器上,业务模块与公用模块间的通信本质上是不同机器之间的网络通信,业务模块需要获知部署公用模块机器的IP、端口和暴露出来的接口,基于RPC(Remote Procedure Call,远程过程调用)或消息队列实现模块间的交互。
优点:解决了垂直架构中重复功能的问题。
缺点:一旦公用模块发生变更(IP、端口发生变更),业务模块那边也需要做相应改变(该配置文件或代码)。
(4)SOA(面向服务)架构:模块与模块之间不再直接进行交互,而是通过ESB(企业服务总线)服务中介来为模块间的交互搭建桥梁。
特点:
1、服务的状态发生变更时,调用方服务不需要感知服务提供方的变化,并做出相应改变;我们只需要告诉ESB,“我”要访问哪一个服务,由ESB去寻找服务提供方。(进一步降低了模块间的耦合度)。
2、ESB的功能:负载均衡、流量控制、加密处理、服务监控、异常处理、监控告急等。
(5)微服务架构:中心思想将模块彻底的"组件化"和"服务化",业务系统会拆分成多个可以独立开发、设计、运行的小应用,应用之间通过服务完成交互和集成。
特点:
1、每个微服务相互独立、互不干扰,模块间耦合度极低。
2、每个微服务可以自由选择开发技术和工具(开发语言选择、技术选型自由度高),不需要与其它团队协调。
3、每个微服务都有属于自己的业务数据,在部署、测试时无需依赖于其它服务(SOA架构中,可能还需要先启动服务提供模块),极大地便利了自动化部署和测试。