springcloud五大神兽之Ribbon介绍

① 什么是Ribbon?
Ribbon是Netflix发布的负载均衡器,有助于控制HTTP客户端行为。为Ribbon配置服务提供者地址列表后,Ribbon就可基于负载均衡算法,自动帮助服务消费者请求。
② Ribbon可以做什么?
Spring Cloud Ribbon是一个基于Http和TCP的客户端负载均衡工具,Ribbon主要解决集群服务中,多个服务高效率访问的问题。
③ 客户端~服务端负载均衡区别
(1)服务端负载均衡:例如Nginx,通过Nginx进行负载均衡过程如下:先发送请求给nginx服务器,然后通过负载均衡算法,在多个业务服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。
在这里插入图片描述
(2)客户端负载均衡:例如Ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,即在客户端就进行负载均衡算法分配。
在这里插入图片描述
2.4 Ribbon案例演示
① 服务器设置
Ribbon既然是做客户端负载均衡,所以至少需要2台服务器。
② 工程复制
我们选择复制user-producer服务提供者工程,改名为user_producer1_ribbon(名称任意起,见名知意)。
在这里插入图片描述
记得修改新项目的端口号。
在这里插入图片描述
③ 修改方法
修改2个服务提供者工程的UserController中的方法
在这里插入图片描述
④ 开启负载均衡
因为Ribbon是客户端负载均衡,我们在发请求时使用的是RestTemplate对象,所以我们在客户端启动类中获取restTemplate对象的方法上添加@LoadBalanced注解,开启负载均衡。
⑤ 改变调用服务方式
因为是集群模式,每台服务提供者的ip和端口都不同(手动获取肯定不方便,也体现不出负载效果),但是集群模式下提供服务的服务名称肯定是一致的,所以我们改变请求调用服务方式为根据服务名称访问(直接通过服务名称调用)。

@RequestMapping("/consumer")
@RestController
public class UserController {
    @Autowired
    RestTemplate restTemplate;
    @Autowired
    DiscoveryClient discoveryClient;
@GetMapping(value = "/{id}")
public User queryById(@PathVariable("id") Integer id){
//基于硬编码来访问
   /* String url = "http://localhost:8081/user/find/" + id ;
    return restTemplate.getForObject(url,User.class);*/
    //基于DiscoveryClient对象来访问
    /*List<ServiceInstance> userProducer = discoveryClient.getInstances("user-producer");
    ServiceInstance serviceInstance = userProducer.get(0);
    String url = "http://" + serviceInstance.getHost()+":"+serviceInstance.getPort() + "/user/find/" + id;
    return restTemplate.getForObject(url,User.class);*/
    //基于服务名称来访问
    String url = "http://user-producer/user/find/"+id;
    return restTemplate.getForObject(url,User.class);
}
}

⑥ 添加Ribbon的相关配置
(1)在application.yml中加入Ribbon的配置

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

⑦ 测试轮询
(1)运行服务注册中心、2台服务提供者、服务消费者的启动类
在这里插入图片描述
(2)访问查看
在这里插入图片描述
⑧ 测试随机
只需要修改application.yml文件中的配置

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

⑨ 负载均衡源码解析
思考:为什么在调用请求时,只需输入Service名称(serviceId)就可以访问服务了?
(1)负载均衡器动态的从服务注册中心中获取服务提供者的访问地址(host、port)。
(2)显然是有某个组件根据Service名称,获取了服务实例ip和端口。就是LoadBalancerInterceptor。这个类会对RestTemplate的请求进行拦截,然后从EurekaServer中根据服务id获取服务列表,随后利用负载均衡算法得到真正服务地址信息,替换服务id。
在这里插入图片描述
在这里插入图片描述
总结:
Ribbon的负载均衡算法应用在客户端(Http请求),只需要提供服务列表,就能帮助消费端自动访问服务端,并通过不同算法实现负载均衡。
Ribbon的轮询、随机算法配置:在application.yml中配置 {服务名称}.ribbon.NFLoadBalancerRuleClassName
负载均衡的切换:在LoadBalancerInterceptor中获取服务的名字,通过调用RibbonLoadBalancerClient的execute方法,并获取ILoadBalancer负载均衡器,然后根据ILoadBalancer负载均衡器查询出要使用的节点,再获取节点的信息,并实现调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值