什么是SpringCloud
业务场景介绍
- 开发一个电商网站,要实现支付订单的功能,流程如下:
- 创建一个订单之后,如果用户立刻支付了这个订单,我们需要将订单状态更新为“已支付”
- 扣减相应的商品库存
- 通知仓储中心,进行发货
- 给用户的这次购物增加相应的积分
服务分析
订单服务、库存服务、仓储服务、积分服务
流程调用
- 用户针对一个订单完成支付之后,就会去找订单服务,更新订单状态
- 订单服务调用库存服务,完成相应功能
- 订单服务调用仓储服务,完成相应功能
- 订单服务调用积分服务,完成相应功能
springcloud拥有许多核心组件:
- Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还
- 可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
- Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
- Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
- Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务
- 调用的隔离,避免了服务雪崩的问题
- Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服
- 务
流程:
1.
请求统一通过
API
网关(
Zuul
)来访问内部服务
.
2.
网关接收到请求后,从注册中心(
Eureka
)获取可用服务
3.
由
Ribbon
进行均衡负载后,分发到后端具体实例
4.
微服务之间通过
Feign
进行通信处理业务
5. Hystrix
负责处理服务超时熔断
简单介绍后接下来开始实战:
创建一份maven项目命名为cloud用来存放所有依赖,接下来在此项目下创建两个springboot项目分别命名为provider和consumer。
在cloud中导入依赖
<spring-boot.version>2.4.1</spring-boot.version>
<spring-cloud.version>2020.0.0</spring-cloud.version>
<spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
导入三个版本的原因
:
nacos
来自
Spring Cloud Alibaba
的
(
用于代替
SpringCloud Eureka
和
SpringCloud Config)
feign
来自
Spring Cloud
其他的正常来自与
SpringBoot
定义cloud的子类让子类能使用父类的依赖
<!--定义儿子-->
<modules>
<module>provider</module>
<module>consumer</module>
<module>common</module>
</modules>
两个子类provider和consumer都需要继承父类
<!--继承父类 大项目 拥有了依赖和版本-->
<parent>
<artifactId>cloud</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
生产者和消费者ym和Applicationl文件构建 消费者修改名字和端口号即可
server:
port: 8080
spring:
application:
name: provider
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
接下来从注册中心(Eureka)获取可用服务,我这里使用的事nacos它的功能比Eureka更强大,Nacos采用了分布式的架构。但是我们的生成者provider可能不止一个所以还会用到负载均衡。因为核心组件ribbon已经停止更新所以使用Srping Cloud Loadbalancer
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
注入RedisTemplate 放在Consumer的Application类下即可
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
这时候使用了nacos注册了服务所以消费者可以通过项目名provider找到相应的路径
@RequestMapping("/run")
public String run() {
//String.class接受的是Sting 鸡腿
//使用了nacos 可以直接"http://provider/run" 它会帮你找到 负载均衡 服务注册中心 心跳检测机制
String forObject = restTemplate.getForObject("http://provider/run", String.class);
return forObject;
}
上面的负载均衡的作用是:假设有两台服务器,现在只有一个订单,会自动分配给其中一个服务器,让资源合理利用,杜绝一台机器使用,另一台荒废的情况。
它的作用是负载均衡,会帮你在每次请求时选择一台机器,均匀的把
请求分发到各个机器上