Spring Cloud: Ribbon实现负载均衡

本文介绍了如何在SpringCloud中使用Ribbon实现服务间的负载均衡。通过开启多个user-service实例并注册到Eureka,展示了Ribbon的默认轮询策略。同时,文章还演示了如何修改配置以切换到随机负载均衡策略,并提供了测试代码进行验证。最后,提到了通过配置文件调整负载均衡算法的实现。

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

Spring Cloud: Ribbon实现负载均衡

在实际应用中,对于服务提供者user-service,我们会开启多个集群,此时我们获取到多个服务列表,我们该如何选择使用哪一个服务呢?一般情况下,我们需要自己写负载均衡算法来选择合适的服务,不过在Eureka中已经实现了负载均衡组件:ribbon。

1.简介

Ribbon是NetFlix发布的负载均衡器,它有助于控制Http和TCP客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon就可以基于某种负载均衡算法,自动的帮助服务消费者去请求。Ribbon默认提供了很多负载均衡算法,例如轮询、随机等,当然,我们也可以为Ribbon实现自定义的负载均衡算法。

2.Ribbon实现

启动两个user-service实例,端口号分别为10001和10002,启动eureka,Eureka端口号为10000,访问localhost:10000
在这里插入图片描述
可以看到两个user-service已经注册到Eureka了。

开启负载均衡,由于Eureka中已经集成了Ribbon,所以不需要在引入依赖,直接在RestTemplate配置方法添加@LoadBalanced注解

@SpringBootApplication
@EnableDiscoveryClient //开启Eureka客户端发现功能
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

修改调用方式,不在通过手动方式获取ip和端口,而是通过服务器名称调用

@RestController
@RequestMapping("/consumer")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;
    @GetMapping("/{id}")
    public User queryById(@PathVariable Long id){
        String url="http://user-service/user/"+id;
        return restTemplate.getForObject(url,User.class);
    }
}

启动Eureka、服务端和客户端,访问页面,查看控制台

在这里插入图片描述

Ribbon的默认负载均衡策略是简单的轮询,我们可以写个测试类进行验证,在ribbon中使用的RibbonLoadBalanceClient来进行负载均衡的,其中有有一个choose方法是负载均衡获取实例的,注入这个类的对象,进行测试。

@RunWith(SpringRunner.class)
@SpringBootTest
public class LoadBalanceTest {

    @Autowired
    private RibbonLoadBalancerClient client;
    @Test
    public void test(){
        for(int i=0;i<10;i++){
            ServiceInstance instance = client.choose("user-service");
            System.out.println(instance.getHost()+":"+instance.getPort());
        }

    }
}

启动测试类,查看控制结果,发现10001和10002交替出现,证明负载均衡算法采用的是轮询的方式。
在这里插入图片描述

SpringBoot也提供了修改负载均衡规则的配置入口,格式是{服务名}ribbon.NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule ,值就是IRule的实现类

user-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

再次测试,发现负载均衡采用了随机的方式。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值