SpringCloud各服务之间调用过程原理

Spring Cloud是一个全家桶式的技术栈,包含了很多组件。本文先从其最核心的几个组件入手,来剖析一下其底层的工作原理。也就是Eureka、Ribbon、Feign、Hystrix、Zuul这几个组件

一、业务场景介绍

假设有个电商网站:

1.用户针对一个订单完成支付之后,会寻找订单服务更新订单状态为“已支付”;

2.库存服务进行扣减库存操作

3.通知仓库服务进行发货

4.给用户的这次购物进行相应的积分增加

下图为个服务的图解

å¨è¿éæå¥å¾çæè¿°

二、Spring Cloud核心组件:Eureka

订单服务想要调用其他服务怎么调用呢?

a 它首先压根不知道人家在那台机器上,想发起请求也不知道往哪里发送去。

b 这时候就需要 Eureka 了,他作为注册中心 Eureka Server,负责各服务的注册和发现

c 各个服务他们会有 Eureka Client 组件,而这些组件 会通过 Eureka Client 组件告诉 Eureka Server :我在那台机器上,我的ip 和 port ,这时 Eureka Server 会将这些信息维护到自己的注册表中

d 并且,这些服务同时也会通过 Eureka Client 将 Eureka Server 维护的所有的 注册信息拉取一份保存到自己的本地缓存中

总结:

A 、Eureka Server 负责将各个服务的信息保存起来

B 、Eureka Client 负责将自己服务的信息告诉 Eureka Server

下图解释了Eureka Server 和 Eureka Client

å¨è¿éæå¥å¾çæè¿°

三、Spring Cloud核心组件:Feign

现在 订单服务通过 eureka 已经知道了 各个服务在哪些机器上了,但是怎样发送请求呢? 不可能我们自己手写吧?先看看下面这个图吧

å¨è¿éæå¥å¾çæè¿°

也确实底层是这样的。

这时候不得不说说 Feign:

我们使用一个注解可以简单的解决上面一大堆的事情,

A 、首先我们对某个接口 使用了 @FeignClient 注解,Feign 机会针对这个接口进行动态代理

B、 根据我们在接口上的 @FeignClient的value 值 和 @RequestMapping 的 value 和 Method 等注解值进行构造出来我们要请求的服务的请求地址

下图示例上面一些列操作:

å¨è¿éæå¥å¾çæè¿°

 

四、Spring Cloud核心组件:Ribbon

既然 Feign 已经为我们构造出来了请求的 URL,那么有没有想这样一个问题,如果我们的服务事集群模式呢,一个服务部署多台机器,feign 帮助我们构造请求 URL 他应该怎样选择往哪台机器上去呢,这时候就需要 Ribbon 帮助我们了。

假设 订单服务要调用库存服务了,但是库存服务有五个节点:

192.168.3.159:9001

192.168.3.160:9001

192.168.3.161:9001

192.168.3.162:9001

192.168.3.163:9001

Ribbon 接下来就需要为我们出力了,他的作用就是负载均衡,默认的负载机制是 Round Robin(轮询)机制,

他和 Feign 和 Eureka 紧密工作,共同完成工作:

A 、首先 Ribbon 会从 Eureka Client 获取 各个服务的节点信息,

B、然后 Ribbon 会根据自身的 负载算法进行 筛选最终要把请求发往哪台机器上

C、这时候 Feign 构造 请求的 URL 就知道了往要发送机器的地址了å¨è¿éæå¥å¾çæè¿°

五、Spring Cloud 核心组件 Hystrix

假设: 订单服务 -》 库存服务 -》 仓库服务 -》 积分服务

1、现在又成千上万个人进行商品购买,他们下单后都要调用仓库服务进行仓库物流数据更新,但是很巧的是这时候仓库服务挂了,那么这些请求就会卡到订单服务那里

2、接下来又有成千上万的请求要进行下单,他们都需要进入订单服务进行下单,但是订单服务现在还在那里卡着呢,处理不了,这时客户就会发现,哎呀妈呀,怎么订单服务也挂了呀

这就形成了我们所说的 服务雪崩的问题

那么,这时候我们需要解决呢?

思考:既然仓库服务已经挂了,谁也没办法,那么我们为什么还要让他牵连我们的订单服务也挂呢?要处理他,阻止他,既然他挂了,那么就让他友好的返回,让我们进行下面的操作呀。。。。。

我会就需要 Hystrix 来为我们保驾护航了:

Hystrix 作为 熔断器,他会给我们进行友好返回信息,我们只要玩过 Hystrix 肯定知道怎么用吧。。

这样的操作我们就叫做 服务熔断

那么下来还有人说了,你熔断就熔断,那你的这下业务不还是不完整吗,你好歹干点啥呀?

好嘛,那我就熔断过程中对数据库增加 XXX 调用了仓库服务,需要进行物流数据更新,这样我们就可以在数据库中自己维护下物流信息的数据了,这个过程就是我们所说的服务降级

六、Spring Cloud 核心组件 Zuul

接下来我们述说这个 Zuul ,服务网关。

假设我们后台有几百个服务,现在有前端浏览器要发送请求过来,

人家要请求我们这些个服务,每次都要输入各个服务的名称,难免有些乱,

通过它我们可以给以统一的入口,它还可以做一些认证授权,请求监控,压力测试等等

 

 

 

  • 11
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值