【微服务】(四)—— 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导入
org.springframework.cloud spring-cloud-starter-eureka org.springframework.cloud spring-cloud-starter-ribbon//--------------springcloud-H版引入eureka-client自带ribbon-----------------------// org.springframework.cloud spring-cloud-starter-netflix-eureka-client
2、代码方式修改
-
方法1:在启动类Application中添加Bean加载信息
@Bean public IRule randomRule(){ return new RandomRule(); }
- 方法二:(1)创建配置类
package com.cloud.order.config;import com.netflix.loadbalancer.IRule;import com.netflix.loadbalancer.RandomRule;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/ * @author :jizhibing * @date :Created in 2022/4/18 * @description:Ribbon规则替换类 */@Configurationpublic class MyRule { @Bean public IRule randomRule(){ //替换为随机算法 return new RandomRule(); }}
(2)在启动类上边加上:
@RibbonClient(name ="服务名" ,configuration = RibbonConfig.class)
package com.cloud.order;import com.cloud.order.config.MyRule;import com.netflix.loadbalancer.IRule;import com.netflix.loadbalancer.RandomRule;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.cloud.netflix.ribbon.RibbonClient;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;@MapperScan("com.cloud.order.mapper")@SpringBootApplication@RibbonClient(value = "服务名",configuration = MyRule.class) //指定具体的负载均衡替换类和keypublic class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
3、配置文件修改
userservice: ribbon: NFLoadBanlancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则
4、饥饿加载
Ribbon默认的是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载。
ribbon: eager-load: enabled: true #开启饥饿加载 clients: userservice #制定对userservice这个服务饥饿加载
代码资源下载:
https://pan.baidu.com/s/169SFtYEvel44hRJhmFTRTQ
提取码:1234