00:00
好,同学们,我们再接再厉,咬牙坚持啊,打到底哈,圆脸圆码过了一遍。那么接下来杨哥就带着大家。手写一个。负载的算法,那么主要就是我们真正的要懂原理加复习我们的GUUC哈,这个GUUC里面是CAS再加我们的。自选所的复习,那么这些,那么希望大家呢,能够作为内功的增长练习一下好。那怎么玩呢?尝试写一个,那么接下来我们呢,第一。7001702集群启动,那么这块有了,那么现在呢?来吧,我再次强调了啊,现在我有瑞卡上面只有两台了啊UP2OK。那么802802做一下微服的改造,那么改造个什么呢?我们现在要手写一个轮询算法,就是用我们自己的,不用它的,那么也是要达到的效果,就是我每次反问在这儿啊,那么哎,这块已经关掉了啊,那么801802801802,所以说只要一个端口,那么这块代码非常的简单,我就不在手敲,节约时间,801802上面男的我们手敲,重点我们手枪,其他简单的我们直接粘贴,我相信这个同学们应该。
01:25
没什么问题吧,那么好了。走到我们的8001的payment controller上面,我们过来将它很简单,它的意思是不是就把当前的这个。8001这个接口。你要调我返回,OK,那么这是我们的8001,改完以后由于我们加了热部署,它会自动的启动,那么这一块改的比较简单,我们就不再多废话,那么再找到我们的8002的payment也做一样的修改,那么同学们请看,那么802 802弟兄们没有任何问题吧?好了,那么改完以后801。
02:05
802去掉,那么这个是八零去掉好,那么下面order,也就是说我们现在要用自己的写的一个菱形算法来加深这些知识,这块还是有点讲究和啰嗦,那么兄弟们打起精神,那么由于改动的过程当中,八零长期时不时的就蹦出来启动,我已经先把八零停掉了,那么接下来我们开始我们的手写负载算法。来。第一步。兄弟们。在这个我们的配置类里面去掉这个load balance啊,那么很简单,为什么你要用你自己的,那么你。要给我证明你确确实实是用了自己的得写,对吧,你这个负载均衡,那么所以说我们在这个conflict这以前我们都明白,如果我们要用rib做负载均衡的话,这个是不是要加,那么现在我给它注掉说明什么,如果待会起效了,就一定是我们自己写的,否则要么就是不起效,要么就程序报错,我们再调好,这是第一步,第二步load balance接口,那啥意思呢?凡。
03:08
做现在干这么活的话,我们现在是不是都是要面向接口编程,那么你看啊,他这。我们呢,也是模拟人家来做这么一个接口,这么说能跟上他需要选择的话,也是需要哪一种负载算法,哪一些机器都要有做一个选择,所以说我们在这儿新建一个我们自己的那兄弟们这个package对不对?LB。这波。这么说,嗯,我看一下啊。就这样吧,都的balance啊,不不,这个是个接口,还不是个类,那么我们直接还是先建一个包名,然后在这个下面,那么同学们我们建我们的接口这一块面向接口编程,这么说能跟上,所以说有什么需求先写接口,那么这个接口要干什么呢?我们要做第一件事情,我们是不是要收集U瑞卡上面所有活着的机器总数,没问题吧,那么在这一块我们呢?
04:06
直接要写一个方法,那么根据我们前面讲的discovery这些东东啊,就是哎呀,刚才我们在8001上面啊,那么以前我们写过这么一个东西,拿过来给大家讲一下,在这是不是个。你看。Discovery。那就这个这个动作这一步能跟上discovery的这个,通过这个名字啊,要得到这个list,那么现在所以说我们呢,需要我们的service instance这个对象拷贝过来,那么写我们自己的这个。接口好这个接口,那么干嘛呢,初始化的时候。我们呢,就需要有这么一个list,那么这么一个东东相当于说。你直接有先做这一个方法,我们容器加载的时候,你就告诉我在这块service instance,那么在这块有这么一个方法,就得到这个list里面对象每一个service测都是啊,那么装到一个list测里面,是不是有点类似于我们的机器怎么做那么好,这是我们的第一步,那第二步就比较麻烦和啰嗦,同学们听好了,这块不许。
05:21
走12,这是个接口,那么在这块凡接口必然要有实线内,那么我们这个时限内就是。我们的MYLBOK,那么LBP,那么这块来。接口就有实现类,那么来兄弟们这一波走起,注意我经常在这儿写错,那么就是comment,那么现在就是我们要让我们的容器能够扫描得到它相应的内容,到这一步,那么同学们。来,我们讨论一下,先停一下录屏在这一步能不能跟得上,那么同学们OK,好到这儿,那么跟得上的话呢,我们呢继续,但是在写之前这儿呢,杨哥刚才手握写着写着的话呢,由于我们之前配这个规则,我把这个放在这个外面了,这是正常的,但是现在我们的LB要纳到我们的spring cloud这个体系里面,所以说我需要把这些包通通移进来,放在我们的。
06:20
Spring cloud这个下面这一波同学们能不能跟上,那么所以说我们现在的包名和接口名称就是at硅谷spring cloud.lb这块MYLBOK,接口要有一个实现内,并且加这么一个组件,我也是突然想起来,因为我以前编代码啊,经常这个我就忘记加,一运行的时候就说找不到或者报错,后来的话呢,也是哎,自己。也很郁闷啊,所以说我现在呢,写这个呢,也是要注意一些细节,好,那么在这块就填到头上,但是一填到这个头上,要想着它是在come硅cloud,在这个大包下面能扫得到,这么说能跟上,好,那么现在这个接口要求你得到这么一个东东。
07:05
那接下来完活以后有接口就要有这个实限内,那么这个时限内就是我们参考着我们的,呃。轮询的那个源码在这么写好,那么下面我们就要来了,人家用的是不是一个什么鬼啊,那么private。奥米和因钾原子类兄弟们还记不记得刚才是不是我们说过,那么初始值就是零,这一步兄弟们没问题吧?那么在这块我们自己的业务类要实现我们的负载均衡的算法,那么首先我们要得到这些机器的列表,那么这个怎么来的呢?那么我们前面呢,讲过我们的这个规则是吧,I。这个接口下面,那么同学们是不是要有我们的一个最经典的实现类轮旋,那么大家看这是不是有个这么一个动作,他怎么做的我也怎么做,模仿着原码写,那么接下来按照我们的算法,我们这儿就要写一个类似于像他这样的一个。
08:15
得到比。把下标往下一次,那么这个时候干嘛可以获得我们真真正正干活的这个犹豫卡。010201020102 OK,那么所以说呢,我们这儿呢,要用它的。跟他一样类似的思想,但是我们写我们自己的哈,那么在这块public,那么final,因为这个方法很重要,不允许人家再给我乱修改,那么在这儿get。And in Cha。这一波同学们能跟上就是先得到,然后干嘛再增加,那么我要干什么呢?In current。好,In next跟它这个里面的源码差不多,其思想就是什么东东,就是这个用自选索,然后来取数,好我们先写完再对比,那么这块的话呢,我们直接就要来了,注意啊,讲过了,你看for是不是自选锁一直比到这么一个成功为止啊,返回好的,那么同学们,那么这一块我们。
09:26
Do。然后Y啊。这一波同学们能跟上,那么我要干一些什么事呢?我们当前的current的值就等于this点二奥米克in就当前这个值二。点get得到当前的值是多少?现在初始值是不是零,大家请看跟我们这个是不是一样的意思啊,好,那么再来我们的NEXT12。等于。
10:00
Current大于是否大于等于?先要做一个三步判断,21页47483647。如果说。大于了,我们重新开始一次计数,零开始,否则就把当前的值加个一返回好,那么同学们我先停止一下录屏,那么大家慢慢来啊,能不能搞懂现在杨哥写了一些什么东东?那么讨论了一下,同学们对这个数字有点小疑问,不奇怪啊,猜着你们也是有这种问题,那么同学们,我们在这儿呢,直接呢写个T。OK吧,你这省得他报错我呢。这个Y要出。我先。那他这么写着,待会不是写这个啊,那么什么意思呢?为什么写这个东东啊,因为我们每次加加加的时候,我们这个最大的整形数字是多少,就是这个哈,那么。
11:02
那。好,我们在这块,同学们我们跑一下。来2147483647,兄弟们,没问题吧,就是整形的最大值啊,那什么意思呢?啊,我们前面理论我们呢时间呢也已经讲过,他每次是不是总数请求是1234啊,那么不停的累加,当然现实当中你的服务器要重新部署,不会加到21亿次啊,我相信你不可能说一部署以后重来不启动,但是我们考虑问题呢,就要考虑它有时候如果越界了,所以说我们这儿就要做个判断,21页47483647,如果说实际上而言是吧,肯定不会大于这么算。因为你每次重启以后干嘛,是不是数接口器计数从一开始啊,OK,那么在这儿呢,如果说我们得到当前是零,零是否大于等于这个不大于,那么是false false是不是零加一,得到next,这个值是不是就是一,就跟这个一样,当前值是不是零加一,再取余数得到next的值,OK,那么下面。
12:17
我们完成了这个next以后,那我要干一些什么事呢?接下来那么就是我们的this点。M integer,第二,Compare,那么注意这个时候是不是CAS的知识,我们的期望值是current,那么修改值是next,如果说不OK,取反,我们就在这儿自学,一直要取到我们认为我们想要的值。为值这一步同学们O不OK,那么接下来我们在这out,那么比方说我们的next值现在具体是多少,我们后台待会可以打出来看看,就是代代表它是第几次反问好,那么最终如果没有问题了,那么我们的next写出来这。
13:08
不难,听懂了吧,就是我们。自选锁的一个步骤,那么当前值获得有没有大于,大于的话比较如果当前值,那么看到没有跟我们的期望值一致啊,就修改,否则的话那么干嘛。这个时候如果是修改,返回的是处处这块取反整体是不是false false是不是跳出来这个do while循环,然后打出当前值是零还是一哦。呃,打出当前的这个值具体是多少啊,然后的话呢,我们再返回我们的next,这一步能跟上,好,那么有了这一步以后,我我们为什么要写这个呢?那么同学们主要是下面用啊,这个是next是就是1234567,代表是第几次访问,OK,好,那么假设不OK,那么这一块是不是一个false啊,False以后再取反,这个整体是不是个触,触了以后是不是代表又要循环,因为在高并发的情况下,有可能跟我呢抢数字,这个数字已经被别人变更了,那么在这块我们呢,这个呢,这个next呢,就是第几次啊。
14:18
反问,那么次数?好,它是一个次数,听懂了吗?那么比方说第一次next就是一二三四五六七八九十二,这么说能跟上,好,那么拿这个你要拿来干什么呢?主要是下面用,那么现在这个list里面我们已经知道了,重要的是这段源码,我们是不是要在所有的有效机器里面,最重要是得到这个例子里面的这个,那这个下标值啊,所以说我们在这儿来吧,那么我们呢。Get。这个方法就是我们现在这个方法,然后干嘛跟它一样,百分号求余数,那么这个余数谁是不是就是我们现在这个list。
15:00
第2SIZE,同学们这一波能跟上那么in。Index就这么回事。这就是为什么我们要写这个,就代表第几次访问,再来看看杨哥这句话,现在是不是第一次啊,第二次啊,第三次啊,第四次啊,这个集群总数就是8001加80002,那么下这个倒是好说,例4.size永远是个二,那么这个是几呢?那么我们从零开始啊,那么来调用这个方法,就上面这个,那么现在一开始当前是零,那么当前有没有?大大于这个。21页肯定没有,那么没有的话,那么就是first first就走到这零加一是不是就是一,那么比较了以后,假设现在只有我一个人,不会有人跟我抢,那么这块就是N,值就是一写进我们的奥的原子类里面并返回,那么现在这个N就是一,那么得到了这个方法第一次调用这个next就是一,一百分之。
16:06
取余数得到这个二,这是二的总数嘛,是二,那么是不是就是我们的一。跟二取决下边位置就是一,那么在这个里面得到我们的list里面就得到就应该具体是谁,或者是8001,或者是8002,到这一步同学们能跟上,OK,那么不要着急啊,我还会细讲,我们先把它抖一头的写完,那么return。将会使我们这个list里面点get什么。我们的index这一波能跟上,那么通过这一波我们就完成在传到这个list里面,现在我们呢,主要这个MYB负载均衡,实现这个接口是看选出来具体是哪个东东干活好,那么这个就是完成了我们的什么第三步my be,那么接下来我们的my order,那么这个订单就要用我们自己的了,这一波也挺啰嗦,那么兄弟们跟着我走。
17:03
注意精神啊,累是累一点,那么来,兄弟们,八零跑到我们这儿砍臭了。那么首先就要引入。我们自己的这个变量放在上面,那么private这个这个这一波同学们。能不能跟上?这不OK吧,那么过了这个就是我们自己写的。硅谷b balance,那写完以后。下面那么就是public那么。我们现在呢,Get payment。LB我们自己写的负载均衡好,那还记不记得我们之前在这儿8001上面做过的这个通道。好吧,那么801上面这个是不是一个这么一个东东啊,那么把它拿过来好,那么get mapping,然后的话呢,我们这又是八零。
18:07
Consumer,然后是payment LB,那么在这块我们O了,跟我们这儿一模一样,那么这行代码重点我们就直接把它拿过来写。这一波兄弟们没问题吧?Discovery content,那么好,那么在这一块我们直接引入。Discovery。这个东东我们也把它引入,那么这样的话,我是不是可以获得,相当于说我用这个名字是不是得到了这个list塔,那么这个list塔是不是就是我们在这个接口里面需要用到的呀?好的,那么过来这儿吧,跟以前的一样。如果说这个。Instance。等于。那。或者说这个第二。
19:02
Size这个方法。小于等于我们的零了,那么也就说不好使的。那么欧拉return。不OK,否则的话就说明是有效的服务啊,那么接下来我们就要用我们的路,那么拷贝我们这个参数啊,这个比较长哈,直接拿过来用编代码都是改吧改吧,张张就OK了,那么接下来那么跑到这,这个是小写吧,Service or那么O了,等于我们的什么呢?Not balanced。第二。Instance啊,那么兄弟们,我们是不是要把这个给他传进去,这一波同学们能不能看到这个是我们自己的,我们一开始现在是不是根据这个名字啊,现在肯定会得到这个list里面有八零零幺八零零二传进去load balance就是在list里面,在8001802里面来进行选择好的,那么完火以后,那么这个就是service。
20:05
Instance,然后第二,Get your,这一波弟兄们能跟上,那么这就是我们的you are I,这是我们的访问地址,最后return,那么rest template.get for。Object,然后在这块。完了以后,那么这儿就是我们的URL,那么加上我们的最上面的这个payment LB,相当于是80018002上面的东东,然后逗号string.class。那么第二。Class返回值完成,那么如果一切顺利,我们将会看到我们自己的人行算法能够起作用,好,那么接下来我们把它启动,然后来用这个地址来测试一下,你看consumer payment LB,那么大家请看这块是不是就是我们的consumer payment LB,那么如果正常情况,那么在浏览器里面是会反出88001800201。
21:07
一二,一二,一二这样交替出现。好,那么同学们,我们的八零呢已经成功启动,那么接下来我们来看一下我们能不能够按照我们的想法,那么实现我们的负载均衡,那么如果说一切顺利,那么801802哈,那么在这块完活以后,它这儿是不是就应该直接LB负载均衡返回给我们端口,80018002好,我们同学们一回车看。12121212,那么来同学们。请看这儿。第几次访问次数NEXT12345678,能理解了吗?所以说。再来,再来,总共十次。没问题吧,回到我们的源代码,来看看我们的经典的这个程序和它的设计思想,那么第一个我们呢?
22:03
需要有个load balance的这么一个接口,这个接口你要给我收集现在服务器集群上总共有多少台能够提供服务的机器,放到一个list里面,这个叫service instance服务实例,然后我们把LB实现了我们的这个接口,那么参考我们的这个源码,上一节课大家杨哥带着大家通读了,那么要读完以后你得写呀,然后呢?原子整形,那么来凡这个类要实现这个接口,那么这个接口是不是要把这个方法搞定,那么这个方法你就要告诉我现在是不是。第几次访问,其实说穿了,我们的就像我们的开发手册一样,这个是不是就是我们的第几次访问数除以这个数,然后等于下标,从这们开始,那么兄弟们这一波没问题吧啊。不OK,那么下面你看是不是re接口的第几次请求数啊,我们刚才后台也打了那么第几次啊,一二三四五六七八九十,我是不是点了十次啊,那么假设第一次啊,是不是要去预算服务器集群总数量,那么我们现在这儿是不是两台呀,那么就是得到了我们实际调用服务器的下标位置啊,那么在这个next反正过来是这个下标是不是就是01010间,那么怎么来的呢?那么这个方法注意加了final啊,不允许继承以后给我乱改,那么。
23:29
当前的和下面的这儿用的是自选锁,只不过啊,都是一样。他这个方法用的自选锁是这么一个动作for,我用的是doi啊,都一回事,那么来。解读当前的这个get当前值是零,那么这个零,我因为我们担心哈,有一天假设它这个服务器上线以后一直没有重启,总有把这个最大整形用完了,假设到这个数字了。返回错大于等于了,那么我们这儿就是个零,重新再一次计数,但正常情况下不会超过,只不过我们写程序嘛,严谨一点,还是要下标,要保证,然后完活以后,如果说现在假设这个是零,零是否大于这个数啊,不可能,对不对,所以说三步运算符,那么是first first返回后面这个,那么零加一单前这个next是就是一,好,那么我们这儿用的是CS,假设现在是。
24:27
只有我一个人人用,没有谁来跟我抢,那么我拿到的这个值是一,那么。当前值二是多少啊,零,那么我们CS2当前这个对象我们的比较里面,我们期望值二拿出来的时候是零,现在回来还是零,那么就更新成我们的新值,那么这个值就变成我们的什么一,那么OK,成功了以后这个请看。返回什么动荡布尔行成功以后,这个是不是返回处处取反,这个整体是不是变成一个false啊,False是不是跳出我们的这个do well循环,然后打出这个,那么现在我们的是不是就是第一次访问,然后就把这个next返回去,这个就是一一。
25:18
百分号。二取余数,那么这个值index就是一,那么在这个list里面得到的一,那么就是我们的8001,以此类推,那么第二次来了也是这样,那么就是第二次访问二跟二就是零,那么在这个例子里面就是得零能不能拿到,所以说在后台我们就会。非常清晰的看到第几次访问,永远是1234567.1次啊,反问一次啊,那么所以说呀呀呀呀呀,那么兄弟们。这一波能跟上,那么上面是不是一下一下一下,由于刚才我改动过,又重启了一次啊,那么同学们请看,那么来吧,你看现在刷刷刷刷刷来,同学们是不是到15那了不起,我现在把八零我重启一下,你们兄弟们,你们懂的,我这儿笔记上清晰的介绍过,每次服务重启后,Right接口记所要从启开始啊,一开始啊,这么说能跟上,那么其实而言哈,那么大家平时都会在部署换包,那么呢,不会超过21亿次啊,只不过我们程序写严谨一点,假设超过了,给他重新计,从零开始再计算,那么这个是我们的一个规矩,好吧,尽量程序呢考虑的严谨一点,那么好,现在再去反范,你看一下一下一下,那么同学们请看上一次15啊,这次是不是又从一开始到七啊,OK,所以说这个就是我们手写的负载均衡算法,用我们的CS加自选锁,这样尽可能就不要加那个什么synchize啊,Lock那些。
26:43
相对于而言,相对自选组而言更重的一个啊,那么好,这个是根据我们的源码,我杨哥就带着大家呢,写了一个总纲,就是这么一个设计思想,但是你看这么一个思想,你听懂了,和你最后能用代码完整的写出来,这绝对是两回事好吗?所以说同学们那么一定要下去多动手,多练习。
27:06
老图发给大家。程序get have上面传给大家,你今天晚上粘也好试也好,再给我试试好不好?那么OK,兄弟们,这才是我们的rib,听懂绝对不是一个什么rest template这么一个API调用,那就是我说的API调用工程师,我们要的是要这样能够写一点代码的工程师来了就能帮助项目经理干活好,那么同学们,我们就先分享到这。
我来说两句