Spring Cloud初探之使用load balance包做负载均衡(三)

一、背景说明

基于前一篇文章《Spring Cloud初探之nacos服务注册管理(二)》,我们已经将服务注册到nacos。接下来继续分析如何用Spring cloud的load balance做负载均衡。

load balance是客户端负载均衡组件。本质是调用方拿到所有注册的服务实例列表,然后基于一些规则选择其中的一个服务调用其提供的接口。

二、准备服务端代码

写一个简单的rest接口测试,打印输入的参数。

java 复制代码
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 课程管理服务
 *
 * @author neo
 * @since 2025-02-12
 */
@RestController
@RequestMapping("/v1/lesson")
public class LessonController {
    private static final Logger LOGGER = LogManager.getLogger(LessonController.class);

    /**
     * 插入课程数据
     *
     * @return 分配的课程编码
     */
    @PostMapping("/insert-lesson")
    public String insertLesson(@RequestBody String str) {
        LOGGER.info("Insert lesson:{}", str);
        return str;
    }
}

三、准备客户端代码

1. 在pom文件中引入依赖的loadbalance包

xml 复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

版本在父pom的依赖管理中已指定。参考文末提供的github仓库的源码地址链接。

2. 给远程调用的restTemplate增加@LoadBalanced注解

java 复制代码
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * 配置负载均衡远程调用rest模板
 *
 * @author neo
 * @since 2025/4/4
 * @version 1.0
 */
@Configuration
public class LoadBalanceConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

3.在客户端写一个测试接口

测试接口的逻辑是直接调用服务端提供的接口。

java 复制代码
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * 客户端测试接口
 *
 * @author neo
 * @since 2025/4/10
 * @version 1.0
 */
@RestController
@RequestMapping("/v1/lesson-client")
public class LessonClientController {
    private static final Logger LOGGER = LogManager.getLogger(LessonClientController.class);

    @Resource
    private RestTemplate restTemplate;
    
    /**
     * 插入课程数据
     *
     * @return 分配的课程编码
     */
    @PostMapping("/insert-lesson")
    public String insertLesson(@RequestBody String str)
    {
        LOGGER.info("Insert lesson:{}", str);
        return restTemplate.postForObject("http://cloud-server-one/spring-cloud-server/v1/lesson/insert-lesson", str, String.class);
    }
}

注意:调用服务端接口时使用的是服务名(cloud-server-one),没有使用具体服务的IP地址和端口。Load balance底层会从nacos获取服务名对应的所有服务实例,再根据负载均衡算法选择其中一个服务实例使用,将服务名替换为该服务实例的IP和端口去调用。

四、本地测试一下

  1. 将服务端打包后,使用不同的端口在本地启动两份。启动后可以看到nacos中有两个cloud-server-one实例。

  2. 调用客户端提供的测试接口,分别输入数字 1、2、3、4、5、6。观察服务接口对应的结果。


可以看到其中一个服务实例打印了奇数,另一个实例打印出了偶数, 这是因为load balance默认的均衡算法是轮询。我们可以选择它提供的其它均衡策略(如随机算法),或者完全定义自己的均衡算法。这个怎么处理在后面篇章描述。

完整源码github仓库地址:https://github.com/ylforever/neo-spring-cloud-server

相关推荐
云飞云共享云桌面1 天前
单机建模卡顿运维繁琐!中小型机械制造厂云飞云 3D 云桌面落地
运维·服务器·网络·3d·自动化·电脑·负载均衡
worilb1 天前
Spring Cloud 学习与实践(13):使用 Seata 解决分布式事务问题
分布式·学习·spring cloud
Devin~Y1 天前
电商场景下的Java面试实战:从Spring Boot微服务到Kafka、Redis与AI RAG
java·spring boot·redis·elasticsearch·spring cloud·微服务·kafka
SizeTheMoment2 天前
Spring Cloud 微服务认证体系深度解析:从架构设计到安全实践
安全·spring cloud·微服务
spider_xcxc2 天前
告别单点故障:阿里云CLB负载均衡从入门到实战
阿里云·云计算·负载均衡
逆向编程2 天前
MySQL 负载均衡完整入门实战教程
mysql·adb·负载均衡
Token炼金师4 天前
服务的骨架:网关、负载均衡、容灾、弹性与多机房 —— 推理系统架构五柱
人工智能·系统架构·llm·负载均衡·容灾·kv cache·prefix cache
微三云 - 廖会灵 (私域系统开发)4 天前
电商系统微服务拆分实战:从单体到Spring Cloud的分布式事务踩坑与补偿方案
分布式·spring cloud·微服务
k↑4 天前
SpringCloud + React19 集成Scalar的API文档
后端·spring·spring cloud
章老师说5 天前
NGINX官方谈Lua风险:这其实是两条网关技术路线之争
运维·nginx·负载均衡·lua·openresty