开发者学堂课程【微服务框架 Spring Cloud 快速入门:自定义Ribbo的负载均衡策略(下)】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/614/detail/9358
自定义Ribbo的负载均衡策略(下)
内容介绍
一、问题
二、解析码
三、参考源码修改
四、调用
五、测试
根据上节可了解到 MySeLfRule 是 OK 的意思,因为不 OK 会自动变成它的默认值,默认是轮询算法现在自定义是随机的,通过人工自定义显示定义了随机。自定义规则深度解析:
一、问题:
依旧轮询策略,但是加上新需求,每个服务器要求被调用5次。也即以前是每台机器一次,现在是每台机器5次
return new RandomRule();此时为随机
return new RandobinRule();改为轮询
运行结果为:{“deptno”:1,”dname”:”开发部”,”db_source”:”clouddb01‘’},clouddb01按照顺序变化为02,03。
二、解析码:
https://github.com/Netflix/ribbon/blob/master/ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/RandomRule.java
打开浏览器复制解析码找到 github 上面来,找到第32行的 public classRandom
Rule extends AbstractLoadBalancerRule {}
三、参考源码修改为需求要求的 RandomRule_ZY.java
新建一个 java 类,命名为 RandomRule_ZY,这属于定义的类,打开刚才的源代码中RandomRule 后面所有的代码复制到新建 RandomRule_ZY 中 public class RandomRule_ZY 的后面。
这是全部架构图,抽象的 Abstact 意思是下载规则。
RandomRule 随机算法,先参考原作者的源码再根据需要的进行修改
Random 随机算法真正起作用的其实是:public Server choose(ILoadBalancer lb,object key){,其中的 Server 的意思的返回具体服务的哪一个服务线。
if (lb == nul1){
return null;
}
while (server== nul1){
if (Thread.interrupted()){
return null;
}
List<Server> upList = lb.getReachableServers();
List<Server> allList = lb.getAllServers();
int serverCount = allList.size();
if (serverCount == 0){
/*
*No servers. End regardless of pass,because subsequent passes
*only get more restrictive.
*/
return null;
}
int index=rand.nextInt(serverCount);
if(server==null){
Thread.yield();
continue;
}
LoadBalancer lb哪一种均衡算法如果等于 null 的话就返还,自然而然,它一定会加载成一种。Server 现在还不知道是从何响应,因为现在这里有三台机器,不知道是其中的哪一台响应。
如果说 server 等于 null 试验层被中断,就会返回 null。
四、调用
if (serverCount == 0) 即当 serverCount == 0 才进入程序,但是如今serverCount==3,所以不进入程序。
int index=rand.nextInt(serverCount) 相当于 java.util.Random().nextInt(3) 数组的下标从0开始,serverCount为3得到的index为0,1,2
server=upList.get(index)返回的结果为运行到的机器。
将没用的代码删除,然后导入对应的包java.util.List
// total = 0 //当total == 5以后,指针才能往下走
//index = 0 //当前对外提供服务的服务器地址
第一次来total为0,index也应该为0。
第二次来total为1没满足5,index也为0。
直到第五次满足条件。
//total需要重新置为零,但是已经达到过一个5次,index=1
//分析:5次,但是微服务只有8001 8002 8003三台。
按照这种加法index如果加到3还可行,但如果加到4就会出现问题,因为只有三台机器,所以只能重新设置,不能让index超过3。只要到3了就需要把它重新清空下次再设置。
private int total = 0; //总共被调用的次数,目前要求每台被调用5次
private int currentIndex=0; //当前提供服务的机器号
删intindex=rand.nextInt(serverCount);server=upList.get(index);
替换成以下代码:
if(total < 5)
{
server = upList.get( currentIndex);
total++;
}else {
total = 0;
currentIndex++;
if(currentIndex >= upList.size())
{
currentIndex = 0;
}
}
当前提供服务的仍然是0号机,total加一次变成2,2小于5,再加当 total 值为5时,此时 total = 0,currentIndex 加上1 if(currentIndex >= upList.size())
{
currentIndex = 0;
//这里不过来,说明了此时的0号机过渡到了1号机。循环往复,直到 total 再次变为0.
return new RandomRule_ZY();
// 我自定义为每台机器5次。
主启动类里的 RibbonClient 要对负载均衡类加微服务算法,不用默认,要自定义值。
五、测试
启动所有微服务,现在每一个服务都需要被调用五次,在浏览器输入localhost/consumer/dept/get/1显示结果为{“deptno”:1,”dname”:”开发部”,”db_source”:”clouddb01”}
刚才是每个一次,现在为每个五次,跳转结果显示正确,主定义结束。
