1.什么是Ribbon?
ribbon是负载均衡的一种实现组件,和我们常见的nginx是同样的功能,不同的是nginx是服务端的负载均衡,而ribbon是客户端的负载均衡.
服务端负载均衡:在消费者和服务提供者之间使用独立的代理方式进行负载均衡,如硬件的F5,软件的nginx
客户端负载均衡:是客户端根据自己情况完成的负载均衡;
说白了,服务端的负载均衡是请求发出后,由服务提供者决定具体走哪一个服务;而客户端负载均衡是由客户端决定要请求哪个服务.
2.ribbon的负载均衡策略
- RandomRule:随机策略
- RoundRobinRule:轮询策略
- RetryRule:重试策略,在轮询的基础上进行重试;即先使用轮询来访问,如果选到的实例正常响应就返回,如果选择的服务为null或已经失效,则在失效时间deadline之前不断以轮询的方式进行重试,如果超时了,就返回null.
- WeightedResponseTimeRule:权重策略,ribbon默认的权重策略是根据服务响应时间来的,如果响应时间越短,则权重越大;如果要结合nacos使用,手动设置权重的话,需要指定是NacosRule
- BestAvailableRule:过滤失效的服务实例,然后找出请求量最小的服务来使用
- ZoneAvoidanceRule:默认规则,复合判断server所在区域(云原生概念,即服务器所在的位置,北京或成都,一般是就近原则)的性能和server的可用性选择服务器,会根据判断条件对服务进行过程,过滤完成后,走线性轮询的机制
3.如何使用负载均衡
修改默认的负载均衡策略
第一种: 配置类
package com.lipengg.config;
import com.alibaba.cloud.nacos.ribbon.NacosRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author lipengg
* @date 2023/5/21
*/
@Configuration
public class RibbonConfig {
/**
* 全局配置,指定负载均衡策略
* @return
*/
@Bean
public IRule iRule(){
return new NacosRule();
}
}
然后在启动类使用注解指定需要使用的当前负载均衡策略的服务
package com.lipengg;
@SpringBootApplication
// @RibbonClient(name = "stock-service",configuration = RibbonConfig.class)
// 配置多个
@RibbonClients(value = {
@RibbonClient(name = "stock-service",configuration = RibbonConfig.class),
@RibbonClient(name = "stock-account",configuration = RibbonConfig.class)
})
public class OrderApplication {
public static void main(String[] args) throws InterruptedException {
SpringApplication.run(OrderApplication.class, args);
}
}
******上述值得注意的是,我们的RibbonConfig类要放在@ComponentScan扫描不到的地方,如果放在了能扫描到的地方,那就是全局配置,无需用@RibbonClients指定某一服务的负载均衡策略,因为当前工程,全部的负载均衡策略都将是配置类中指定的策略
例如:我的springboot启动类在com.lipengg下面。配置类就可以在com下面,但不能在com.lipengg下面
第二种,配置文件,指定使用nacos的权重策略
stock-service: # 被调用的服务名
ribbon:
# # 指定使用nacos的负载均衡策略(优先使用同一集群的实例,基于随机和权重)
NFLoadBalanceRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule