Ribbon负载均衡

负载均衡流程

  1. 首先order-service发起请求获取user-service,到ribbon

  2. ribbon发送给eureka-server注册中心拉取userservice

  3. eureka-service返回user-service服务列表给Ribbon

  4. Ribbon轮询到8081

负载均衡原理

源码阅读

  1. @LoadBalanced注解标记RestTemplate所发起的请求要被Ribbon进行拦截处理

  2. LoadBalancerInterceptor接口实现ClientHttpRequestInterceptor,CHRI的intercept方法拦截由客户端发起的请求,LoadBalancerInterceptor重写了intercept方法,获取原始URI路径,通过URI的gethost方法获取服务的名字,并根据服务名称调用了RibbonLoadBalancer的excute方法,在excute方法中DynamicServerListLoadBalancer使用getServer方法完成了服务列表Server的拉取

  3. 继续向下追踪getServer进入 ZoneAwareLoadBalancer的chooseServer方法,内部调用其父类BaseLoadBalancer的chooseServer,在其中有rule.choose方法,rule就代表负载均衡的规则

    1. rule是IRule接口类型,决定了负载均衡的策略,IRule实现类如下:RandomRule代表随机、RoudRobinRule代表轮询负载均衡,默认的负载均衡是ZoneAvoidanceRule

  4. 我们可以负载均衡获取到真实的服务地址8081,代替原来的服务名称发起真实请求

图解LoadBalancerInterCeptor负载均衡拦截器流程

  1. order-service发起请求给RibbonLoadBanancerClient,请求获取指定的userservice

  2. RibbonLoadBanlancerClient拉取请求中的服务id给DynamicServeriListLoadBalancer

  3. DynamicServeriListLoadBalancer去注册中线拉取userService

  4. 注册中心返回服务列表给DynamicServiListLoadBalancer

  5. DSLB找IRule接口,根据规则进行对服务列表进行负载均衡

  6. IRlue选择某个服务发从给RibbonLoadBanlancerClient

  7. RibbonLoadBanlancerClient修改order-service中的URL发送请求到负载均衡到的服务

IRule负载均衡策略

Ribbon负载均衡的规则是IRule接口实现来定义的,每个子接口都是一种规则

默认负载均衡规则是ZoneAvoidanceRule

以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架。而后对Zone内的多个服务做轮询,服务消费者优先选择在同一个Zone的服务再做轮询RoundRobinRule

常见的负载均衡策略

调整负载均衡策略

通过IRule实现可以修改负载均衡规则

1、通过代码定义一个新的IRule - 全局配置

全局配置范围:无论哪个服务提供都会进行此规则的负载均衡

在配置类OrderApplication定义一个新的IRule

@Bean
public IRule randomRule(){
    return new RandomRule();
}

2、配置文件方式 - 单独配置

单独配置范围:不同服务配置不同规则

在Order-service的applicatioon.yml文件中,添加新的配置也可以修改规则

userservice: #指定要配置负载均衡的服务
    ribbon: #Ribbond负载均衡的规则
        NFLoadBalancerRuleClassName:com.netfile.loadbalancer.RandomRule  #负载均衡规则

Ribbon饥饿加载

Ribbon默认采用懒加载第一次访问时才会去创建LoadBalanceClient,请求的时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时

懒加载 - 默认

第一次访问时才会去创建LoadBalanceClient,请求的时间会很长

饥饿加载 - 对指定的服务做饥饿加载

项目启动的时候就去创建了,降低第一次访问的耗时

ribbon:
    eager-load:
        enablee: true #开启饥饿加载
        clients: #并不是全局统一配置:对如下服务饥饿加载
         - userservice 
         - orderservice

posted on 2022-10-02 15:53  老菜农  阅读(27)  评论(0编辑  收藏  举报

导航