从spring boot到spring cloud(五)Spring Cloud 什么是分布式与负载均衡
在搭建Spring Cloud之前先要描述下什么是分布式、什么是负载均衡的,才能更好的理解为什么要用Spring Cloud,更好的搭建框架
本章主要是搭建分布式,就先说明分布式
分布式系统是多个处理机通过通信线路互联而构成的松散耦合的系统。从系统中某台处理机来看,其余的处理机和相应的资源都是远程的,只有它自己的资源才是本地的。至今,对分布式系统的定义尚未形成统一的见解。一般认为,分布式系统应具有以下四个特征:
(1)分布性。分布式系统由多台计算机组成,它们在地域上是分散的,可以散布在一个单位、一个城市、一个国家,甚至全球范围内。整个系统的功能是分散在各个节点上实现的,因而分布式系统具有数据处理的分布性。
(2)自治性。分布式系统中的各个节点都包含自己的处理机和内存,各自具有独立的处理数据的功能。通常,彼此在地位上是平等的,无主次之分,既能自治地进行工作,又能利用共享的通信线路来传送信息,协调任务处理。
(3)并行性。一个大的任务可以划分为若干个子任务,分别在不同的主机上执行。
(4)全局性。分布式系统中必须存在一个单一的、全局的进程通信机制,使得任何一个进程都能与其他进程通信,并且不区分本地通信与远程通信。同时,还应当有全局的保护机制。系统中所有机器上有统一的系统调用集合,它们必须适应分布式的环境。在所有CPU上运行同样的内核,使协调工作更加容易。
以上都是套话
下面通过脑图来分析分布式。
从上图可以看出整个大系统中分为了3个子系统‘会员系统’、‘购物系统’、‘进销存系统’。最早的方式是每个子系统独立开发,需要什么功能都自己实现,数据库共用。再后来就某些复用的内容通过接口封装的方式提供使用。到现在发展成提取复用功能,通过分布式的方式直接使用。
那么分布式架构就是将各系统中的模块拆分成多个可复用的服务,各系统中相同的服务可以复用。
根据上图7个模块就可以合并成5个服务
通过springboot的配置文件来注册Spring Cloud
单个配置已经在从spring boot到spring cloud(四)Spring Cloud Eureka 注册与发现中说明这里直接查看配置文件
eureka注册中心配置 使用3000端口
server: port: 3000eureka: instance: hostname: eureka-center appname: 注册中心 client: registerWithEureka: false # 单点的时候设置为 false 禁止注册自身 fetchRegistry: false serviceUrl: defaultZone: http://localhost:3000/eureka server: enableSelfPreservation: false evictionIntervalTimerInMs: 4000
然后是服务主要的是name user(用户模块)discount_coupon(优惠券)commodity(商品)shopping(购物车)supplier(供货商)
server: port: 3001eureka: instance: preferIpAddress: true client: serviceUrl: defaultZone: http://localhost:3000/eureka ## 注册到 eureka spring: application: name: user
server: port: 3002eureka: instance: preferIpAddress: true client: serviceUrl: defaultZone: http://localhost:3000/eureka ## 注册到 eureka spring: application: name: discount_coupon
server: port: 3003eureka: instance: preferIpAddress: true client: serviceUrl: defaultZone: http://localhost:3000/eureka ## 注册到 eureka spring: application: name: commodity
这里就不一一列举了
可以看到已经注册成了3个服务提供使用。
package com.example.demo;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;@RestControllerpublic class ConsumerController {@Autowired private RestTemplate restTemplate; private static final String applicationName = "user";//服务注册名 @RequestMapping(value = "commonRequest") public Object commonRequest(){ String url = "http://"+ applicationName +"/hello"; String s = restTemplate.getForObject(url,String.class);//Ribbon方式调用服务 return s; }}
private static final String applicationName = “user”;//服务注册名
直接通过注册名调用就可以了
负载均衡什么情况下要使用负载均衡呢
一、访问量太大,单个服务无法支撑访问量。
二、容错率要求高,提供的服务不能出现出错或自动关掉而导致整个系统无法使用。
当该服务挂掉时候那么整个业务就无法使用了。
负载均衡就是当其中一个服务挂掉了,自动切换到可以使用的相同服务。
server: port: 3001eureka: instance: preferIpAddress: true client: serviceUrl: defaultZone: http://localhost:3000/eureka ## 注册到 eureka spring: application: name: user
server: port: 3003eureka: instance: preferIpAddress: true client: serviceUrl: defaultZone: http://localhost:3000/eureka ## 注册到 eureka spring: application: name: user
这里只要把name改一下 都改成user
user下面就有2个服务。调用方式还是一样的。
本章主要讲分布式和负载均衡的理论。这里只说了服务的负载均衡那么出现了一个问题,如果Eureka挂掉了呢,所以后续会说明Eureka的集群。
开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系