Ribbon
Ribbon是什么??
SpringCloud Ribbon 是基于Netflix Ribbon实现的一套客户端负载均衡的工具(负载均衡 + RestTemplate调用)。
LB(Load Balance)负载均衡是什么?
简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的高可用。
Ribbon本地负载均衡客户端 VS Nginx服务端负载均衡区别?
Nginx是服务器负载均衡,客户端的所有请求都会交给Nginx,然后由Nginx实现转发请求,即负载均衡是由服务端实现的。
Ribbon(进程内LB)是本地负载均衡,在调用微服务接口的时候,会在注册中心上获取注册信息列表之后缓存到JVM本地,从而实现RPC远程调用。
springBoot项目中使用:
yml:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.1.RELEASE</version>
<scope>compile</scope>
</dependency>
使用@LoadBalanced:
package com.dw.springcloud.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * @Author dw * @ClassName ApplicationContextConfig * @Description * @Date 2020/3/26 15:53 * @Version 1.0 */ @Configuration public class ApplicationContextConfig { @Bean @LoadBalanced // 使用@LoadBalanced注解赋予RestTemplate负载均衡的能力 public RestTemplate restTemplate(){ return new RestTemplate(); } }
负载均衡算法-轮询算法原理:rest接口第几次请求数 % 服务器集群总量 = 实际调用服务器位置下标,每次重启后rest接口计数从1开始。
获取所有的当前微服务实例:
List<ServiceInstance>instances = discoveryClient.getInstances(“CLOUD-PAYMENT_SERVICE”);
例如:
List[0] instances = 127.0.0.1:8002
List[1] instances = 127.0.0.1:8001
8001 + 8002 组合为集群,他们共两台机器,集群总数为2, 按照轮询算法
当请求总数为1时,1 % 2 = 1对应下标为1,则获得127.0.0.1:8001;
当请求总数为2时,2 % 2 = 0对应下标为0,则获得127.0.0.1:8002;
当请求总数为3时,3 % 2 = 1对应下标为1,则获得127.0.0.1:8001;
当请求总数为4时,4 % 2 = 0对应下标为0,则获得127.0.0.1:8002;
Ribbon默认的负载均衡的转发规则是轮询,当然也提供了其他的负载均衡规则,如何使用呢?:
注意:官方文档提示:自定义的配置类不能放在@ComponentScan所扫描的当前包及子包下。
如下:
Ribbon内置的负载规则:
内置负载均衡规则类 |
规则描述 |
RoundRobinRule |
简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
AvailabilityFilteringRule |
对以下两种服务器进行忽略: |
WeightedResponseTimeRule |
为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
ZoneAvoidanceRule |
以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。 |
BestAvailableRule |
忽略那些短路的服务器,并选择并发数较低的服务器。 |
RandomRule |
随机选择一个可用的服务器。 |
Retry |
重试机制的选择逻辑 |
原文:https://www.cnblogs.com/dw3306/p/12636405.html