-
Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。负载均衡是系统处理高并发、缓解网络压力和服务端扩容的重要手段之一。
-
通过Ribbon,以将面向服务的 REST 模板(RestTemplate)请求转换为客户端负载均衡的服务调用,Spring Cloud 微服务之间的调用,API 网关的请求转发等内容,实际上都是通过 Spring Cloud Ribbon 来实现的。
-
服务端负载均衡
当客户端发送请求时,该请求不会直接发送到服务端进行处理,而是全部交给负载均衡服务器,由负载均衡服务器按照某种算法(例如轮询、随机等),从其维护的可用服务清单中选择一个服务端,然后进行转发。
服务端负载均衡具有以下特点:
需要建立一个独立的负载均衡服务器。
负载均衡是在客户端发送请求后进行的,因此客户端并不知道到底是哪个服务端提供的服务。
可用服务端清单存储在负载均衡服务器上。 -
客户端负载均衡
客户端负载均衡是将负载均衡逻辑以代码的形式封装到客户端上,即负载均衡器位于客户端。客户端通过服务注册中心(例如 Eureka Server)获取到一份服务端提供的可用服务清单。有了服务清单后,负载均衡器会在客户端发送请求前通过负载均衡算法选择一个服务端实例再进行访问,以达到负载均衡的目的;
客户端负载均衡也需要心跳机制去维护服务端清单的有效性,这个过程需要配合服务注册中心一起完成。
客户端负载均衡具有以下特点:
负载均衡器位于客户端,不需要单独搭建一个负载均衡服务器。
负载均衡是在客户端发送请求前进行的,因此客户端清楚地知道是哪个服务端提供的服务。
客户端都维护了一份可用服务清单,而这份清单都是从服务注册中心获取的。Ribbon 就是一个基于 HTTP 和 TCP 的客户端负载均衡器,当我们将 Ribbon 和 Eureka 一起使用时,Ribbon 会从 Eureka Server(服务注册中心)中获取服务端列表,然后通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。
-
区别
-
Ribbon负载均衡策略
-
负载均衡的工作流程
负载均衡的工作流程主要有以下几个过程:
首先 order-service 使用 RestTemplate 发送的请求会被 Ribbon(负载均衡) 所拦截,并对请求的 url 进行解析;
拿到服务名称 userservice(user-service 配置文件中服务命名) ,接着 Ribbon 会通过这个服务名称 userservice 去 eureka-server (服务注册中心)拉去服务的服务列表(要访问的主机ip和端口号);
最后 Ribbon 会通过负载均衡算法从服务列表中挑选出合适的ip+端口号,接着 Ribbon 会通过修改服务名称 userservice 为挑选出的 ip+端口号 刚刚请求到对应的服务。 -
策略原理
负载均衡的实现主要有三种算法:轮询(默认方式)、随机、权值分配,其中轮询 ZoneAvoidanceRule 也是 @LoadBalanced 注解默认的分配策略
-
定义IRule修改负载均衡规则
- 方式一: 在order–service中的OrderApplication类中,定义一个新的IRule:
@Bean public IRule randomRule() { return new RandomRule(); }
- 方式二: 配置文件方式:在order–servicel的application.yml文件中,添加新的配置也可以修改规则:
userservice: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
-
饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长,而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
ribbon: eager-load: enabled: true # 开启饥饿加载 clients: - userservice # 指定饥饿加载的服务名称 - xxservice