Ribbon 负载均衡介绍
什么是Ribbon:
目前比较主流的负载方案有以下两种:
- 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(F5),也有软件的(Nginx)
- 客户端根据自己的请求情况做负载均衡,Ribbon就属于客户端的负载均衡。
Spring Cloud Ribbon是基于Netfix Ribbon实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列完善的配置,如超时,重试等。通过LoadBalancer
获取到服务提供的所有机器实例,Ribbon会自动机遇某种规则(轮询,随机)去调用这些服务,Ribbon也可以实现我们自己的负载均衡。
客户端的负载均衡
例如spring cloud中的Ribbon。客户端会有一个服务器地址的列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端的负载均衡,即在客户端进行负载均衡算法分配
服务端的负载均衡
例如nginx,通过nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问,即在服务端在进行负载均衡算法的分配。
常见的负载均衡算法
- 随机:通过速记选择服务器进行执行,一般这种方式使用的比较少
- 轮训:负载均衡默认实现方式,请求来之后排队处理
- 加权轮询:通过对服务器性能的分型,给高配置、低负载的服务器分配更高的权重,均衡各个服务器的压力
- 地址Hash:通过客户端请求的地址的HASH值取模映射 进行服务器的调度 ip_hash
- 最小连接数:即使请求均衡了,压力不一定会均衡,最小连接数就是根据服务器的情况,比如请求积压数等参数,将请求分配到当前压力最小服务器上,最小活跃数。
Ribbon 默认的负载均衡器
Nacos-discovery依赖了ribbon,可以不用在引入ribbon依赖
添加@LoadBalanced
注解
@Bean
@LoadBalanced //负载均衡器
public RestTemplate restTemplate(RestTemplateBuilder builder){
RestTemplate restTemplate = builder.build();
return restTemplate;
}
修改controller
@Autowired
RestTemplate restTemplate;
@RequestMapping("/add")
public String add(){
System.out.println("下单成功!");
//使用远程工具进行调用
// String message = restTemplate.getForObject("http://localhost:8011/stock/reduce", String.class);
//使用nacos注册服务中心发现调用订单系统
String message = restTemplate.getForObject("http://stock-service/stock/reduce", String.class);
System.out.println(message);
return "Hello World"+message;
}
RandomRule:随机选择一个服务实例
RoundRobinRule:轮询负载均衡策略
RetryRule:在轮询的功能上重试
WeightedResponseTimeRule:权重,nacos的NacosRule,Nacos还扩展了一个机遇自己的机遇配置的权重扩展
ClientConfigEnabledRoundRobbinRule
BestAvalilableRule:过滤掉失效的服务实例功能,然后顺便找出兵伐亲故最小的服务实例来使用
ZoneAvoidanceRule:(默认规则,符合判断server所在的区域的性能和server的可用性能选择器)
AvailabilityFilterringRule:先过滤掉故障实例,在选择并发较小的实例
Ribbon 修改默认均衡策略
配置类(不建议使用)
@Configuration
public class RibbonConfig{
/**
* 全局配置,指定负载均衡策略
*/
@Bean
public IRule iRule(){
//指定使用Nacos提供的负载均衡策略(优先调用统一集群的实例,基于随机权重)
return new NacosRule();
}
}
注意:此处有坑,不能写在@SpringbootAoolication
注解的@CompentScan
扫描到的地方,否则自定义配置类会被所有的RibbonClients共享,不建议这么使用,推荐yml
利用@RibbonClient
指定微服务及区负载均衡策略
- 配置文件
调用指定的微服务提供的服务时,使用对应的负载均衡算法
修改对应的application.yml#被调用的服务名
stock-service:
ribbon:
#指定使用Nacos提供的负载均衡策略(优先调用统一集群的实例,基于随机&权重)
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
Ribbon 自定义负载均衡策略
通过实现IRule
接口可以自定义负载均衡策略,主要的选择服务逻辑在choose
方法中
开启ribbon饥饿加载
ribbon:
eager-load:
#开启加载
enable: true
#配置服务名,多个用逗号分隔
clients: stock-order
Ribbon 使用LoadBalancer替换Ribbon(目前替换后无意义)
1. 什么是Spring Cloud LoadBalancer
Spring Cloud LoadBalancer是spring Cloud官方自己提供的客户端负载均衡器,用来代替Ribbon
Spring官方提供了两种负载均衡的客户端:
RestTemplate
RestTemplate是Spring官方提供用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大的提高客户端的编写效率,默认情况下,RestTemplate默认依赖jdk的HTTP连接工具
WebClient
WebClient是从Spring 5.x版本开始提供的一个非阻塞的基于响应式编程的进行Http请求客户端工具,他的响应式编程基于Reactor的。WebClient中提供了标准的HTTP的请求以用来发器相应的请求。
2. RestTemplate整合LoadBalancer
引入依赖
在对应的客户端操作
<!--增加服务注册中心发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!--排除ribbon负载均衡方一-->
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
<!--<version></version>-->
</dependency>
<!--添加LoadBalanced依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
禁用ribbon负载均衡
# 给对应的服务起一个名称(nacos会将改名称当作服务名称)
spring:
application:
name: order-service
cloud:
nacos:
#server-addr: 111.229.181.158:8848 #配置nacos的服务地址
server-addr: 111.229.181.158:8847 #修改配置nacos的服务地址为nginx的集群地址
discovery:
username: nacos #用户名
password: nacos #密码
namespace: public # 命名空间
loadbalancer:
#设置禁用ribbon
ribbon:
enabled: false
其他
百度网盘链接 密码: f26l