Spring Cloud LoadBalancer

1. 快速上手

SpringCloud 从 2020.0.1版本开始,移除了Ribbon 组件,使用Spring Cloud LoadBalancer 组件来代替 Ribbon 实现客户端负载均衡.

1.1 使用Spring Cloud LoadBalancer实现负载均衡

给 RestTemplate 这个Bean添加 @LoadBalanced 注解就可以

java 复制代码
@Configuration
public class BeanConfig {


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

1.2 修改IP端口为服务名称

java 复制代码
public OrderInfo selectOrderByID(Integer orderID) {
        OrderInfo orderInfo = orderMapper.selectOrderById(orderID);
        // 从Eureka获取服务列表
        /*List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
        //有多个服务,根据轮询获取
        int index = atomicInteger.getAndIncrement() % instances.size();
        String uri = instances.get(index).getUri().toString();
        String url = uri + "/product/" + orderInfo.getProductId();
        log.info("远程调用url:{}", url);*/
        String url = "http://product-service/product/"+ orderInfo.getProductId();
        ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
        orderInfo.setProductInfo(productInfo);
        return orderInfo;
    }

1.3 启动多个服务,观察结果


观察product-service的⽇志, 会发现请求被分配到这3个实例上了

2.2 负载均衡策略

负载均衡策略是一种思想,无论是哪种负载均衡器,它们的负载均衡策略都是相似的.Spring CloudLoadBalancer 仅支持两种负载均衡策略:轮询策略 和 随机策略

1.轮询(Round Robin):轮询策略是指服务器轮流处理用户的请求,这是一种实现最简单,也最常用的策略.生活中也有类似的场景,比如学校轮流值日,或者轮流打扫卫生,

2.随机选择(Random):随机选择策略是指随机选择一个后端服务器来处理新的请求.

3. 自定义负载均衡策略

Spring Cloud LoadBalancer默认负载均衡策略是 **轮询策略,**实现是 RoundRobinLoadBalancer,如果服务的消费者如果想采用随机的负载均衡策略,也非常简单.
参考官⽹地址: Spring Cloud LoadBalancer :: Spring Cloud Commons

  1. 定义随机算法对象,通过@Bean将其加载到Spring容器中
    此处使用Spring Cloud LoadBalancer提供的 RandomLoadBalancer
java 复制代码
package com.guan.order.config;

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

public class CustomLoadBalancerConfiguration {

	@Bean
	ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
															LoadBalancerClientFactory loadBalancerClientFactory) {
		String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
		return new RandomLoadBalancer(loadBalancerClientFactory
				.getLazyProvider(name, ServiceInstanceListSupplier.class),
				name);
	}
}

注意:

  1. 不⽤ @Configuration 注释
  2. 在组件扫描范围内
  1. 使用 @LoadBalancerclient 或者@LoadBalancerclients 注解在 RestTemplate 配置类上方,使用 @LoadBalancerClient 或 @LoadBalancerClients 注解,可以对不同的服务提供方配置不同的客户端负载均衡算法策略.由于咱们项目中只有一个服务提供者,所以使用@LoadBalancerClient
java 复制代码
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;


@LoadBalancerClient(name = "product-service", configuration = CustomLoadBalancerConfiguration.class)
@Configuration
public class BeanConfig {


    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
相关推荐
Piper蛋窝3 小时前
深入 Go 语言垃圾回收:从原理到内建类型 Slice、Map 的陷阱以及为何需要 strings.Builder
后端·go
Bug退退退1234 小时前
RabbitMQ 高级特性之死信队列
java·分布式·spring·rabbitmq
六毛的毛5 小时前
Springboot开发常见注解一览
java·spring boot·后端
AntBlack5 小时前
拖了五个月 ,不当韭菜体验版算是正式发布了
前端·后端·python
31535669135 小时前
一个简单的脚本,让pdf开启夜间模式
前端·后端
uzong5 小时前
curl案例讲解
后端
一只叫煤球的猫6 小时前
真实事故复盘:Redis分布式锁居然失效了?公司十年老程序员踩的坑
java·redis·后端
大鸡腿同学7 小时前
身弱武修法:玄之又玄,奇妙之门
后端
轻语呢喃9 小时前
JavaScript :字符串模板——优雅编程的基石
前端·javascript·后端
MikeWe9 小时前
Paddle张量操作全解析:从基础创建到高级应用
后端