????????Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具,是Netflix发布的一款开源项目,其主要功能是提供客户端的软件负载均衡算法和服务调用,Ribbon客户端组件提供一系列完善的配置项,例如:连接超时、重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
https://github.com/Netflix/ribbon/wiki/Getting-Started
????????未来的替代方案:Spring Cloud LoadBalancer。?
????????LB的全称是Load Balance,中文意思为负载均衡,简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用),常见的负载均衡有软件Nginx,LVS,硬件 F5等。
????????Nginx是服务器负载均衡,客户端所有请求都会交给Nginx,然后由Nginx实现转发请求,即负载均衡是由服务端实现的。Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用。
????????即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;
????????将LB逻辑集成到消费方,消费方从服务注册中心获取有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址;
Ribbon在工作时分成两步:
第一步:从注册中心查询可用的服务列表;
第二步:根据用户指定的策略,从可用的服务列表中选择一个地址。其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。原理图如下:小总结:Ribbon其实就是一个软负载均衡的客户端组件,它可以和其他所需请求的客户端结合使用,和Nacos结合只是其中的一个实例,也可以和Eureka结合;
????????根据特定算法中从服务列表中选取一个要访问的服务。
(1)com.netflix.loadbalancer.RoundRobinRule:轮询
(2)com.netflix.loadbalancer.RandomRule:随机
(3)com.netflix.loadbalancer.RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务
(4)com.netflix.loadbalancer.WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
(5)BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
(6)AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例
(7)ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器
负载均衡算法: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台机器,集群总数为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
依次类推......
(1)导入依赖:
<!-- nacos 服务注册&发现 -->
<dependency>
???????? <groupId>com.alibaba.cloud</groupId>
???????? <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
(2)配置Bean:
MyRandom代码:
/**
* @Author : 一叶浮萍归大海
* @Date: 2024/1/3 9:00
* @Description:
*/
public class MyRandomRule extends AbstractLoadBalancerRule {
@Override
public Server choose(Object key) {
// 获取当前请求的服务实例
ILoadBalancer loadBalancer = this.getLoadBalancer();
List<Server> servers = loadBalancer.getReachableServers();
int index = ThreadLocalRandom.current().nextInt(servers.size());
return servers.get(index);
}
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
}
(3)主启动类添加注解
/**
* @Author : 一叶浮萍归大海
* @Date: 2024/1/3 8:39
* @Description:
*/
@RibbonClients(value = {
@RibbonClient(name = "stock-service-nacos",configuration = MyRibbonConfig.class)
})
@SpringBootApplication
public class OrderServiceRibbon8001MainApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceRibbon8001MainApplication.class, args);
}
}