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();
    }
}
相关推荐
打工的小王9 分钟前
Spring Boot(三)Spring Boot整合SpringMVC
java·spring boot·后端
我真会写代码12 分钟前
SSM(指南一)---Maven项目管理从入门到精通|高质量实操指南
java·spring·tomcat·maven·ssm
vx_Biye_Design12 分钟前
【关注可免费领取源码】房屋出租系统的设计与实现--毕设附源码40805
java·spring boot·spring·spring cloud·servlet·eclipse·课程设计
80530单词突击赢2 小时前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
爬山算法2 小时前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
WeiXiao_Hyy2 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
苏渡苇2 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
long3163 小时前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
独断万古他化3 小时前
【SSM开发实战:博客系统】(三)核心业务功能开发与安全加密实现
spring boot·spring·mybatis·博客系统·加密
rannn_1113 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习