• SpringCloud 客户端负载均衡:Ribbon



    Ribbon 介绍

    Ribbon 是 Netflix 提供的一个基于 Http 和 TCP 的客户端负载均衡工具,且已集成在 Eureka 依赖中。

    image

    实现原理:SpringCloud Ribbon 的底层采用了一个拦截器,拦截了 RestTemplate 发出的请求,对地址做了修改。

    image


    开启客户端负载均衡,简化 RestTemplate 调用

    1)在服务调用者的 RestTemplate 配置类上添加注解:

    @Configuration
    public class RestTemplateConfig {
    
        @Bean
        @LoadBalanced  // 开启客户端负载均衡(默认轮询策略)
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    

    2)在调用时指定服务名:

    package com.controller;
    
    import com.domain.Goods;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * 服务调用方
     */
    @RestController
    @RequestMapping("/order")
    public class OrderController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping("/goods/{id}")
        public Goods findOrderByGoodsId(@PathVariable("id") int id) {
    
            String url = String.format("http://eureka-provider/goods/findOne/%d", id);
            Goods goods = restTemplate.getForObject(url, Goods.class);
            return goods;
        }
    }
    

    负载均衡策略

    负载均衡策略:

    • 轮询(默认)
    • 随机
    • 最小并发
    • 过滤
    • 响应时间
    • 轮询重试
    • 性能可用性

    使用负载均衡:

    方式一:使用 bean 的方式

    • 在消费者端配置负载均衡策略 Bean:
    package com.config;
    
    import com.netflix.loadbalancer.IRule;
    import com.netflix.loadbalancer.RandomRule;
    import org.springframework.context.annotation.Bean;
    
    public class MyRule {
    
        @Bean
        public IRule rule() {
            return new RandomRule();  // 随机策略
        }
    
    }
    
    • 在启动类添加注解:
    package com;
    
    import com.config.MyRule;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.ribbon.RibbonClient;
    
    @EnableDiscoveryClient  // 激活DiscoveryClient
    @EnableEurekaClient
    @SpringBootApplication
    @RibbonClient(name="eureka-provider", configuration= MyRule.class)  // 指定服务提供方并配置负载均衡策略
    public class ConsumerApp {
    
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApp.class, args);
        }
    }
    

    方式二:使用配置文件

    server:
      port: 9000
    
    eureka:
      instance:
        hostname: localhost
      client:
        service-url:
          defaultZone:  http://localhost:8761/eureka
    
    spring:
      application:
        name: eureka-consumer
    
    # 设置 Ribbon 的负载均衡策略:随机策略
    EUREKA-PROVIDER:
      ribbon:
        NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule.RandomRule
    

    饥饿加载

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

    可以通过下面配置开启饥饿加载:

    ribbon:
      eager-load:
        enabled: true
        clients: userservice
    
  • 相关阅读:
    2023年,PMP的知识是否过时了?
    架构思考(四)
    Mybatis+Mybatis-plus+SpringBoot整合(完整版)
    AbstractDispatcherServletInitializer 的实现类为什么可以在初始化Web容器的时候被调用
    总结:大数据服务
    ZYNQ 程序编译
    Html -- 文字时钟
    戏说领域驱动设计(十一)——纠偏
    如何搭建Wish、eBay、美客多 一天 成号测评环境系统?
    5.2 空表实验
  • 原文地址:https://www.cnblogs.com/juno3550/p/16342727.html