【微服务】Ribbon——客户端负载均衡器

Ribbon:客户端负载均衡器

在微服务架构中,负载均衡是将工作负载(如网络请求)合理分配到多个计算资源(如服务器)上的关键技术,它可以有效提升系统的可用性和扩展性。负载均衡的实现方式主要有两种:服务端负载均衡客户端负载均衡。本文将重点介绍基于 Ribbon 的客户端负载均衡。

一、负载均衡的类型

  1. 服务端负载均衡

    服务端负载均衡通常在客户端和服务端之间部署一个独立的负载均衡服务器,负载均衡服务器可以是硬件设备(如 F5)或者软件(如 Nginx)。该负载均衡服务器维护一个可用服务端的清单,并通过心跳机制定期检查服务实例的健康状态,确保清单中的服务节点是可用的。

    客户端发送请求时,负载均衡服务器负责选择一个服务实例并将请求转发过去。常见的负载均衡算法有轮询、随机等。

  2. 客户端负载均衡

    客户端负载均衡则将负载均衡逻辑封装到客户端。客户端通过与服务注册中心(如 Eureka)交互,获取可用服务实例的列表。客户端在发送请求前,通过负载均衡算法选择一个服务实例进行访问,确保请求分发的均衡。

    与服务端负载均衡不同,客户端负载均衡不需要额外部署负载均衡服务器,且每个客户端都维护一份服务实例的清单。这些实例列表通过心跳机制与服务注册中心同步更新,确保清单中的服务实例是健康的。

    心跳机制:用于定期检查服务实例的健康状态,负载均衡器通过向服务实例发送轻量级探测请求,根据响应判断实例的可用性。

二、Ribbon:基于 HTTP 和 TCP 的客户端负载均衡器

Ribbon 是 Spring Cloud 提供的一个客户端负载均衡器,能够与服务注册中心(如 Eureka)结合使用,从而为微服务间的通信提供负载均衡。通过 Ribbon,客户端可以从服务注册中心动态获取服务实例,并通过负载均衡算法(如轮询、随机等)将请求分发到合适的服务端实例上。

如何使用 Ribbon

与 RestTemplate 配合使用

RestTemplate 是 Spring 提供的一个用于发送 HTTP 请求的客户端模板工具。它封装了 HTTP 请求的细节,并提供了一些常用的方法,如 getForObject()postForObject() 等,用于访问远程 HTTP 服务。

使用 Ribbon 时,RestTemplate 可以与 Ribbon 集成,自动实现负载均衡。

示例代码

1. pom.xml 配置

pom.xml 中添加相关依赖:

<dependencies>
    <!-- Spring Cloud Eureka 客户端依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!-- Spring Cloud Ribbon 依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
</dependencies>
2. application.yml 配置

配置 Eureka 客户端与服务注册中心的信息:

server:
  port: 80  # 服务端口号
eureka:
  client:
    register-with-eureka: false  # 不将自己注册到 Eureka
    fetch-registry: true  # 向 Eureka 获取服务列表
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/, http://eureka7002.com:7002/eureka/
3. 配置 RestTemplate

创建一个配置类,注入 RestTemplate,并启用负载均衡:

@Configuration
public class ConfigBean {

    @Bean
    @LoadBalanced  // 开启负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
4. 创建 Controller

在 Controller 中通过 RestTemplate 调用服务:

@RestController
public class DeptController_Consumer {

    private static final String REST_URL_PROVIDER_PREFIX = "http://MICROSERVICECLOUDPROVIDERDEPT"; // 通过服务名访问服务

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Integer id) {
        return restTemplate.getForObject(REST_URL_PROVIDER_PREFIX + "/dept/get/" + id, Dept.class);
    }

    @RequestMapping("/consumer/dept/list")
    public List<Dept> list() {
        return restTemplate.getForObject(REST_URL_PROVIDER_PREFIX + "/dept/list", List.class);
    }
}
5. 启动类

启用 Eureka 客户端:

@SpringBootApplication
@EnableEurekaClient
public class MicroServiceCloudConsumerDept80Application {

    public static void main(String[] args) {
        SpringApplication.run(MicroServiceCloudConsumerDept80Application.class, args);
    }
}

启动服务后,依次启动 Eureka 服务注册中心、服务提供者以及服务消费者。

切换负载均衡策略

默认情况下,Ribbon 使用轮询策略(RoundRobinRule)选择服务实例。不过,我们可以根据需求定制负载均衡策略。只需在配置类中注入不同的 IRule 实现类即可。

例如,切换到随机策略:

@Bean
public IRule myRule() {
    return new RandomRule();  // 使用随机策略
}

定制负载均衡策略

我们还可以实现自定义的负载均衡策略。例如,下面是一个自定义的 MyRandomRule,它保证每个服务实例最多调用 3 次,然后切换到下一个实例。

public class MyRandomRule extends AbstractLoadBalancerRule {
    private int total = 0;
    private int currentIndex = 0;

    @Override
    public Server choose(ILoadBalancer lb, Object key) {
        List<Server> upList = lb.getReachableServers();
        if (upList.isEmpty()) return null;

        if (total < 3) {
            total++;
            return upList.get(currentIndex);
        } else {
            total = 0;
            currentIndex++;
            if (currentIndex >= upList.size()) currentIndex = 0;
            return upList.get(currentIndex);
        }
    }
}

将自定义策略注入到容器中:

@Configuration
public class MySelfRibbonRuleConfig {

    @Bean
    public IRule myRule() {
        return new MyRandomRule();  // 使用自定义的随机规则
    }
}

最后,在主启动类中通过 @RibbonClient 注解激活自定义的负载均衡策略:

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "MICROSERVICECLOUDPROVIDERDEPT", configuration = MySelfRibbonRuleConfig.class)
public class MicroServiceCloudConsumerDept80Application {

    public static void main(String[] args) {
        SpringApplication.run(MicroServiceCloudConsumerDept80Application.class, args);
    }
}

总结

本文介绍了如何在 Spring Cloud 中使用 Ribbon 实现客户端负载均衡。通过与 Eureka 配合,Ribbon 可以动态获取服务实例并根据负载均衡策略选择合适的服务。你还可以定制自己的负载均衡策略,满足更复杂的需求。通过这些技术,微服务架构能够实现高可用、可扩展的服务调用模式。

#微服务#
微服务知识 文章被收录于专栏

微服务相关知识详解

全部评论

相关推荐

昨天 23:00
黄淮学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11136次浏览 95人参与
# 你的实习产出是真实的还是包装的? #
1966次浏览 42人参与
# 巨人网络春招 #
11380次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7655次浏览 43人参与
# 简历第一个项目做什么 #
31758次浏览 341人参与
# 重来一次,我还会选择这个专业吗 #
433574次浏览 3926人参与
# MiniMax求职进展汇总 #
24132次浏览 309人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187230次浏览 1122人参与
# 牛客AI文生图 #
21453次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152470次浏览 888人参与
# 研究所笔面经互助 #
118976次浏览 577人参与
# 简历中的项目经历要怎么写? #
310388次浏览 4219人参与
# AI时代,哪些岗位最容易被淘汰 #
63881次浏览 828人参与
# 面试紧张时你会有什么表现? #
30518次浏览 188人参与
# 你今年的平均薪资是多少? #
213155次浏览 1039人参与
# 你怎么看待AI面试 #
180177次浏览 1258人参与
# 高学历就一定能找到好工作吗? #
64339次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76552次浏览 374人参与
# 我的求职精神状态 #
448151次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363545次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160685次浏览 1112人参与
# 校招笔试 #
471269次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务