参考:<<重新定义springcloud>>
各个视频
什么是ribbon?它解决了什么问题
- Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,他是基于Netflix Ribbon实现的。
- 它不像spring cloud服务注册中心,配置中心,API网关那样独立部署,但是它几乎在每一个spring cloud微服务中,包括feign提供的声明式服务调用也是基于Ribbon实现的。
- ribbon提供了很多种负载均衡算法,例如 轮询、随机 等等。甚至是包含自定义的负载均衡算法。
- 他解决了微服务的负载均衡的问题
负载均衡解决方案的分类
目前业界主流的负载均衡方案课分为俩类:
1、集中式负载均衡,就是在consumer和provider之间使用独立的负载均衡设施(可以是硬件,如F5,也可以是软件 ,nginx)由这些设施 负责把访问请求 通过 某种策略转发至provider
2、进程内负载均衡,将负载均衡逻辑集成到consumer,consumer从注册中心获取有哪些服务地址,从中通过某种策略挑选出一个provider
Ribbon 就是属于后者,他只是一个类库,集成于consumer进程,consumer通过他来获取到provider的地址
他们的区别架构图
Ribbon的负载均衡算法策略
| id | 命名 | 策略类 | 描述 |
| 1 | 轮询算法 | RoundRibbonRule | 按顺序循环选择server |
| 2 | 随机算法 | randomRule | 随机选择server |
| 3 | 重试策略 | retryRule | 在一个配置时间内当选择的server不成功,则一直尝试选择一个可用的server |
| 4 | 最低并发策略 | BestAvailableRule | 逐个考擦server,如果server断路器打开,则忽略,选择请求中并发最小的server, |
| 5 | 可用过滤策略 | availabilityFilteringRule | 过滤掉一直连接失败并被标记为ciruruit tripped的server,过滤掉哪些高并发连接的server(active connections超过配置的阈值) |
| 6 | 响应时间加权策略 | responseTimeWeightRule | 根据server的响应时间分配权重,响应时间越长,权重越低,响应时间越短,权重越高,被选中的概率就越高,这个策略很贴切,综合了。网络 磁盘 IO等因素 |
| 7 | 区域权衡策略 | zoneavoidanceRule |
综合判断server所在区域的性能和server的可用性轮询选择server,判断一个区域是否可用,如果不可用直接将这个区域的sever都丢弃 如:多机房情况 |
使用RIbbon实现的入门实例:
1.先创建一个父工程:只有pom文件 hello-springcloud
<?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"> <modelVersion>4.0.0</modelVersion> <groupId>com.xiaodao</groupId> <artifactId>hello-springcloud</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>eureka_server</module> <module>client-a</module> <module>client-a</module> <module>ribbon-client</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> </parent> <!-- 利用传递依赖,公共部分 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- springboot web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!-- 管理依赖 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>