负载均衡:Ribbon

简介

可先参看上一节:Spring Cloud 最佳项目构建

如果同一个提供者在 Eureka 注册了多个服务,那么消费者如果选择服务呢?

这时,需要在消费端实现服务的负载均衡。

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

实现架构

image-20210403225908302

使用 Ribbon

添加依赖: spring-cloud-starter-netflix-eureka-server 中已经包含了 ribbon,故不需要再重复引入。

image-20210403225920128

在 RestTemplate 设置 @LoadBalanced 注解:

public class OrderApplication {

    @Bean
    @LoadBalanced       //开启负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
    }

这样,RestTemplate 就具备了负载均衡的功能。

测试负载均衡

启动两个 springcloud-microservice-item(注意修改端口)

image-20210403225939501

引入 Spring Boot 单元测试依赖:

<!-- 添加 Spring Boot 单元测试包-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

编写测试类:


/**
 * 测试负载均衡策略
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = OrderApplication.class)
public class LoadBalanceTest {

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Test
    public void test() {
        String itemServiceId = "springcloud-microservice-item";

        for (int i = 0; i < 50; i++) {
            ServiceInstance serviceInstance = loadBalancerClient.choose(itemServiceId);
            System.out.println("第" + i +"次调用:"
                    + serviceInstance.getHost() +":" + serviceInstance.getPort());
        }
    }
}

启动,查看测试结果:

image-20210403225957328

可见 Ribbon 中默认的负载均衡算法是轮询。

如果要设置负载均衡为随机,需要修改配置文件: 在消费端 application.properties 中添加:

springcloud-microservice-item.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

再次测试:

image-20210403230013609

可见都是随机调用的了。

推荐阅读:

Spring Cloud 最佳项目构建

本文首发于 turbobin’s Blog 。转载请注明出处,附上本原文链接, 谢谢合作。

 


关注微信公众账号「曹当家的」,订阅最新文章推送

Table of Contents