注明:此项目为本人学习尚硅谷老师的教学视频和狂神说
ribbon是什么?
●Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
●简单的说,Ribbon是Netflix发 布的开源项目,主要功能是提供客户端的软件负载均衡算法,将NetFlix的中间
层服务连接在一起。 Ribbon的客户端组件提供一系列完整的配置项如: 连接超时、重试等等。简单的说,就
是在配置文件中列出LoadBalancer (简称LB:负载均衡)后面所有的机器,Ribbon会 自动的帮助你基于某种
规则(如简单轮询,随机连接等等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法!
ribbon能干嘛?
●LB,即负载均衡(Load Balance), 在微服务或分布式集群中经常用的一种应用。
●负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA (高可用)。
●常见的负载均衡软件有Nginx, LvVs 等等
●dubbo、 SpringCloud中均给我们提供了 负载均衡, SpringCloud的负载均衡算法可以自定义
●负载均衡简单分类:
。集中式LB .
■即在服务的消费方和提供方之间使用独立的LB设施,比如 Nginx, 由该设施负责把访问请求通过某种策
略转发至服务的提供方!
。进程式LB .
■将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选出
一个合适的服务器。
■Ribbon就属于进程内LB,它只是一个类库, 集成于消费方进程,消费方通过它来获取到服务提供方
的地址!
总结
ribbon是在客户端进行配置对消费端进行一个负载均衡访问
Ribbon代码介绍
Ribbon算法介绍
1.默认使用轮询算法
RoundRobinRule(轮询算法)
RandomRule(随机算法)
AvailabilityFilteringRule():会先过滤由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
WeightedResponseTimeRule():根据平均响应的时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高,刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够会切换到WeightedResponseTimeRule
RetryRule():先按照RoundRobinRule的策略获取服务,如果获取失败则在制定时间内进行重试,获取可用的服务。
BestAviableRule():会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
ZoneAvoidanceRule():默认规则,符合判断server所在区域的性能和server的可用性选择服务器
Ribbon添加默认轮询算法
maven
注意事项:
- H版本及之后的eureka的客户端集成了ribbon不需要二次添加配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud2021</artifactId>
<groupId>com.yu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-consumer-order80</artifactId>
<dependencies>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>com.yu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
配置RestTemplate
@LoadBalanced注解开启负载均衡,并且没有指定算法的时候,默认使用轮询
/**
* @author 小鱼
* @version 1.0
* @date 2021/7/17 4:20 下午
*/
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
自定义算法或者替换默认的轮询算法
官方文档指出:
这个自定义的类不能放在@ComponentScan所扫描的当前包以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是我们达不到特殊化指定的目的了。
编写自定义或者替换类
/**
* @author 小鱼
* @version 1.0
* @date 2021/7/25 10:43 上午
* 替换轮询算法成随机算法
*/
@Configuration
public class MyRule {
@Bean
public IRule myRule(){
return new RandomRule();
}
}
主启动类添加注解
1.@RibbonClient(name = “cloud-payment-service”,configuration = MyRule.class)
/**
* @author 小鱼
* @version 1.0
* @date 2021/7/17 4:18 下午
*/
@SpringBootApplication
//EurekaClient客户端
@EnableEurekaClient
//开启自定义或者替换默认轮询算法
@RibbonClient(name = "cloud-payment-service",configuration = MyRule.class)
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class);
}
}