00:00
前边我们说了一下C诺呢,对我们整个服务每一个请求的流控规则,那接下来还有一种场景,我们以咱们这个商品详情页为例,我们每次来查询详情页数据的时候,来给给大家打开看一下,那详情页查询的这个controller,在这我们详情页的controller,每次查每一个详情页的时候,来点进来,除了查自己的详情信息外,我们还要远程查询我们的SQ的秒杀优惠信息,相当于我们会有一些远程调用,而在我们整个电商系统里边远程调用非常多,那么现在呢,对请求可以来进行流控了,当然如果是AB服务之间的这个远程调用,那B服务炸了怎么办?所以我们现在呢,就要做一个熔断保护机制,我们要有断路保护,以前有has直接可以来做这个,那么现在来看S该怎么做,包括我们最终来结合S还可以对某一个服务来做一个降级,比如这个B服务性能太慢了。
01:00
或者我们这个高峰期情况,我们让B服务呢,降级运行,直接返回这个数据就行了,那也不让他来调真正的业务代码了,那么来看这两个功能都怎么做,那么现在呢,想要测试两个功能,那我们在这来注释一下来现在来测试使用咱们这个S来保护我们这个份的远程调用,来保护份远程调用。也就是我们说的这个熔断机制,来看这个熔断怎么做,如果这个远程服务一旦出现问题,那现在来看我们目前的效果,那这个秒杀服务我来停掉,这个服务呢,我们来模拟宕机下线,那如果是这种情况,我们出现问题,我们来看现在的我们这个页面,我来刷新。我发现这个商品服务呢,等了好久,我们的这个秒杀服务等不到数据,然后呢,诶他在这儿等了一秒多,然后在这儿直接来报错,说我们这个远程服务呢连接不上,那原因就是我们在这儿来进行调用的时候,我们这一块呢抛出异常,导致我们整个ctrler出现问题,那么现在呢,就要引入我们的熔断保护机制,即使我们这个远程服务宕机了,崩溃了,那也没关系,你也不用等这么久了,或者怎么着你呢,就直接给我认为远程服务的这个数据呢,返回异常你也别掉了,我们可以用一个默认数据,大家都没优惠也行,我们来看这个熔断怎么做,因为我们要整合份们来参照s cloud阿里巴巴center这个官方文档,来看一下我们这个主流框架的适配,还是这一块。
02:34
来整合的是spring cloud spring cloud的这个start们,来看我们整合份该子怎么做,我们前面呢已经能对流量来进行限制流控了,然后下边我们这一块份的支持所呢,适配了我们这个份组件,所以我们现在呢,如果想使用只需要引入我们这个starter,我们这个其实已经赢了,然后如果我们有了份以后,诶它在这呢还加入了open份们现在每一个服务都有份,我们只需要呢使用一个配置,将要开启我们这个份S这个功能,那么接下来呢,就可以对份我们来做一个熔断,比如这个熔断呢,有一个这个示例,我们这有一个分client,就是它,它呢将要远程调用这个接口,但这个远程方法呢,可能出现问题,它在这呢有一个配置叫forbank forbank指定。
03:24
我们这个出现问题以后呢,调哪个方法来返回默认数据就行了,咱们现在要做的就是这个事情,那这个事情里边导包这些我们全都有了,所以现在只需要加一个配置,那加给哪呢?我们先来看A掉BB容易炸,我们现在呢让A感知B,把B熔断了,A要得到一个默认数据,所以我们可以给调用方来配置一下,我们来到这个商品服务里边,我们来到这个调用方,我们来加上一个配置,就是份来开启份的这个sent这个功能来写一个处,而且没开启之前,大家注意看我们这个调用方的控制台,我来看我这个获取一号商品的详情,来到我们的这个调用方,我们商品服务这个触点链路里边,这个一号呢,现我们全部通过了,但是失败了,但我们现在只能看到我们的这个页面信息,我们看不到所有的远程调用这个链路。所以我们现在。
04:24
那呢,先第一步来开启了份S的功能,我现在这个开启以后,我来重新启动一下我的商品服务,那重新启动商品服务以后呢,我们接下来还是先来开启我们的秒杀服务,来看正常情况下有没有影响正常功能,没有影响正常功能的情况下,我们再来做一个宕机来测试,现在我们来开启了份这个功能,那开启了以后呢,在一切正常的情况下来稍等这个商品服务好,我们这个服务呢都启动成功,商品服务也启动成功,来看现在正常情况下不影响功能,我来刷新页面呢,是可以展示的,接下来我们来模拟宕机,而且呢,我们现在来看我们这个控制台里边,除了能监控到我们这个页面请求外,它其实将我们这个份的远程调用,它也监控到了,所我们一开启以后呢,这个其实就能监控到。
05:16
而监控到以后呢,我们现在可以有两种办法,第一种办法我们可以对远程服务来做一个限制,或者呢,用他的这种办法,我们说如果远程的这个服务失败了以后,调什么方法,所以我们来到我们的这个份客户端来看一下,我们这个份客户端里边呢,我们就来调用它在我们的这个份客户端里边,Second这个份我们现在来指定一下ready,我们现在希望熔断保护,而不是报错,那么来指定一个for bank forbank呢,就是说我们出错了回调哪个,那这个回调呢,我们只需要写一个类来实现这个接口就行了。实现接口的好处就是接口上有多少个远程方法,其实我们要实现接口就要对这些方法来做实现,实现的目的就是远程出错了来调用我们本地实现。
06:02
好,我们现在呢,来添加一个,我们现在呢,全部都到forba包里边,我们有一个呢叫second kill,我们份service的这个forba,那么这个forba呢,还是来实现我们这个phone service second kill。我们的份service来添加上它的这个实现,添加上实现以后呢,接下来就会返回一个数据,现在这个远程方法如果出现问题以后,那么就直接来返回一个R,那R呢,返回一个errorr就行了,我们以前还有一些错误number码,比如我们这个错误码呢,就是to many request,太多的请求,然后呢,杯子code点一个我们这个太多请求的错误消息,我们都可以拿到这好,那现在呢,就来做这么一个,包括我们这一块呢,是一个code写错了,点一个get code好。我们这个呢,有了这个默认回调以后,只要我们这个远程出现问题,我们就可以来指定你给我默认使用这个second kill份service for来做默认回调,而且呢,注意。
07:09
我们想啊,这个方法如果出现问题,肯定要掉这一块来做默认数据要调呢,肯定是对象掉,所以这个我们还要给容器中来添这个组件,它不会自己为我们创建对象,我们把这个呢当成组件来添进去,那现在来重新启动我们的这个商品服务,而且如果这个方法掉了,我们最好在控制台打印一下,然后明显的看到这呢有一个log,点一个info,好,我们这个熔断,熔断方法调用,我们这个get SQ这个secondqo的这个熔断方法呢,已经调用了,我们现在来启动一下我们的商品服务。那么启动的同时我来模拟我们的这个订单,不是这个订单是我们这个秒杀服务给宕机,那宕机如果是我们以前我们要等好久宕期了还会出错,那现在我们加入了熔断保护以后们来看会出现什么问题,好现在这个商品服务呢,是启动成功的,那现在加入了每一个远程回调的熔断保护,我们现在来测试一个远程调用,我来F5刷新,那这个远程调用是失败的,但是我们这个页面呢,没报错,没报错原因就是呢,在这调用呢,我们这个熔断方法来看一下,那么这一块呢,还没有打印我们这个熔断方法,那没打印的原因肯定是我们这个日志设置的问题,那之前可能为了方便我们把这个日志我们来找一下,那这一块的日志,日志呢,按特硅谷只打印AO比级别的们,让他打印一下英O级别的,好,我们先来重新启动。
08:40
那只要我们这个远程服务宕机,我们也不会出现我们整个服务的崩溃现象,我们调用了我们的默认回调,默认回调里边呢,告诉我们现在是一个失败,那现在要做一切成功的逻辑,那肯定就在web里边,我们web里边我们来看调用的时候,我们在这儿呢,凡是调用远程方法,我们都会判断远程是成功还是失败,如果远程服务直接宕机了,这一块你成功失败都拿不到,那是拿到的是读取超时。
09:12
会导致崩溃,而我们现在呢,我们远程服务器是宕机了,我们呢,调用本地的回调返回了一个失败,一时失败以后呢,我们就进不去了,所以我们整个的逻辑是运行过去了,那不会出现我们的页面的崩溃现象,我现在做了一个断路保护,好这个断路保护,而且大家注意,第一次保护呢,很慢,以后多来几次,我来F5F刷新,现在这个页面呢,还是很快就直接刷新出来了,因为他知道了我们这个断路保护了以后,它再来调用这个方法以后就不去掉了,一段时间呢就不去掉了,那看每一次呢,都执行了我们这个熔断方法。那我们现在还可以来测试,我们现在测试的第一个,那就是我们来到秒秒杀这一块来备注一下。我们可以给调用方来。
10:01
做一个熔断保护,那在这儿使用呢?那现在来做的第一个方式就是调用方的熔断保护。调用方的熔断保护很简单,我们只需要来加一个配置,开启我们这个粪的这个熔断功能,我们来到这儿来看一下。调用方的熔断保护,第二个我们这个调用方现在也能感知到,它会远程调一个方法了,那就是我们这个古mail s second kill这个SQID,那既然他能感知到了,我们还可以手工的在这来指定降级策略,好,所以呢,这是第一个调用方的熔断保护,第二个我们在调用方,调用方手动指定,手动指定咱们这个远程服务,远程服务的降级策略。我们来看一下这个能不能生效,比如我们这个远程服务,我们在这儿来看一下。远程服务呢,我来指定一个降级,然后呢,这有一个异常比例,还有异常数,还有一个RT,那我现在假设以RT为准,RT呢叫响应时间,响应时间呢,你小于每个请求都超一毫秒以后,我们还能指定一个时间窗口,这都是什么设置含义,我们可以来在这看一下。
11:18
我们还是来参照这个spring cloud的这个官方文档,这个spring cloud阿里巴巴这一块我们来看一下,我们这有一个熔断降级,如果我们想要降级一个服务,我们现在来指定的策略,第一个叫平均响应时间,平均响应时间呢,我现在指定了一个1U1的这个单位呢,是毫秒,那意思就是。这一块当一秒内持续进入五个请求,就是一秒内的五个请求,他们的平均响应时间都超过了你指定的一毫秒,那接下来的时间窗口,比如我指定了一个时,那就十秒,接下来的十秒内我们都会自动的熔断,这个方法就不会远程调用了,所以们相当于我在这儿来设置响应时间来窗口写一个十,那就是十秒内就不会远程调用了,十秒以后呢,还会重试一个远程调用,我们来点一个这个我们现在来添了一个降级策略,我们来看这个策略能不能生效,我们现在来看我们的控制台,商品服务的控制台,那能不能生效呢?我们就在这儿来刷新我们的这个首页来看一下,因为现在呢,既加了熔断,还加了降级,我们看哪个是生效的,我来F5 F5我们来狂刷上几下,那现在呢,疯狂刷新以后,那接下来我们应该十秒之内就不会再来掉这个远程方法了,所以每次呢,肯定是这个熔断方法。
12:40
那每次是这个熔断方法,我们在这儿呢,看不出效果,我们就把远程的服务启动起来,而且呢,让它超时一下,来看能不能有效果们这个远程服务的controller来到这们现在要查每一个商品的这个,然后呢,我们就来让他超时一下,随便来thread点一个sleep,比如我们来睡上300毫秒,好,这个呢时间挺短的,那现在来给它刷片吃一下。
13:06
来重新来启动我们的这个second kill,我们的秒杀服务,那秒杀服务呢,现在是正常上线了,你也不用熔断了,那我们设置的这个降级策略有没有作用呢?就是我也等不及你的这个远程服务,来看一下降级策略有没有作用,来等待我们这个秒杀服务的启动,好,我们这个秒杀服务呢,先已经启动成功,那先来删除掉我们这个降级策略,把这个降级策略呢,我们先去除掉,那来到我们这个订单服务这个链路里边呢,它能感知到要调用远程服务,那现在来看。这次远程服务呢,是启动成功的,我们的调用呢,肯定不会触发我们的熔断方法,来看一下我们的效果,那么这个远程调用走。好,远程调用成功,我们来看我们这儿有没有触发熔断,确实没有触发熔断方法,我们在这儿呢,疯狂刷新也没问题,F5FF5,因为远程服务呢,挺慢的,我们睡了300多毫秒,好,现在呢,我们都没有调用熔断方法,我们来手工来指定一个降级。
14:06
我们现在呢,假设商品服务觉得它等不及远程的这个服务了,怎么办?我来指定一个降级,降级的策略呢,就按照响应时间,你小于一毫秒,十秒内我就不掉了,好,我点一个新增,所以我们现在要做的测试,就是因为他要测一秒内的五个请求,要是没有达到你说的这个指标,他才开始来做这个策略,我们就来疯狂刷新,好在这儿夸夸我来疯狂刷新,那疯狂刷新以后呢,我们现在肯定疫苗有五个请求都没有达到,我们现在看到,诶,它调用了我们的这个熔断方法,比如说你现在没有达到要求了,那就调我们的熔断方法。那我们这个十分十秒以后,因为我们这个现在指定的这个策略就是整个窗口期是十秒,而我这十秒内我就直接熔断了,不去掉了,那十秒以后的这个请求,我如果再发,他肯定还要尝试调一次,所以如果我来发的频率慢一点,那没啥事儿,F5那慢一点,这就准备查询,F5慢一点准备查询也不会打印,我们这个熔断方法调用我慢一点好。
15:14
它打印不用调用,如果我快一点,只要达到它的这个指标,一秒内的五个咔咔咔咔咔好全部超时了,那接下来它十秒内你刷新的所有请求全部呢,都会调用我们的这一块熔断,好我们现在呢,已经看到这个效果了,所以我们现在可以做到的就是第二个我们直接可以在。调用方。你觉得你等不及哪个服务了,我们在调用方手动指定远程服务的降级策略,但远程服务呢,一旦一被降级以后,就跟他停机是一模一样的,一被降级以后呢,就会触发我们自己的熔断方法,所以我们来到这儿,然后呢,远程服务一被降级,远程服务被降级处理,降级处理也就是我们森呢,不去帮你让你调这个远程服务了,一旦远程服务被降级处理,那就会默认触发,就会触发我们的。
16:08
触发我们的这个熔断毁掉,熔断毁掉方法,所以这是我们都来设置调用方的,当然我们也可以来设置远程服务,远程服务你在哪块设置呢?其实都是一样的远程服务。但问题呢,现在就在这儿,我如果直接在远程服务的这个链路上,我来做一个设置,我们这个商品服务呢,我们现在通过这个触点链路,我们发现呢,它都会调用这个远程的SQ second q这一块,那么就来到远程服务,远程服务呢,我们直接对这个来做一个流控,但是远程服务呢,发现我们在这儿呢,可以来指定降级,但是这个降级呢,就非常精确了,因为你调了哪个商品,那就在这儿降级哪个,所以你在这儿如果来做一个降级。你在这儿做降级的这个好处就是我们可以让远程服务不停机运行,但给你返回默认数据,缺点就是我们现在呢,如果我在消费方,注意这有一个我们的调用方生产者,我们去来调用我们的服务,那这个是服务的提供者,我们如果去在提供方,我们在这儿去来指定了一个降级策略,我们其实呢,我们这个调用方还会调用我们提供方的这个服务,调用方应该是一个消费者,我们之前一直说反着好,那现在呢,他还会调用这个提供方的服,所以我们一般呢,可以不去来在我们的这个提供方来做这个降级,但是做降级也没啥问题,比如我们来看一下我们提供方,我们现之前呢,有这么一个请求叫current second qsqs,我们现在呢,对这个请求我们来做一个降级,假设别人呢会来调用你。
17:54
别人呢没有设置降级策略,但是呢,我们现在比如网站流量现在超大了,我们人工的在后台。
18:01
我们来关掉一些没必要的服务,比如秒杀服务里边的这些,我们来直接给他指定降级,所以呢,它的这个使用场景是这样子的,远程服务,比如我们这个超大流量的时候,超大流量的时候必须必须牺牲一些咱们这个远程服务,那么就可以在服务的提供方,在服务的提供方,也就是我们的远程服务来指定一个降级,远程服务来指定我们的降级策略。这样的话呢,其实我们这个提供方,提供方是在运行中的,是在运行,但是呢,他却不去真正运行他自己的业务逻辑,他返回的呢,是熔断数据。但是但是不运行自己的业务逻辑,然后呢,返回的是默认的熔断数据,这个熔断数据呢,其实如果我们是在远程方的话,它就应该是限流后的数据,因为我们无论是降级还是限流,最终相当于呢,把你限制住了,你在这个远程调用方。
19:18
只要限制住以后呢,我们还在专门的这个订单服务里边,我们写过一个配置,就是这所有的限制都返回的是这个节省数据,就是这个错误的,所以我们也可以在这儿来做这个限制,我们来看一下,那现在呢,还是如果你的这个响应时间小于一,然后我就在十秒内就限制你十秒内呢,直接返回错误,我点一个新增,这是我们在这个提供方来做限制的,来看这一块,如果我们慢慢的请求啥事儿都没有,诶因为它是统计一秒五个,但是我们迅速的请求得得得得得得好,现在请求流量过大,那十秒内呢,都会得到请求流量过大这个效果,所以这是我们在我们的提供方给我们来做一个降级,一般在提供方能做降级,那都是考虑到我们这个全局问题了。
20:08
我们全局流量太大了,我们不得不手工的让一些服务以降级的方式运行。你说人家没运行的,人家运行的接口可以访问通,但是呢,不去运行真正的业务方法,返回的是降级数据,诶这就是我们说的返回默认的就叫降级数据吧,因为熔断数据是在提供方,诶是在我们这个调用方,你调不过来了,这叫熔断了,这叫熔断数据,而我们这个手动的把它降级了,我们返回的这个数据,这叫降级数据。这都是一些概念,大家区分一下就行。那么现在呢,就可以使用森的在我们这三方面完全的保护我们这个系统,系统流量大了,我们可以给他降级上几个服务,这个这个这个服务所有的这些东东西我们都可以降级,包括呢,哪些服务宕机了,我们斯特呢也可以来做好熔断保护。
21:01
那这样我们的服务就会非常的稳定。那接下来大家要做的事情就是,既然在我们这个调用方,我们去来手动指定远程服务降级也这么方便,那么以后呢,为每一个服务,那都应该开启我们sentna的这个份代理功能,我把这个在商品服务里边们之前配过每一个服务我们都来加上份的这个S开启我们这个粪使用S来做整个熔断保护这一块功能,每一个呢都加上,那这一块呢,我就把下边这一块的所有的流程我们就忽略了,我在这儿呢加上,大家在下边呢也就加上。另外我们再来给大家补充一点,我们现在呢,让每一个服务都来加入我们这一段配置,我们现在来想一件事情,我们这个服务呢,无论是被sent进行限流了,还是我们自己手工把这个服务降级了,那森呢,默认返回的都是block的八那一串文本,但我们在我们的业务系统里边肯定要返回我们自己的这一块错误数据,所以我们就应该把这一块的配置,让每一个服务都应该有,这样,每一个服务只要被限流降级,它返回的这个数据呢,都是我们这个接串好,那我就把这个,我就来复制CTRLC,我们就应该放到每一个服务,那大家呢,就给每一个服务里边放就行了。
我来说两句