Spring Cloud Ribbon实现客户端负载均衡

本文详细介绍如何使用Eureka和Ribbon在微服务架构中实现服务集群与客户端负载均衡,包括搭建Eureka服务治理环境、创建服务集群、客户端调用服务及自定义负载均衡策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

  • 负载方案分为两种:一种是集中式负载均衡,在服务调用者和服务提供方之间使用独立的代理方式进行负载处理,比如lvs+nginx方案。
  • 另一种则是客户端自己做负载均衡,服务调用者可根据自己的情况灵活做负载,Ribbon就属于这种情况。
    在这里插入图片描述

一、搭建Eureka服务治理环境

二、创建服务集群

  • 对GOODS-SERVICE服务进行集群部署
# 商品服务集群节点1
server.port=8080

spring.application.name=goods-service
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true

eureka.client.service-url.defaultZone=http://localhost:8761/eureka
# 商品服务集群节点2
server.port=8070

spring.application.name=goods-service
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true

eureka.client.service-url.defaultZone=http://localhost:8761/eureka
  • 服务端加入日志信息,便于监控
/**
 * 商品服务-模拟返回商品列表
 */
@RestController
@RequestMapping("api/goods")
public class GoodsService {

    private final static Logger logger = LoggerFactory.getLogger(GoodsService.class);

    @Value("${spring.application.name}")
    private String service;

    @Value("${server.port}")
    private String port;

    // 返回商品列表
    @GetMapping
    public List<Goods> getAllGoods() {
        List<Goods> goods = new ArrayList<>();
        goods.add(new Goods("电脑", 10));
        goods.add(new Goods("手机", 20));
        goods.add(new Goods("书籍", 30));
        logger.info(LocalDateTime.now()+" "+service+":"+port+" used!");
        return goods;
    }
}
  • 注册服务:这时候在Eureka控制台可以看到GOODS-SERVICE服务下由两个节点组成了集群服务。
    在这里插入图片描述

三、客户端调用服务

  • 客户端配置
server.port=8081

spring.application.name=user-consumer
# 服务调用者不需要向服务中心进行注册
eureka.client.register-with-eureka=false
# 向eureka服务器获取服务列表
eureka.client.fetch-registry=true

eureka.client.service-url.defaultZone=http://localhost:8761/eureka
# 调用商品服务的地址
goods-service.url=http://GOODS-SERVICE/
  • 通过@LoadBalanced注解,使用Ribbon组件进行负载均衡控制
/**
 * 用户消费者启动类
 */
@EnableEurekaClient
@SpringBootApplication
public class UserConsumerApplication {

    // 向Spring注册一个RestTemplate Bean
    @Bean
    // 通过@LoadBalanced注解,即使用Ribbon组件进行负载均衡控制
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

    public static void main(String[] args) {

        SpringApplication.run(UserConsumerApplication.class, args);
    }

}


/**
 * 用户消费者--调用eureka服务器中的商品服务,并对外提供RestFul接口测试
 */
@RestController
@RequestMapping("user/")
public class UserConsumer {

    @Autowired
    private RestTemplate restTemplate;

    @Value("${goods-service.url}")
    private String url;

    @GetMapping("/goods")
    public User getUserGoods() {
        User user = new User();
        // 调用商品微服务
        Object response = restTemplate.getForEntity(url + "api/goods", Object.class).getBody();
        try {
            user.setName("jack");
            user.setGoods((List<GoodsDTO>) response);
        } catch (Exception e){
            throw new RuntimeException(e.getMessage());
        }
        return user;
    }

}
  • 使用HttpClient工具进行测试
    在这里插入图片描述
  • 观察服务集群中两个节点的日志信息,可以发现负载均衡已经起作用,服务调用者的请求被平均分配到了集群中的两个节点上。
    在这里插入图片描述
    在这里插入图片描述

四、自定义负载均衡策略

  • Ribbon默认的负载策略是轮询,同时也提供了很多其他的策略,能够让用户根据自身的业务需求进行选择。
RoundRobinRule轮询选择
RandomRule随机选择一个Server
WeightedResponseTimeRule根据响应时间分配一个Weight(权重),响应时间越长,Weight越小,被选中的可能性越低
BestAvailabl选择一个最小的并发请求的Server,逐个考察Server,如果Server被标记为错误,则跳过,然后再选择ActiveRequestCount中最小的Server
  • 客户端增加一个自定义策略配置文件:将负载均衡策略设为随机
/**
 * 自定义负载均衡策略配置
 */
@Configuration
public class RibbonConfig {

    @Bean
    public IRule ribbonRule() {
        return new RandomRule(); //设置负载均衡的规则为随机
        //return new RoundRobinRule(); //默认的轮询策略
    }
}
  • 指定客户端调用某个服务时使用自定义的负载均衡策略
/**
 * 用户消费者启动类
 */
@EnableEurekaClient
@SpringBootApplication
// 指定对调用商品服务时启用自定义策略
@RibbonClient(name = "GOODS-SERVICE", configuration = RibbonConfig.class)
public class UserConsumerApplication {

    // 向Spring注册一个RestTemplate Bean
    @Bean
    // 通过@LoadBalanced注解,启用负载均衡
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

    public static void main(String[] args) {

        SpringApplication.run(UserConsumerApplication.class, args);
    }

}
  • 再次使用HttpClient工具进行测试,观察服务集群节点的日志信息:原有的轮询策略已变成了随机策略。
    在这里插入图片描述
    在这里插入图片描述

小结

  • Ribbon是Spring Cloud组件框架中实现客户端负载均衡的组件,可以让我们的服务调用具备负载均衡的能力。
  • 通过Spring Cloud Ribbon的封装,我们在微服务架构中使用客户端负载均衡调用非常简单,只需要如下两步:
    1. 服务提供者通过集群方式注册到Eureka服务中心。
    2. 服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智慧zhuhuix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值