编程技术分享平台

网站首页 > 技术教程 正文

微服务(三)-Ribbon负载均衡(ribbon实现负载均衡)

xnh888 2024-09-14 15:22:04 技术教程 29 ℃ 0 评论

LB负载均衡是什么


负载均衡是将用户请求均摊到多台服务器上,从而实现系统的高可用


Ribbon和Nginx负载均衡的区别


Nginx是服务器负载均衡,浏览器会把所有请求交给nginx,再由nginx转发请求到各个服务器


Ribbon是本地负载均衡,先从注册中心拿到服务列表缓存到本地,在调微服务接口的时候根据负载均衡策略来决定调用哪台服务器


集成Ribbon


由于nacos已经集成了ribbon的包,所以不需要再引入ribbon的依赖


消费端和服务端都需要注册进注册中心


使用RestTemplate来访问,加个LoadBalanced注解就可以使用ribbon了


@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate;
}



然后起两个服务A和B,A端作为调用者,B端作为服务者,


A端代码如下,其中需要注意的是url里面没有直接指定B端的ip,而是使用服务名代替了,这样做的目的是为了负载均衡,因为一个服务名可以起好几个服务,可以通过spring.application.name来指定服务名


@GetMapping("order")
public String order() {
    String url = "http://payment/pay";
    String result = restTemplate.postForObject(url, null, String.class);
    log.info(result);
    return "下单成功";
}



Ribbon负载均衡算法


ribbon使用起来超级简单,重点是要掌握ribbon的负载均衡算法。


内置负载均衡算法


  • RoundRobinRule,轮询
  • RandomRule,随机
  • RetryRule,重试策略,在轮询的基础上,如果遇到服务失败则在指定时间内重试
  • WeightedResponseTimeRule,响应时间加权策略,响应速度越快的实际选择权重越大,越容易被选择
  • BestAvailableRule,最佳可用策略,会过滤掉处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
  • AvailabilityFilteringRule,可用过滤策略,先过滤掉故障实例,再选择并发小的实例
  • ZoneAvoidanceRule,区域过滤策略,还是用的轮询,只不过会剔除不可用Zone(云服务区域)的server,默认算法


算法有点多,可以通过分类记忆,


一组是轮询的,RoundRobinRule,轮询,RetryRule,轮询会重试,ZoneAvoidanceRule,去除不可用zone后轮询


一组是最小并发的,BestAvailableRule是剔除跳闸的选一个最小并发的,AvailabilityFilteringRule是剔除故障的选择一个最小并发的,WeightedResponseTimeRule是根据响应时间来选择


在这里纠正一个误区就是新版本的ribbon默认算法不是轮询而是区域权重策略,我们可以看下源码来证实。


当加了LoadBalanced注解后,RestTemplate在发送请求的时候会被ClientHttpRequestInterceptor拦截,LoadBalancerInterceptor是ClientHttpRequestInterceptor的实现类,它的作用就是用于RestTemplate的负载均衡,LoadBalancerInterceptor将负载均衡的核心逻辑交给了loadBalancer


我们跟进LoadBalancerInterceptor方法,发现选择服务的代码为ZoneAwareLoadBalancer的chooseServer方法


?


再跟进去,发现调用的是BaseLoadBalancer的chooseServer方法,里面调用了IRule接口的choose方法,IRule的实现类是ZoneAvoidanceRule

?


替换默认负载均衡策略


全局替换


@Bean //修改轮询规则为随机
public IRule iRule(){
    return new RandomRule();
}



局部替换,比如只想替换某一个服务的负载均衡策略


payment:  #这个是微服务的id
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #最佳可用策略




?

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表