你要的负载均衡Ribbon,来了( 二 )

第三步写配置:在yml文件中写配置,这里不需要写 。
第四步修改代码:ribbon会根据user-center去nacos中找到请求的真是路径 。
public ShareDTO findById(Integer id) {Share share = this.shareMapper.selectByPrimaryKey(id);Integer userId = share.getUserId();//根据userId查询用户信息UserDTO userDTO = this.restTemplate.getForObject("http://user-center/users/{userId}", UserDTO.class, userId);ShareDTO shareDTO = new ShareDTO();BeanUtils.copyProperties(share, shareDTO);shareDTO.setWxNickname(userDTO.getWxNickname());return shareDTO;}ok,到这里ribbon就整合完了 。那有人会问,到这就结束了吗?那显然不是,阿七不是浮于表面的人,咱学习一个东西就要刨根问底 。
四、ribbon组成ribbon组件虽小,但是五脏俱全,它的组成都有哪些呢?贴心的我已经为大家准备好了 。

你要的负载均衡Ribbon,来了

文章插图
 
同时,ribbon支持8种负载均衡策略,如下所示:
你要的负载均衡Ribbon,来了

文章插图
 
这里的Zone本意为地区、地带的意思,这里作机房的架子,也就是放服务器的机架 。那我们实际上没有Zone的,也就是说默认采用的负载均衡策略是RoundRibonRule(轮训策略) 。我们看一下源码,找到RoundRobinRule.JAVA类,其中最主要的就是这一段,实际上就是取余得到访问的server的index 。
private int incrementAndGetModulo(int modulo) {int current;int next;do {current = this.nextServerCyclicCounter.get();next = (current + 1) % modulo;} while(!this.nextServerCyclicCounter.compareAndSet(current, next));return next;}compareAndSet是AtomicInteger的方法,其实类似参数列表compareAndSwapInt(var1, var2, var5, var4),作为base的var1加上偏移量var2之后和var5比较是不是值相同,相同就update为var4. valueOffset是native的C的方法指针找到的地址 。
public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}五、细粒度配置ribbon那我们如何细粒度、自定义配置负载均衡策略呢?比如,内容中心想指定一种负载均衡策略来获取用户中心的实例 。很简单,我们只需要加一下yml配置文件即可 。
#指定服务名user-center:ribbon:#负载均衡策略的全路径NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule这样我们就修改ribbon负载均衡策略为RandomRule,也就是随机获取一个实例 。
六、ribbon解饿加载在实际代码运行中发现,当我们第一次请求http://localhost:8889/shares/1这个接口时,运行结果是很慢的,为什么呢?因为ribbon默认是懒加载 。只有在下面代码第一次执行的时候,才会创建一个名叫user-center的ribbon client 。
//根据userId查询用户信息UserDTO userDTO = this.restTemplate.getForObject("http://user-center/users/{userId}", UserDTO.class, userId);我们可以通过修改yml配置文件来解决这个问题 。
ribbon:eager-load:enabled: true#多个用逗号隔开 user-center,xxx,yyyclients: user-center这样就可以第一次请求也变得很快啦 。
好了ribbon就学习到这里了 。但是,我们的代码还是存在很多问题的,那么下一篇我们将一起学习声明式http客户端--feign,一起将代码优化的更好吧 。
喜欢的朋友记得点个关注吧,一起探讨,共同进步 。

【你要的负载均衡Ribbon,来了】


推荐阅读