00:00
好,那么同学们,接下来我们来说一下服务降级,那么呢,量。那么呢,降级又是什么呢?量怎么理解呢?来。我们就用最简单的一句话来给他完成,以及再看看我们的服务熔断会有些什么不好的地方来。整体资源快不够了,忍痛将某些服务先关掉,待渡过难关以后再开启回来。好。这就是所谓的将。那么可能有的同学说还是有点懵逼来。同学们,现在哈,假设我们有。三个项目组。现在呢,都很平等。每个项目组呢,有。
01:02
五个开发兄弟。那么这个呢,是我们的。A组这个呢是我们的B组,这个呢是我们的C组,然后呢,ABC3个系统都有对应的服务。来。反问着,我相信没问题吧?那么现在注意,我一步步的推进,给大家解释什么叫服务降级,你不要小看这句话。官网上那些长篇大论,我觉得你也没兴趣读。好。现在呢?岁月静好,挺和谐的。注意ABC3个系统对外提供服务,每一个项目组各开发兄弟来保持欧巴。
02:03
那么突然。有一天老板跟你说,由于我们的客户变动,极其重视A系统,那么现在A系统访问的压力也极大。那么现在。五个程序员扛不住了,那么这个时候干嘛?从保证优先级的角度,那么A系统的项目经理是不是只好求老大从C系统?是。借调对应的工程师啊。那么呢,这个时候是什么概念呢?整体资源快不够了,比方说这个A或者是这个大系统,我们需要就像是什么阿里的弹性云一样,现平时它只需要50这个数量。现在某一个时间段非常。高,那么它是不是就像有一个弹性一样,嫌忙分开,现在特别紧张的时候,我是不是需要从其他项目组借掉这些程序员过来啊?那么这个时候假设我A项目组借调过来的四个从C这,那么你懂的,C这块的话干嘛?是不是陈雪儿只有一个来勉强维持了?
03:17
那么这个时候什么概念呢?回我是不是忍痛,我们为了保证A是不是忍痛加C先暂时关闭啊,但是你A现在是保障了,那么干嘛C回我。这个时候是不是还有一些部分服务和请求在发送着调用的请求啊,这就好比什么银行ABC3个窗口,现在这四个业务员要被抽掉去干别的事儿,那么这个窗口是不是只好挂一个牌子,这写个暂停服务啊,那么这个时候你不能说给调用者一点说明都没有,否则的话调用者是不是就会生气了,那么所以说我们为了保证其他的。
04:01
假设先把C关闭,待度过难关关C支援其他的,那么言下之意,这一块被关闭了以后,是不是表示这个服务暂时不可用了,那么他的系统资源节约出来了,去给A了,但是C是还有一堆老客户来找他的,那我这儿是不是应该给老客户一个回应,一个友好的降级处理,来保证我们的服务来维系和之后等A用完了再度过,A渡过难关以后再回来重新开启C啊。那么所以说呢,有这么一个。资源抢占和分配的问题,那待会我是不是叫演示啊,关掉其中的一位服务啊,刚才我们的演示啊好端端的只是查不出来,或者程序调用中服务,微服务是没有宕机,微服务是好好的,只不过是报了一种异常,当然那个异常是不是因为我查出烂了以后我人为的抛exception呢?那么这个时候我们来来看看。
05:07
服务的降级处理是在什么端客户端实现完成的,与服务端没有关系。啥意思啊,你把它当做一个银行窗口。这贴了块牌子叫暂停服务,你懂的,这些服务顶的时候,只要看到这牌子,是必然会往B或者又往A旁边去跑啊。那么这个时候相当于说服务降级,降级降了谁的,是不是降了C的呀。它降了以后干嘛,系统资源节约出来,是不是去支援别的了,就像弹性云一样的概念。那么好,这个时候我们往下翻第二个问题,请同学们。回到我们刚才处理的内容。大家觉得这结合我们的po的思想。
06:02
有什么问题我们先不要说其他方法,我们就说一个get。大家思考。半分钟。好,那么来,刚才呢,同学们也讨论了一下,那么这个时候的话呢,请听我分析。我们的前面讲的服务熔断,某一个方法调不通了,自然而然会有一个for back兜底的帮你处理,异常的处理,超时的处理。不顺利情况的一个处理方法,第一步没问题吧,但是这个时候会产生一个问题,就是。主人。你这个controller的现在的业务方法get,那么我再加一个list呢?我再加一个A呢?我再加一个update,再加一个delete呢?它是不是会导致每一个真实业务方法都会有一个替你兜底,替你处理异常的一个for back方法呀?那么这样是不是有两个问题带来第一个方法膨胀。
07:04
我有一个get方法,做真实的业务逻辑处理,必然会有一个针对于get的for back方法,那么假设我下面有个update方法,那是不是又会有一个for back方法呢?Update,那么这样你加一个业务逻辑方法,我是不是叫加一个strict command?容易方法膨胀这一步同意否?第二步。根据我们的spring的原则。A op变相切面的编程,你不要忘了这个技术是不是叫spring cloud,那么既然叫spring cloud,只要是spring的思想概念,能不能用呢?可以,为什么?这个时候大家请看看我们这个问题。我现在是不是把controller调service层,Service层的get方法,那么我现在干的事情是不是把主干的业务逻辑和我们处理异常的切面整合在一块了,他们产生了高耦啊。
08:07
我们在学的时候,面向切面的时候,是不是学过一种东西叫知若,那个时候我们是不是干过一种东西叫前置通知,后置通知,环绕通知,异常通知啊。把我们前面这个方法整理出来一个意思,这哥们它是不是就是一个异常通知的处理啊,那么最好是不是实现一种效果,就是我的业务方法跟我的异常处理不要耦合在一块儿。我这个里面还是应该是干干净净的业务主逻辑方法,这么说大家同意否?那么所以说我们现在借鉴这种思想,就要完成我们新的内容干嘛呢?实现解耦和分离。第二个避免你每天加一个方法都要出这么一个historys command,那我得添多少,你懂的。这个时候是不是要乘个二啊,假设我有十个业务逻辑方法对应的是不是也要加上十个?
09:05
这command注解,第一个方法膨胀,第二个处理异常,和你的业务逻辑绑定在一块,高耦合,这个是不是程序的维护性,健壮性,美观性都不OK,那接下来。我们需要对。接口做处理。干嘛呢?请大家看我们这些方法是不是调用的要在接口里面呢。那么如果我们这些。Command这种异常的处理方式,熔断的处理方式通通在接口绑定,那么是不是可以跟我们的主逻辑?Jiao。那么这个时候我们来看看,根据这个思路,我们呢往下翻。一。修改我们的API工程。根据。PAR接口新建一个实现了fall back,那么大家请看这是不是又建一个东西叫fall back。
10:05
干嘛?我们呢,刚才可以看到这是不是有for back,甚至我文字里面也是不是说了叫返回一个符合预期的可处理的被选响应for back呀,那么这个时候请看。根据已有的depart client service啊,注意这个这个是什么东东接口,这个接口是我新建的,也即这个接口里面也有对对堆方法,这么说能理解干嘛呢?这是我以前的depart service也记我复制这么一份。我重新叫depart client service,这个里面也是也有这堆方法,这堆堆方法里面干嘛来进行针对于每一个方法在接口上写熔断处理,那么这样是不是就跟我们的主程序解耦了?好,这是第一步,新建一个实现了for back factory接口的类。Depart client service for factor。
11:02
不用讲,那读完了以后,我们同学们一定是崩溃的,是怕这你说什么呀,根本听不懂,平时没办法,我们呢,直接来按照我的要求请看。修改API,我们说过API是不是公共NTT公共接口啊,那么呢,回到我们的程序吧。API这service大家看这我们是不是有个。Depart client service啊,之前我们讲FA的时候是不是写过了,大家告诉我,那么现在我可能在ctrler调用get方法出错,Get方法是不是实质而然,也就是调我们service接口,那么我为了解耦,我是不是直接在这个上面做动作呀,请看这句话。
12:03
修改这个工程,根据已经有的这个接口。回我。怎么操作?今天一个。实现了发接口的类。Depart collect service for factory。好,那么呢啊在二我新建一个类啊这个名字啊,没问题吧。这个类要实现这个接口。R这个接口,它里面要实现这个接口。嘿货,大家能否理解?
13:05
别的你去不管。What?现在我是不是要针对于这个接口里面的方法来进行服务的降级处理啊,比方说我现在干嘛不想在每一个get方法的脑袋上都标着这么一个,我把它提出来,那么提出来以后提到哪,提到接口上针对于这个接口,那么请看。我是不是新建了这么一个类,这个类要实现for back接口,那你这个fall back是不是。叫什么呀?备选响应啊,那么也就是说我现在create,你看这个接口里面是不是只有一个未实现的方法叫create,我干嘛呢。我针对于谁?我department client2。
14:01
来。能不能理解这个意思啊?相当于说我现在的这个里面是不是带着get at list,那么言下之意就说我是不是通过这个接口,把你这个接口里面要调用的方法呢,每一个的熔断机制我都统一的放在这个类里面处理了。那么是不是就可以实现跟前面的前面这个CTRL了这个类进行解耦啊,那么好,我们这儿干嘛呢。有个大咖。千万不要在这个类上面,哪个类就这个类上面。添加注解component组件,否则不好使。那么说1000道1万以后,杨哥你这个代码干嘛呢?刚才我们说了,我们新建一个类。
15:02
这个类要实现for back factory接口是不是由他统一来处理熔断啊,那么你要对哪个接口呢?对depart client service这个接口里面是不由我们那些增删改查的方法,那么所以说呢,我们呢,一条龙的拿下。看。这个不能丢,第二个新建这个类实现这个接口,这个接口里面是不是有这个东东,这个接口只有一个方法是create,干嘛我要针对它创造熔断,那么来,现在请看。没有对应的信息,Consumer客户端提供的这样的信息。此刻。怎么着已经关闭,我们现在要模拟的一种情况,是不是就是我们刚才所说的把C暂停服务啊,那么如果来调C的这些东西,假设我们来查c get不好使,那么你这个时候是不是要给我一个回应,那么这个回应我写的信息就故意写成这样,就说待会干嘛?
16:09
忍痛将某些服务先关掉,我会主动的关掉一个微服务,但是现在来模拟有其他用户请求来调这个已经被关掉的微服,应该怎么办?那么这个时候是不是这句话就会弹出来啊?好,那么这我们完成这一步以后往下看。修改我们的API工程要在我们的,你看我们的depart client service这个是一个接口,昨天讲费的时候是不是针对于这个微服务加上费这种功能啊,那么现在我们要加上服务熔断干嘛呢?在这个非client当中添加for back属性值啥意思?请跟着我来。嗯。
17:02
这是上一讲的。是这一讲的。你打卡。我现在相当于说你part service这个接口,这个接口。一锅端统一处理这个接口里面的任何一个方法出了事,通通的是不是找fall back发出,那么谁实现了forback factory?那么是不是就是我们刚刚定义的这个类实现了fall back factory?这个时候是不是不用再一个一个的添加,而是一锅端啊,那么言下之意,我们呢,往下看。这个时候剩下的不到那么呢。给同学们搂一眼API现在干什么呢?我是不是又添加了这么一个,以后我重新要clean和因素,重新打包AP下角架给别人调用啊,那么这个时候呢,切记哈,再重复一遍。
18:03
不想让它一个方法添加一个history strict command,要实现解偶用我们spring面向切面编程的支入加异常通知,这是第一步,能跟上,是不是要避免代码膨胀和业务逻辑和异常处理分离啊,那么呢,我们不想一个方法添一个,那么干嘛呢?我们这些方法哪来的?我们这些方法都是接口来的,那么所以说我干脆针对于昨天我们写的一个接口。干嘛呢,要有一个。这个接口里面假设有三个,有30个都一样,就代表你们这三个或者30个方法出了事了,找谁找for back factory没问题吧,那么fall back factory有谁有他为什么?因为我是来负责给大家收拾烂摊子擦屁股,给大家来托比的,没问题吧?那么呢,这个时候来看,因为我做演示list和ADD,我就不再详写了,我们就写一个get来演示,这个意思好,能么能完活以后请大家看。
19:14
API干什么呢,我们的。好,那么呢,大家看success成了,那么现在我们在store。好,那么呢,如果一切顺利欧了,那么说明我们这个API这个包现在是不是又多了这个和这个新的功能啊,好,那么接下来干什么呢?回到我们的API,请看。Consumerpart废工程。修改押貌,那么干什么呢?我们这儿。
20:00
请看。这是我们的yama,那么我们要修改一个什么东东呢?Depart费哈,Depart费。这个ya里面我们要添加这么一句话,哎,Stricts enable,不是不是开启啊,那么为什么呢?因为我们这个API这个接口,大家看我们写在这个上面,它是不是FA client里面用for back factory这么方法来搞定啊,所以说呢,在这我们的depart FA。到三级,干爹添加进来。OK,那么接下来我们就来验证一下干嘛呢?来。老规矩。三个有热卡先启动,然后微服务DEPART8001再启动,然后刚才我们的depart费再启动,共计五个工程能跟上,然后呢,我们呢。
21:10
再干一件事儿干嘛?是不是正常访问没问题,然后我故意干坏事关掉我们的微服务提供者,注意什么关闭,是不是故意关闭啊。那么正常调用不OK了,就像我们刚才所说的,本来调的好好的,突然关掉以后,C这是我们的8001,是不是暂停服务了,那么其他人调用是不是就应该收到我们刚才出现的。那个有好提示啊。好,我们呢,把思路理清了以后,接下来我们来看一下能不能。7001。7002那么呢,7003,注意此时是provider depart8001那么呢,Provider depart8001跟我们前面那个没关系哈,然后呢是depart fe,为什么呀?为什么用depart fe?请看这句话,服务降级处理是在哪个端客服端。
22:19
与服务端没关系,我这服务端是不是已经最后要暂停啊,那么好,我们这儿呢,完成这一步depart费,那么呢,Depart费启动。好,那这个东西的话呢,我们呢,暂停一下录屏,给他启动服务注册需要一点点时间。好,那么呢,服务呢,已经全部启动完成,我们在有人卡上面已经看到集群和我们服务员起来了,那么现在先看正常访问。大家看一号记录是不是OK啊,那么好,那么接下来请大家看我们要干的一件事是什么呢?
23:01
故意关闭PROVIDER8001。那么呢,这个时候我们呢,可以看一下我故意关闭了8001的后果是什么呢?那么请大家看这是不是8001啊。欧了,我挂,那么呢,大家懂的。现在我们的微服务提供者8001是不是已经。暂停服务了,那么现在有集群加一个消费者,有点类似于这个。C系统的兄弟就是8001是不是被抽调过去支援A系统去了,那么呢,忍痛将8001服务先关掉,但是有可能这个服务现在是不是还是在访问呢?那么这个时候我们大家呢,来看一下,那么呢,我们假设刚才是一,现在换成二。大家请看。
24:01
但客户端提供了降级信息,此客服provider已经关闭。没问题吧,当然这个内容啥意思啊,这个内容是不是我在这儿。写的这个内容啊。那么当然你可以根据你的诉求,是不是随便去写你想写的任何内容都可以啊,那么这我们想说的一个问题是,就是。首先我去调用我们呢,也看到了提示信息,也是此时服务端R已经看了,说我是不是故意关闭了8001。但是我们做了服务降级处理,也就是说我们现在的这个consumer,那么大家看我们现在做了降级处理,我说过了,我是在是不是在consumer department们一啊,那么干什么呢。让客户端在服务端不可用时也会获得提示信息,而不会挂起house的服务器完成的是这个意思,大家能跟上。
25:11
那么这样的话呢,就彻彻底底把什么我们。8001的。暂停服务这种损害情况是不是降低到最少,因为如果就算我现在去调,OK,我收到这个提示以后,使服务已经关闭,就好比本窗口暂停服务,今天下午两点以后才能办公,那你跟我讲,任何一个服务看到这个消息后面,它是不是不会再反复的调了?那么这样的话,变相的是不是服务就降级了,因为调我的人就不多了呀,同一房,那么这样的话是不是起到了对我们整个系统的一种保护和友好的提示,完成了这样的一种信息,让客户端在服务端不可用时也会获得提示信息,而不会挂起耗我们的服务器就是这个意思,这个就是我们的服务,看题OK。
我来说两句