00:00
好,接下来呢,我们再来说一个功能叫服务降级,它呢也是我们在分布式系统里边来提升我们系统高可用性的一个手段之一。什么是服务降级呢?哎,这有一段解释,他是说当我们服务器压力剧增的情况下,我们啊可以根据实际的一些业务情况以及流量,对某一些服务有策略的不处理或者简单处理,达到什么目的呢?是想要让他们来释放服务器的资源,而达到保证核心业务流程正常高效运作的,也就是说是为了牺牲某一些人的利益来达到我们的核心利益,是吧?那比如我们这个服务器A服务器,A服务器呢,可能上边跑了不止有一个服务,比如有用户类相关的服务user service,那么还有订单相关的服务,比如order service,还有呢,我们广告相关。
01:00
相关的服务underwaar他service等等等等,然我们这个服务器呢,A服务器现在啊流量很大啊,我们有3000多并发同时在处理啊,服务器呢,处理极极剧缓慢,那我们需要牺牲某一些人的利益,比如光广告服务啊就有1000多个并发,如果呢,我们把它屏蔽掉,哎,那剩下2000个呢,都留给他俩啊,剩下啊2000个都留给他,让整个服务器只跑他俩服务,那就会非常迅速了。那我们想要屏蔽呢,就可以通过我们说这种方式叫服务降级,大呢支持两种服务降级,第一种呢,就是呃,强制的返回为空,也就说当我们想要调这个服务的时候,我们不去不发起我们这个远程调用,直接呢,你想要调它,我就给你从客户端层面给你返回微空,我们这个服务器就不会受到我们这个要远程调用广告服务的这个。
02:00
求了,所以说呢,就能省一些资源,这是第一种,第二种呢,也可以叫当我们调用失败以后,返回为空,特别是我们以前呢,试过一个超时时间,比如我们这个广告服务,当服务器大量并发过来以后,我们服务器每一个服务都处理的很缓慢,广告呢也处理的很缓慢,这样的话呢,到达了一定的超时间还没处理完,我们可以用这种,哎,当我们超时了以后,我们也给它返回为空,但是呢,这种就是服务已经调用了,而是在调用失败,比如我们网络超时,网络不可达等等各种原因来容忍我们不稳定因素,有些服务器啊,在一上线以后,由于网络波动,可能呢,你经常调不上它里边的一些方法,那我们呢,就可以通过服务降级的手段,通过来牺牲某一个非核心业务的这个占用资源能力,来达到让其他核心业务能占用服务器更多的资源。
03:00
源这个设置怎么设置呢?哎,非常简单,其实呢,我们直接可以通过控制台,在消费者层面,当我们这个order service,我们要调用其他的服务的时候呢,我们可以在这儿直接进行屏蔽,诶我们这儿有一个屏蔽,我们来看屏蔽的功能是什么呢?它是不发起远程调用,直接在客户端返回为空,相当于是我们double的第一种,哎,就是force return呢,我们不调用远程服务,直接返回为空,比如说呢,来到order service里面的所有功能调用,我们直接返回为空,这是第一个,第二个呢,我们还可以写一个叫容错,这个容错呢,相当于我们说的刚才的第二个功能,当我们调用失败以后,返回为空,诶当我们调用失败,比如超时,网络波动等等,调用失败返回为空。好,那我们就来做一个简单的测试,我们把其他的服务呢,User service,因为有三个,为了方便,测试期间我们就留上一个就行了。
04:00
好,我们留了一个user service,留了一个user service,然后呢,我们来调用,那一切正常,那肯定是可以的来刷新,哎,这是一切正常的调用来刷新,看一下我们的提供者。哎,稍等刷新好,现在呢,我们剩了这么一个提供者,那这一个提供者呢,我们每次发请求,那肯定都是来我们这个提供者,但是呢,假设我们这个服务器就是1001号服务器,它里边呢跑了很多的服务,不止我们user service这么一个,而且呢,当前服务器资源占满内存百分百,CPU百分百,基本上转不过来了,那怎么办呢?我们可以通过把这个服务器里边的某某些服务能给他屏蔽掉,屏蔽掉以后呢,让这些服务来释放资源,服务器呢就有其他的闲时间和空余的资源来处理更多的核心业务了,那这个屏蔽呢,我们是在消费者这一段做的,就是说我们order service是要远程调user service的,来告诉order service远程调用的时候呢,我把这个远程服务屏蔽掉,那order service在调用期间就可以选择,要么我就直接每一次远程调用,我就不调了。
05:14
我就直接返回为空,要么呢,就是我们这个远程调用的时候,我来调一下,调失败了,我返回为空好这两种策略呢,分别就对应的我们之前说的这两个啊,False return不掉了,直接返回空和fair return呢掉了返回为空,如果失败返回空好那我们就来先设置第一种来进行测试,Order service呢,我们来把它屏蔽掉,所谓的屏蔽就是不会发起远程调用,直接返回空,我点一个确定好,屏蔽掉以后呢,相当于从order service这个客户端发起的所有远程调用,那直接返回为空,不会调用,那我们把这个控制台呢来清掉,特别是这个user service我来清掉,好我现在来刷新,哎,我发现呢,整个这个页面是一个空返回,那掉了没掉呢,我发现这个user service这一块也没有调用,所以说呢,它把整个远程服务屏蔽了,不去调用,那我们也可以在这点恢复,让它恢复调用。
06:14
我再来刷新,哎,现在呢,又恢复了,我们这个控制台又答应了,比如说呢,我们在线上可以实时的根据我们服务器的性能,哎,我们来屏蔽掉某一些服务,好把它屏蔽,当然还有一个东西叫容错,好把它恢复了以后呢,容错是跟屏蔽一样,还是让那个服务不可用的,只不过它的区别是要进行远程调用,而且调用失败以后才返回空当,我点一个容错,我点一个确定好,现在它容错了,我们去来调用,因为我们这个调用是成功的,怎么样失败呢?我们可以在order service里边,我们调用的时候呢,来写一个timeout,比如超时,我就规定只有1000。这是一个整数,而远程的这个user service服务呢,它的这个时间可能会久一点,我们给他睡上几秒。
07:09
点sleep,好,我们来试一上两两秒,那相当于呢,我们这呢有一个调用,我把它surround with看一下M这有一个调用,它呢会超时,但我们为了测试呢,把这个user service肯定得重启起来。我们来重新启动。好,重新呢,放在注册中心里边,这个service服务呢,它会超时。然后呢,我们在这来调用,现在我也来重新启动起来。而且呢,我们对这个服务进行了容错处理,刚才的这个容错呢,我们说相当于是第二个策略,它还要远程调用,只有在调用失败以后才返回为空,而如果调用一切正常,那肯定没问题,我们来看一下控制台刷新好。
08:01
来等一会儿啊,他这儿还有。啊,我等一会儿啊,他还有之前的缓存来刷新一下,好,我们提供者一消费者一,我们来到我们的提供者来到我们的消费者啊,我们这个消费者呢,已经容错了,已经容错呢,我们再来调用,因为它会超时我们来刷新。哎,我们发现呢,就返回为空了,那如果说我们不容错的情况下。超时会是一个什么样的效果呢?我们来测试一下,我现在呢,不容错了,好,我们在这刷新,等它超时。好,我们发现呢,这会有一个控制台的页面报错啊,所以说呢,我们就可以快速的来返回为空来屏蔽一个服务,从而呢达到我们动态调配服务器资源的功能。
我来说两句