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
@AutowiredRestTemplate 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 修改默认均衡策略
配置类(不建议使用)
@Configurationpublic class RibbonConfig{/*** 全局配置,指定负载均衡策略*/@Beanpublic 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-servicecloud: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:#设置禁用ribbonribbon:enabled: false
其他
百度网盘链接 密码: f26l
