首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【SpringCloud】负载均衡LoadBalance && SpringCloudLoadBalancer && 多机部署

【SpringCloud】负载均衡LoadBalance && SpringCloudLoadBalancer && 多机部署

原创
作者头像
lirendada
发布2026-02-13 10:47:58
发布2026-02-13 10:47:58
1350
举报
文章被收录于专栏:JavaJava

Ⅰ. 负载均衡介绍

一、什么是负载均衡

负载均衡(LoadBalance)是高并发、高可用系统必不可少的关键组件。

当服务流量增大时,通常会采用增加机器的方式进行扩容,负载均衡就是用来在多个机器或者其他资源中,按照一定的规则合理分配负载。

一个团队最开始只有一个人,后来随着工作量的增加,公司又招聘了几个人。负载均衡就是:如何把工作量均衡的分配到这几个人身上,以提高整个团队的效率。

二、负载均衡的一些实现

① 服务端负载均衡

在服务端进行负载均衡的算法分配。

比较有名的服务端负载均衡器是 Nginx。请求先到达 Nginx 负载均衡器,然后通过负载均衡算法,在多个服务器之间选择一个进行访问。

② 客户端负载均衡

在客户端进行负载均衡的算法分配。

把负载均衡的功能以库的方式集成到客户端,而不再是由一台指定的负载均衡设备集中提供。

比如 SpringCloud 的 Ribbon,请求发送到客户端,客户端从注册中心(比如Eureka)获取服务列表,再发送请求前通过负载均衡算法选择一个服务器,然后进行访问。

Ribbon 是 SpringCloud 早期的默认实现,由于不维护了,所以最新版本的 SpringCloud 负载均衡集成的是 SpringCloudLoadBalancer(SpringCloud官方维护)

客户端负载均衡和服务端负载均衡最大的区别在于服务清单所存储的位置。

Ⅱ. SpringCloudLoadBalancer

一、快速上手

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

用了 SpringCloudLoadBalancer 之后就 "不需要也不应该" 手动调用 Eureka 选择服务实例,它会自动帮你从 Eureka 拉取实例并做负载均衡

① 使用 SpringCloudLoadBalancer 实现负载均衡

  1. RestTemplate 这个 Bean 添加 @LoadBalanced 注解:
    代码语言:javascript
    复制
    @Configuration
    public class BeanConfig {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }

2. 修改IP和端口号为服务名称:

代码语言:javascript
复制
public OrderInfo selectOrderById(Integer orderId) {
    OrderInfo orderInfo = orderMapper.selectOrderById(orderId);

    String url = "http://product-service/product/"+ orderInfo.getProductId();
    ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
    orderInfo.setProductInfo(productInfo);
    return orderInfo;
}

② 启动多个 product-service 实例

③ 测试负载均衡

连续多次发起请求:http://127.0.0.1:8080/order/1,观察 product-service 的日志,会发现请求被分配到这3个实例上了。

二、负载均衡策略

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

  1. 轮询(RoundRobin):轮询策略是指服务器轮流处理用户的请求。这是一种实现最简单,也最常用的策略。生活中也有类似的场景,比如学校轮流值日,或者轮流打扫卫生。
  2. 随机选择(Random):随机选择策略是指随机选择一个后端服务器来处理新的请求。

自定义负载均衡策略

SpringCloudLoadBalancer 默认的负载均衡策略是轮询策略,实现是 RoundRobinLoadBalancer,如果服务的消费者如果想采用随机的负载均衡策略,也非常简单。

参考官网地址:SpringCloudLoadBalancer::SpringCloudCommons

  1. 定义随机算法对象,通过 @Bean 将其加载到 Spring 容器中。此处使用 SpringCloudLoadBalancer 提供的RandomLoadBalancer
代码语言:javascript
复制
public class LoadBalancerConfig {
    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        System.out.println("=============="+name);
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name,
                ServiceInstanceListSupplier.class), name);
    }
}

💡 注意该类需要满足:

  • 不用 @Configuration 注释
  • 在组件扫描范围内
  1. 在 RestTemplate 配置类上方使用 @LoadBalancerClient 或者 @LoadBalancerClients 注解,对不同的服务提供方配置不同的客户端负载均衡算法策略。
    1. 由于这里只有一个服务提供者,所以使用 @LoadBalancerClient
代码语言:javascript
复制
@LoadBalancerClient(name = "product-service", configuration = LoadBalancerConfig.class)
@Configuration
public class BeanConfig {
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

@LoadBalancerClient 注解说明:

  • name:该负载均衡策略对哪个服务生效(服务提供方)
  • configuration:该负载均衡策略用哪个负载均衡策略实现

Ⅲ. 服务部署(Linux)

一、服务构建打包

采用 Maven 打包,需要对 3 个服务分别打包:eureka-serverorder-serviceproduct-service

打包方式和 SpringBoot 项目一致,依次对三个项目打包即可。

二、启动服务

  1. 上传 Jar 包到云服务器(lrzsz命令)
  2. 启动服务:
    代码语言:javascript
    复制
    #后台启动 eureka-server, 并设置输出日志到 logs/eureka.log
    nohup java -jar eureka-server.jar > logs/eureka.log &
    
    #后台启动 order-service, 并设置输出日志到 logs/order.log
    nohup java -jar order-service.jar > logs/order.log &
    
    #后台启动 product-service, 并设置输出日志到 logs/order.log
    nohup java -jar product-service.jar > logs/product-9090.log &

再多启动两台 product-service 实例:

代码语言:javascript
复制
# 启动实例, 指定端口号为9091
nohup java -jar product-service.jar --server.port=9091 > logs/product-9091.log &

# 启动实例, 指定端口号为9092
nohup java -jar product-service.jar --server.port=9092 > logs/product-9092.log &

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Ⅰ. 负载均衡介绍
    • 一、什么是负载均衡
    • 二、负载均衡的一些实现
      • ① 服务端负载均衡
      • ② 客户端负载均衡
  • Ⅱ. SpringCloudLoadBalancer
    • 一、快速上手
      • ① 使用 SpringCloudLoadBalancer 实现负载均衡
      • ② 启动多个 product-service 实例
      • ③ 测试负载均衡
    • 二、负载均衡策略
  • Ⅲ. 服务部署(Linux)
    • 一、服务构建打包
    • 二、启动服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档