【微服务】(四)—— Ribbon
目录
一、Ribbon概述
二、负载均衡
三、负载均衡流程
四、负载均衡策略
1、RoundRobinRule:
2、AvailabilityFilterRule
3、WeightedResponseTimeRule
4、ZoneAvoidanceRule
5、BestAvailableRule
6、RandomRule
7、RetryRule
五、代码实操
1、maven导入
2、代码方式修改
3、配置文件修改
4、饥饿加载
一、Ribbon概述
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现,通过Spring Cloud Ribbon的封装,在微服务架构中使用客户端负载均衡调用非常简单。Ribbon是Spring Cloud整个大家庭中相对而言比较复杂的模块,直接影响到服务调度的质量和性能。
二、负载均衡
- 服务端负载均衡,又分为硬件负载均衡(比如F5)、软件负载均衡(比如Nginx)
- 客户端负载均衡(比如Ribbon)
(1)服务端负载均衡:维护一个可用的服务端清单,通过心跳检测来剔除故障的服务端节点,保证清单中都是可正常访问的服务端节点。当客户端发送请求到负载均衡设备的时候,该设备按某种算法(轮询、加权等)从维护的可用服务端清单中取出一台服务端端地址,然后进行转发。
(2)客户端负载均衡:和服务端负载均衡最大的不同点在于服务清单所存储的位置。在客户端负载均衡中,所有客户端节点都维护着自己要访问的服务端清单,而这些服务端端清单来自于服务注册中心。
三、负载均衡流程
四、负载均衡策略
** 内置负载均衡规则类&规则描述**
1、RoundRobinRule:
简单轮询服务列表来选择服务器,它是Ribbon默认的负载均衡策略
2、AvailabilityFilterRule
对以下两种服务器进行忽略:
- (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态,短路状态将持续30秒,如果再次连接失败,短路持续时间就会几何级地增加。
- (2)并发数过高的服务器,如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的ActiveConnectionsLimit进行配置。
3、WeightedResponseTimeRule
为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重会影响服务器的选择。
4、ZoneAvoidanceRule
以区域可用的服务器为基础进行服务器的选择,使用Zone对服务器进行分类,这个Zone可用理解为一个机房,一个机架等。而后再对Zone内对多个服务做轮询。
5、BestAvailableRule
![]()
忽略那些短路等服务器,并选择并发数较低的服务器
6、RandomRule
随机选择一个可用的服务器
7、RetryRule
重试机制的选择逻辑
五、代码实操
1、maven导入
1<dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-starter-eureka</artifactId> 4</dependency> 5<dependency> 6 <groupId>org.springframework.cloud</groupId> 7 <artifactId>spring-cloud-starter-ribbon</artifactId> 8</dependency> 9 10//--------------springcloud-H版引入eureka-client自带ribbon-----------------------// 11 <!--eureka client--> 12 <dependency> 13 <groupId>org.springframework.cloud</groupId> 14 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 15</dependency> 16
2、代码方式修改
-
** 方法1:在启动类Application中添加Bean加载信息**
1 @Bean 2 public IRule randomRule(){ 3 return new RandomRule(); 4 } 5
- 方法二:(1)创建配置类
1package com.cloud.order.config; 2 3import com.netflix.loadbalancer.IRule; 4import com.netflix.loadbalancer.RandomRule; 5import org.springframework.context.annotation.Bean; 6import org.springframework.context.annotation.Configuration; 7 8/** 9 * @author :jizhibing 10 * @date :Created in 2022/4/18 11 * @description:Ribbon规则替换类 12 */ 13@Configuration 14public class MyRule { 15 16 @Bean 17 public IRule randomRule(){ 18 //替换为随机算法 19 return new RandomRule(); 20 } 21 22} 23 24
(2)在启动类上边加上:
@RibbonClient(name ="服务名" ,configuration = RibbonConfig.class)
1package com.cloud.order; 2 3import com.cloud.order.config.MyRule; 4import com.netflix.loadbalancer.IRule; 5import com.netflix.loadbalancer.RandomRule; 6import org.mybatis.spring.annotation.MapperScan; 7import org.springframework.boot.SpringApplication; 8import org.springframework.boot.autoconfigure.SpringBootApplication; 9import org.springframework.cloud.client.loadbalancer.LoadBalanced; 10import org.springframework.cloud.netflix.ribbon.RibbonClient; 11import org.springframework.context.annotation.Bean; 12import org.springframework.web.client.RestTemplate; 13 14@MapperScan("com.cloud.order.mapper") 15@SpringBootApplication 16@RibbonClient(value = "服务名",configuration = MyRule.class) //指定具体的负载均衡替换类和key 17public class OrderApplication { 18 19 public static void main(String[] args) { 20 SpringApplication.run(OrderApplication.class, args); 21 } 22 23 @Bean 24 @LoadBalanced 25 public RestTemplate restTemplate(){ 26 return new RestTemplate(); 27 } 28 29} 30
3、配置文件修改
1userservice: 2 ribbon: 3 NFLoadBanlancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则 4
4、饥饿加载
Ribbon默认的是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载。
1ribbon: 2 eager-load: 3 enabled: true #开启饥饿加载 4 clients: userservice #制定对userservice这个服务饥饿加载 5
代码资源下载:
https://pan.baidu.com/s/169SFtYEvel44hRJhmFTRTQ
提取码:1234