所有课程的学习及相关资料都是源自b站黑马程序员
感谢黑马程序员给予我们新手的无私帮助,感谢!!!
黑马程序员-----yyds
文章目录
一、负载均衡策略
我们接着上期的笔记继续解释。
上期回顾
下面的是IRule的类继承关系图
还记得我上期说过,Ribbon的默认负载均衡实现是ZoneAvoidanceRule(中文硬核翻译一下)
我们现在要详细说明下这个规则(说不定就和区域这两个字有关系呢)。
我们看看ZoneAvoidanceRule的父类是PredicateBasedRule,emmm,好像我还不是没通过,我们再看父类的父类是ClientConfigEnableRoundRobinRule,后缀倒是有一点轮询的味道,那说明这个类可能是包含轮询的那种感觉,只不过这个类可能将轮询的功能加强一些。可见ZoneAvoidanceRule类采用的规则肯定和轮询有某些关联,甚至可以说是基本上一致。
那好,这个我们就暂且先了解到这里,下面我放一张表(我们重点关注ZoneAvoidanceRule)
显而易见,Ribbon的默认机制就是有区域轮询的意思,举个例子,我们有两个机房A和B,机房A里面有服务C的实例1和实例2,机房B里面有服务C的实例3和实例4,现在如果我们访问服务C的实例,分下面两种情况:
- 没有配置优先访问哪个区域的时候,我们默认所有的机房都是处于同一个区域,程序对同一个区域的实例做轮询操作的负载均衡
- 如果配置了优先访问哪个区域的时候,我们认为每一个机房都是不同的区域,程序会先看看你配置了要访问哪个区域,然后只对该区域内的实例进行轮询操作负载均衡,不访问其他区域的相同服务实例。
先暂时这个理解,应该也不难理解叭。
现在的问题是,我不想要这种默认的负载均衡规则, 我想换一个,那要怎么实现呢?
下面介绍两种方法来实现:
①、方法一: 在order-service代码的OrderApplication.java内加入如下的代码
需要注意的是,这种方法是全局通用的,也就是你order-service无论调用哪个服务,都是采用的是自定义的规则
②、方法二: 在order-service的application.yml增加如下配置
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
而和上面不一样的是,这个只针对userservice服务的实例,也就是说,只有当order-service访问userservice服务实例的时候才会使用你自定义的规则,而访问其他服务实例的时候仍然使用的默认规则。
二、懒加载与饥饿加载
老方式,先了解这两种加载的概念。
懒加载的定义:
懒加载(Load On Demand)是一种独特而又强大的数据获取方法,它能够在用户滚动页面的时候自动获取更多的数据,而新得到的数据不会影响原有数据的显示,同时最大程度上减少服务器端的资源耗用(百度百科,大概意思)
懒加载的定义:
饥饿加载其实就是一开始既在访问的同时也一并加载所需要的资源(自创的哈哈哈)
那为什么要使用这两种方式呢。
其实Ribbon的默认加载方式是懒加载(第一次加载后会变快,因为它会缓存数据),而懒加载会引发一个问题,就是它会在第一次请求数据的时候,响应时间很长,这个时候,如果你的电脑性能和网络不理想的话,那么这第一次请求可能就会让你挂了(也就是请求超时)
所以,如果我们可以把懒加载机制,更换为饥饿加载机制,或许页面数据的响应对于那些电脑性能或者网络有差异者,或许不为一种提升用户体验的方式。
那要怎么切换加载机制呢。
修改order-service的application.yml文件
最后总结一波对于Ribbon的学习:
这期笔记就到这里,求个三连,谢谢!
共勉!