微服务项目远程调用时的负载均衡是如何实现的?

负载均衡概述

负载均衡是微服务架构中的核心组件,用于将请求合理分配到多个服务实例上,提高系统的可用性和性能。


负载均衡的分类

负载均衡大致可以分为两类

1. 服务端负载均衡

  • 实现位置:独立部署的负载均衡服务器(位于客户端和服务端之间)
  • 工作原理:客户端请求先到达负载均衡器,由负载均衡器选择具体的服务实例
  • 代表产品:Nginx、HAProxy、F5、阿里云SLB
  • 优点:集中管理、配置简单
  • 缺点:增加网络延迟、单点故障风险

客户端 负载均衡器
Nginx/HAProxy/F5 服务实例1
192.168.1.10:8080 服务实例2
192.168.1.11:8080 服务实例3
192.168.1.12:8080

2. 客户端负载均衡

  • 实现位置:集成在客户端应用程序内部
  • 工作原理:客户端维护服务提供者列表,根据算法选择服务实例
  • 代表产品:Ribbon、Spring Cloud LoadBalancer
  • 优点:无单点故障、减少网络跳转
  • 缺点:客户端复杂度增加

获取服务列表 服务注册 服务注册 服务注册 客户端应用
内置负载均衡组件
Ribbon/LoadBalancer 注册中心
Eureka/Nacos 服务实例1
payment-service:8001 服务实例2
payment-service:8002 服务实例3
payment-service:8003


Spring Cloud中的负载均衡实现

1. Feign + Ribbon(Spring Cloud 2020之前)

java 复制代码
// 依赖配置
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

// 主启动类
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

// Feign客户端定义
@FeignClient(name = "payment-service")
public interface PaymentService {
    @GetMapping("/payment/get/{id}")
    String getPaymentById(@PathVariable("id") Long id);
}

工作原理:

  1. Feign接收到对服务名("payment-service")的调用请求
  2. Ribbon的LoadBalancerFeignClient通过拦截器机制自动拦截HTTP请求,识别服务名
  3. Ribbon从服务注册中心获取该服务("payment-service")的可用实例列表
  4. 使用默认的轮询算法或配置的其他算法选择目标实例
  5. 将HTTP请求路由到选中的服务实例并返回结果

2. Feign + Spring Cloud LoadBalancer(Spring Cloud 2020之后)

java 复制代码
// 依赖配置
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

// 主启动类
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

// Feign客户端定义
@FeignClient(name = "payment-service")
public interface PaymentService {
    @GetMapping("/payment/get/{id}")
    String getPaymentById(@PathVariable("id") Long id);
}

工作原理:

  1. Feign接收到对服务名("payment-service")的调用请求
  2. Spring Cloud LoadBalancer的LoadBalancerInterceptor通过拦截器机制自动拦截HTTP请求,提取服务名
  3. Spring Cloud LoadBalancer从服务注册中心获取该服务("payment-service")的可用实例列表
  4. 使用轮询算法或配置的其他算法选择目标实例
  5. 将HTTP请求路由到选中的服务实例并返回结果

3. Feign + 自定义负载均衡策略

java 复制代码
// 依赖配置
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

// 主启动类
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

// 自定义负载均衡配置
@Configuration
public class CustomLoadBalancerConfig {
    @Bean
    public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(
            Environment environment,
            LoadBalancerClientFactory clientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(
            clientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), 
            name);
    }
}

// Feign客户端定义
@FeignClient(name = "payment-service", configuration = CustomLoadBalancerConfig.class)
public interface PaymentService {
    @GetMapping("/payment/get/{id}")
    String getPaymentById(@PathVariable("id") Long id);
}

工作原理:

  1. Feign接收到对服务名("payment-service")的调用请求
  2. Spring Cloud LoadBalancer的LoadBalancerInterceptor通过拦截器机制自动拦截HTTP请求,并提取服务名
  3. 自定义LoadBalancer从服务注册中心获取该服务("payment-service")的可用实例列表
  4. 使用自定义负载均衡策略选择目标实例
  5. 将HTTP请求路由到选中的服务实例并返回结果
相关推荐
FII工业富联科技服务1 小时前
工业智能体技术架构解析:六级部署、核心模块与制造场景实践
人工智能·架构·制造
代码山河3 小时前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目
天远API4 小时前
零信任架构实战:基于天远租凭分期报告构建自动化智慧租房免押分期履约评估网关
运维·人工智能·架构·自动化
视频技术分享5 小时前
远程会诊产品设计复盘:音视频架构拆解与四大避坑
架构·音视频
Flynn Liang5 小时前
Spring AI 上生产:限流熔断、密钥与成本治理、私有化/混合部署、降级与 Prompt 灰度架构全解
人工智能·spring·架构·高可用·springai·成本治理·生产架构
夜雪一千6 小时前
Qwen3.8-Flash-Next 详细介绍:Qwen4架构先行版,125B总参、6B激活的稀疏MoE多模态模型
架构
FPGA小迷弟6 小时前
FPGA 千兆以太网帧格式全解:从 IEEE 802.3 帧结构到 Verilog 收发实现
人工智能·5g·fpga开发·架构·硬件架构
Decay__7 小时前
15_MySQL 数据同步与迁移方案 —— 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)
运维·数据库·sql·mysql·架构
行走的陀螺仪9 小时前
Super-Agent 架构演进(下):解耦设计与 NestJS 工程落地
架构·大模型·agent