SpringCloud服务间内部调用原理

前言

SpringCloud中各个服务分布在不一样的服务器上,咱们经常使用内部服务调用去调用其余服务,那么他们内部究竟是怎么调用的呢?这里咱们以一个购物APP为例子:包含商品服务,仓储服务,支付服务,购物车服务;缓存

那么咱们这里从商品服务获取了商品,加入了购物车,而后准备支付商品款,再通知仓储进行发货。那么这个过程当中就设计到服务间调用。服务器

在说明调用原理以前咱们先来屡一下思路:每一个服务在不一样的服务器上,这些服务直接如何发现彼此?网络

注册中心

这就引出了注册中心(服务注册与发现);首先每一个服务中都会有一个注解@EurekaClient,就是告诉注册中心关于本身服务的信息,并且每一个服务都有一个注册中心EurekaServer的地址,(定时)不停地往注册中心发送心跳告诉本身是否中断,注册中心就维护了一张注册表,这张注册表记录了每一个服务的IP,监听的端口,服务状态等信息app

那么若是购物车服务要调用支付服务,那么它就会问注册中心:支付服务的注册信息是啥?而后购物车拿支付服务注册信息以后就缓存到本地服务中。那么问题又来了,不一样服务器之间调用确定须要经过网络请求到对应服务器上的服务监听端口?那么谁来作这个事情呢?负载均衡

一般咱们在没有使用微服务框架时,都是经过HttpClient去调用请求,传递参数,而后获取到相应结果进行处理,但这样每次都写重复的代码是否是很烦人?那微服务SpringCloud中谁来干这个活呢?这里就引出了Feign这个组件了。框架

Feign

咱们写过微服务的你们应该都知道,咱们在实现控制器时,一般都会以实现一个接口,这个接口在服务间进行调用显示写法,那么这个Feign的底层实现原理是啥呢?
咱们前面说了要调用不一样服务器之间的服务呀就得使用HttpClient形式去调用,Feign就是用来干这个的。分布式

前面咱们拿到了支付服务的IP与端口,那么Feign就会将这些信息拼接起来,造成一个网络请求:Http://服务地址:监听端口/服务注册标识/对应的请求MAPPINGide

Feign实现原理

一般咱们都知道加上@FeignClient注解的都是一个接口,其实这个Feign的原理就是使用的动态代理,经过@FeignClient\@RequestsMapping\@PathValue或者@RequestBody将请求发送到目标HandleMapping上。微服务

这样咱们就解决了不一样服务器之间通讯请求链接的问题,可是咱们微服务一般都会实现分布式部署,同一个服务会部署在不一样的多个服务器上,那么Feign它又怎么知道我发给那个服务IP上呢?这个工做是谁来作呢?谁来告诉Feign呢?那么这里又引出了一个组件:Ribbon;线程

Ribbon

没错,Ribbon就是来告诉Feign具体发送到那个Ip上的一个负载均衡组件。根据Ribbon中的负载均衡策略,每次都会返回给Feign一个Ip地址用于服务调用。默认状况下,是均分方式,好比有ip1,ip2,ip3,那么这个时候来了10个请求,那么他就先给Ip1,再给ip2,再给ip3,这种轮询策略将请求分布到不用别的服务器上

那么若是这个时候其中一台服务器的服务挂掉了,会怎么样呢?内部服务调用还能继续吗?内部又会发生什么操做呢?

首先固然本次内部调用确定会报服务内部错误,由于服务都调不通了嘛。接着出现问题的服务器没法与注册中心进行心跳检查,这个时候注册中心就会将这个注册信息状态改变将其实例下架。而后各客户端就会更新本地注册表。那么当再次内部服务调用时就能够调用到可用的服务器上的服务。

那么若是当一个一个服务器上的服务都崩溃了,这个时候支付服务都无法提供服务了,这个时候又会怎么样呢?那这个时候全部调用该服务的线程都会卡在这个服务的调用没法往下走,这个时候严重时会致使调用该服务的服务也奔溃没法服务。

这个地方显然是不合理的,A服务挂了,关我B服务啥事,最起码不要让我也挂了呀。这个时候就会引入一个新东西:Hystrix(熔断器)

Hystrix服务熔断与降级

咱们能够把熔断器想象为一个保险丝,在电路系统中,通常在全部的家电系统链接外部供电的线路中间都会加一个保险丝,当外部电压太高,达到保险丝的熔点时候,保险丝就会被熔断,从而能够切断家电系统与外部电路的联通,进而保障家电系统不会由于电压太高而损坏。

Hystrix提供的熔断器就有相似功能,当在必定时间段内服务调用方调用服务提供方的服务的次数达到设定的阈值,而且出错的次数也达到设置的出错阈值,就会进行服务降级,让服务调用方之间执行本地设置的降级策略,而再也不发起远程调用。可是Hystrix提供的熔断器具备自我反馈,自我恢复的功能,Hystrix会根据调用接口的状况,让熔断器在closed,open,half-open三种状态之间自动切换。

open状态说明打开熔断,也就是服务调用方执行本地降级策略,不进行远程调用。
closed状态说明关闭了熔断,这时候服务调用方直接发起远程调用。
half-open状态,则是一个中间状态,当熔断器处于这种状态时候,直接发起远程调用。

使用了熔断器以后,那么服务之间就不会有强耦合,不会致使服务间崩溃连锁反应。从而保证了服务的高可用行,提升了服务的可服务时间。

相关文章
相关标签/搜索