集群:
同一个业务,部署在多个服务器上(不同的服务器运行同样的代码,干同一件事)
集群是指将多台服务器集中在一起,每台服务器都实现相同的业务,做相同的事情。如果一台死机,另一台可以起作用。
但是每台服务器并不是缺一不可,存在的作用主要是缓解并发压力和单点故障转移问题。我们可以利用一些廉价的符合工业标准的硬件构造高扩展、高性能、低成本、高可用的系统。
什么是分布式?
分布式:一个业务分拆多个子业务,部署在不同的服务器上(不同的服务器,运行不同的代码,为了同一个目的。而集群指的是将几台服务器集中在一起,实现同一业务。)
好处: 模块之间独立,各做各的事,便于扩展,复用性高 高吞吐量
简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。
什么是微服务?
维基上对其定义为:一种软件开发技术- 面向服务的体系结构(SOA)架构样式的一种变体,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据上下文,选择合适的语言、工具对其进行构建。
每个模块可以采用不同的语言编写,数据库也可以不一样。
1.分布式与微服务的关系
分布式和微服务的架构很相似,只是部署的方式不一样而已。
生产环境下的微服务肯定是分布式部署的,分布式部署的应用不一定是微服务架构的。比如集群部署,它是把相同应用复制到不同服务器上,但是逻辑功能上还是单体应用。
2.集群和分布式的区别
集群模式是不同服务器部署同一套服务对外访问,实现服务的负载均衡。区别集群的方式是根据部署多台服务器业务是否相同,分布式中的每一个节点,都可以做集群。而集群并不一定就是分布式的。而分布式,从窄意上理解也跟集群差不多。但是它的组织比较松散,不像集群有一个组织性,一台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点都完成不同的业务,一个节点垮了那这个业务就不可访问了。
简单说 集群就是一台主机接收请求然后分发请求到不同的服务器(每台服务器业务相同),单纯的提高访问量的承载,做好负载均衡就好。
分布式是不同的服务器放不同的业务,松耦合,实现小的模块升级的时候不会让每个模块都停止。
3.在开发中我们可以将分布式和集群分开吗?
针对这个问题,我们可以根据分布式的介绍看出,其主要的功能是用来将我们的系统模块化,将系统进行解耦的,方便我们以后的维护和开发的。但是其并不能解决我们的并发问题,也无法保证我们的系统在服务器宕机后的正常运转。
而集群恰好弥补了分布式的缺陷,集群就是多个服务器处理相同的业务。这在一方面可以解决或者说改善我们系统的并发问题,一方面可以解决我们服务器如果出现一定数量的宕机后,系统仍然可以正常运转。
好的设计应该是分布式和集群相结合,先分布式再集群。具体实现就是业务拆分成很多子业务,然后针对每个子业务进行集群部署。这样每个子业务如果出了问题,整个系统完全不会受影响。
简单实现微服务。(后面加入注册中心后代码会有改动,就不会直接访问接口)
注入ResrfulAPI
/** * @author : LeeGaki * @date : 2022/6/18 8:03 * 面向面试编程 --> 李佳琪 */@Configurationpublic class RestBean {@Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();}}
利用RestfulAPI做到调用接口,模块之间用http通信。
/** * @author : LeeGaki * @date : 2022/6/18 8:02 * 面向面试编程 --> 李佳琪 */@RestController@RequestMapping("/book")public class BookConsumerController {@Autowiredprivate RestTemplate restTemplate;private final String PATH_PREFIX="http://localhost:8001/";@GetMapping("/")public List findAll(){return restTemplate.getForObject(PATH_PREFIX+"book/",List.class);}@GetMapping ("/{id}")public Books findAllById(@PathVariable Integer id){return restTemplate.getForObject(PATH_PREFIX+"book/"+id,Books.class);}}