负载均衡 Spring Cloud Ribbon

 负载均衡 Spring Cloud Ribbon

Ribbon主要 解决集群服务中,多个服务高效率访问的问题。

1 目标

  • 理解Ribbon的负载均衡应用场景
  • 能实现Ribbon的轮询、随机算法配置
  • 理解源码对负载均衡的切换

2  讲解

1 Ribbon 简介

什么是Ribbon?

Ribbon是Netflix发布的负载均衡器,有助于控制HTTP客户端行为。为Ribbon配置服务提供者地址列表后,Ribbon就可基于负载均衡算法,自动帮助服务消费者请求。

Ribbon默认提供的负载均衡算法:轮询,随机,重试法,加权。当然,我们可用自己定义负载均衡算法

2 入门案例

1 多个服务集群

如果想要做负载均衡,我们的服务至少2个以上,为了演示负载均衡案例,我们可以复制2个工程,分别为user-provideruser-provider-demo1,可以按照如下步骤拷贝工程:

①选中user-provider,按Ctrl+C,然后Ctrl+V

②名字改成user-provider-demo1,点击OK

③将user-provider-demo1artifactId换成user-provider-demo1

④在springcloud-parent的pom.xml中添加一个<module>user-provider-demo1</module>

⑤将user-provider-demo1的application.yml中的端口改成18083

为了方便测试,将2个工程对应的com.itheima.controller.UserController都修改一下:

user-provider:

@RequestMapping(value = "/find/{id}")
public User findById(@PathVariable(value = "id") Integer id){
    User user = userService.findByUserId(id);
    user.setUsername(user+"     user-provider");
    return user;
}

user-provider-demo1:

@RequestMapping(value = "/find/{id}")
public User findById(@PathVariable(value = "id") Integer id){
    User user = userService.findByUserId(id);
    user.setUsername(user+"     user-provider-demo1");
    return user;
}

⑥启动eureka-serveruser-provideruser-provider-demo1user-consumer,启动前先注释掉eureka-server中的自我保护和剔除服务配置。

访问eureka-server地址<http://127.0.0.1:7001/>效果如下:

开启负载均衡

(1)客户端开启负载均衡

Eureka已经集成Ribbon,所以无需引入依赖,要想使用Ribbon,直接在RestTemplate的配置方法上添加@LoadBalanced注解即可

修改user-consumercom.itheima.UserConsumerApplication启动类,在restTemplate()方法上添加@LoadBalanced注解,代码如下:

(2)采用服务名访问配置

修改user-consumercom.itheima.controller.UserController的调用方式,不再手动获取ip和端口,而是直接通过服务名称调用,代码如下:

(3)测试

启动并访问测试<http://localhost:18082/consumer/1>,可以发现,数据会在2个服务之间轮询切换。

其他负载均衡策略配置

配置修改轮询策略:Ribbon默认的负载均衡策略是轮询,通过如下

# 修改服务地址轮询策略,默认是轮询,配置之后变随机
user-provider:
  ribbon:
    #轮询
    #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
    #随机算法
    #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    #重试算法,该算法先按照轮询的策略获取服务,如果获取服务失败则在指定的时间内会进行重试,获取可用的服务
    #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule
    #加权法,会根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越大。刚启动时如果同统计信息不足,则使用轮询的策略,等统计信息足够会切换到自身规则。
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule

SpringBoot可以修改负载均衡规则,配置为ribbon.NFLoadBalancerRuleClassName

格式{服务名称}.ribbon.NFLoadBalancerRuleClassName

3 负载均衡源码跟踪探究

为什么只输入了Service名称就可以访问了呢?不应该需要获取ip和端口吗?

负载均衡器动态的从服务注册中心中获取服务提供者的访问地址(host、port)

显然是有某个组件根据Service名称,获取了服务实例ip和端口。就是LoadBalancerInterceptor

这个类会对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真正服务地址信息,替换服务id。

源码跟踪步骤:

打开LoadBalancerInterceptor类,断点打入intercept方法中

继续跟入execute方法:发现获取了18081发端口的服务

再跟下一次,发现获取的是18081和18083之间切换

通过代码断点内容判断,果然是实现了负载均衡

3 小结

  • Ribbon的负载均衡算法应用在客户端,只需要提供服务列表,就能帮助消费端自动访问服务端,并通过不同算法实现负载均衡。
  • Ribbon的轮询、随机算法配置:在application.yml中配置 {服务名称}.ribbon.NFLoadBalancerRuleClassName
  • 负载均衡的切换:在LoadBalancerInterceptor中获取服务的名字,通过调用RibbonLoadBalancerClient的execute方法,并获取ILoadBalancer负载均衡器,然后根据ILoadBalancer负载均衡器查询出要使用的节点,再获取节点的信息,并实现调用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值