【微服务】(四)—— 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

代码交流 2021