微服务小记:Ribbon

226 阅读3分钟

这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

Spring Cloud Ribbon是一个基于Netflix Ribbon的用于HTTP请求的客户端负载均衡工具,Spring Cloud通过对Ribbon进行封装,可以将面向服务的REST模板请求转换成客户端负载均衡的服务调用。

1. 负载均衡

1.1 什么是负载均衡

负载均衡,即Loac Balance,指的是将工作任务负载平衡的分摊到多个服务单元上进行处理,比如对于Web服务、客户端服务等进行均衡转发以保证服务的稳定性。

负载均衡是高可用框架的关键组件,通过合理的负载分配来提高网站、应用、数据库等服务的响应性能。常见的负载均衡算法有:

  1. 轮询,即Round Robin,循环的将请求分发到各个服务中
  2. 最小连接,Least Connections,此种方法优先选择连接数最小的服务器作为分发对象
  3. hash散列,对请求源IP地址做hash处理,以此选择合适的请求服务

1.2 常见的负载均衡方案

  • 集中式负载均衡,在服务消费者和服务提供者中间使用独立的代理方式进行负载均衡处理,如nginx通过服务转发实现负载均衡
  • 客户端负载均衡,指服务客户端根据接收的请求,自己进行负载均衡的处理,如Ribbon作为一个工具类框架,在每个Spring Cloud的微服务中都有存在,不需要独立部署,可以为服务自身实现负载均衡。

2. Ribbon组成模块内容

  • ribbon-loadbalancer,负载均衡模块,可独立使用,也可以和别的模块一起使用
  • ribbon-core,一些比较核心且具有通用性的代码,客户端 API 的一些配置和其他 API 的定义
  • Ribbon,内置负载均衡算法
  • ribbon-eureka,基于 Eureka 封装的模块,能够快速、方便地集成 Eureka
  • ribbon-transport,基于 Netty 实现多协议的支持,比如 HTTP、Tcp、Udp 等
  • ribbon-httpclient,基于 Apache HttpClient 封装的 REST 客户端,集成了负载均衡模块,可以直接在项目中使用来调用接口
  • ribbon-example,Ribbon 使用代码示例模块

3. Spring Cloud中使用Ribbon

3.1 引入依赖

Spring Cloud中的Eureka中已经引用的Ribbon,不需要再次引入,如果需要单独使用,则引入如下依赖信息。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

3.2 RestTemplate请求负载均衡

RestTemplate配置初始化时可以使用@LoadBalanced注解标注来开启负载均衡

@Configuration
public class BeanConfiguration {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

3.3 请求服务实现负载均衡

开启负载均衡后,使用restTemplate请求服务时,可以直接使用服务名代替域名或ip地址以及端口号。

  1. web服务定义
@RequestMapping("/getProducerInfo")
public String getProducerInfo(@RequestParam("id") String id){
    System.out.println("接收到请求,参数id=" + id + ",时间:" + System.currentTimeMillis());
    return "hello , this is producer!id=" + id;
}
  1. restTemplate调用服务
String producerPrefix = "http://producer";
String result = restTemplate.postForObject(producerPrefix + "/getProducerInfo", params, String.class);
  1. 请求调用结果 启动两个服务分别部署在不同端口,使用restTemplate进行远程调用,添加了@LoadBalance注解的restTemplate会在调用时通过服务名找到对应的ip+port并发起请求,且进行了负载均衡。

image.png

image.png