SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))

1. Ribbon负载均衡流程

SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第1张图片


2. 负载均衡原理(探究原码)


2.1 原理探究

示例代码源于上节案例
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第2张图片

那么这个拦截的动作是谁去完成的呢?

由LoadBalancerInterceptor类完成。
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第3张图片

它实现了ClientHttpRequestInterceptor接口,该接口的功能就是拦截客户端 HTTP 请求。而RestTemplate就是一个发Http请求的客户端,所以RestTemplate发起的请求自然而然的就被拦截了。
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第4张图片

SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第5张图片
我们回到他的实现类LoadBalancerInterceptor,并在该方法打一个断点,然后debug运行服务端。
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第6张图片

这时候我们发起一个请求,就发现进入了debug里面(这就证明这个请求确实被拦截了)。
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第7张图片
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第8张图片
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第9张图片
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第10张图片
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第11张图片
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第12张图片
我们继续跟进这个方法:

我们可以看见负载均衡器loadBalancer已经拿到了服务列表:

那么接下来就是返回服务列表了。
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第13张图片
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第14张图片

我们跟进getServer方法看它内部是怎么实现的,我们发现里面有一个选择服务来进行负载均衡的接口IRule,有许多类实现了这个接口,也就是说定义了许多选择服务的规则:

SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第15张图片
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第16张图片
SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第17张图片

拿到了以后接下来就可以向拿到的服务去发送请求等等…


2.2 小结

SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第18张图片


3. 负载均衡策略


3.1 介绍负载均衡策略

这里主要介绍IRule接口的实现类里面定义的选择服务的规则(做负载均衡)。

SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第19张图片

SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第20张图片


3.2 修改负载均衡策略

SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第21张图片


3.2.1 代码方式(全局 优先级高于配置文件方式

SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第22张图片

    @Bean
    /*
     * 把全局设置为随机的负载均衡策略
     */
    public IRule randomRule() {
        return new RandomRule();
    }

3.2.2 配置文件方式(某个微服务)

SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第23张图片

# 这个是微服务的id
user-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 随机策略

4 .懒加载(饥饿加载)

SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第24张图片


4.1 现象复现

SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第25张图片SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第26张图片


4.2 开启懒加载

SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第27张图片

# 配置懒加载
ribbon:
  eager-load:
    enabled: true # 开启懒加载
    clients: user-service # 指定饥饿加载的服务名称

提示:yaml语法指定多个服务可以这样写

# 配置懒加载
ribbon:
  eager-load:
    enabled: true # 开启懒加载
    clients: 
      - user-service
      - order-service
      - ......

5. 小结

SpringCloud -- Ribbon负载均衡(负载均衡流程、负载均衡原理(探究原码)、负载均衡策略、懒加载(饥饿加载))_第28张图片
代码配置负载均衡策略的优先级高于配置文件方式,博主已踩坑!!!



你可能感兴趣的:(微服务开发框架,--,黑马,spring,cloud,ribbon,负载均衡)