Ribbon负载均衡
1.理解Ribbon
Ribbon 是一个基于 HTTP 和 TCP 的 客服端 负载均衡工具,它是基于 Netflix Ribbon 实现的。 它不像 Spring Cloud 服务注册中心、配置中心、API 网关那样独立部署,但是它几乎存在于每个
Spring Cloud 微服务中。包括 Feign 提供的声明式服务调用也是基于该 Ribbon 实现的。
Ribbon 默认提供很多种负载均衡算法,例如轮询、随机等等。甚至包含自定义的负载均衡算法。
2.Ribbon功能
Ribbon 提供了一套微服务的负载均衡解决方案。
3.负载均衡方案
集中式负载均衡(服务器负载均衡),即在 consumer 和 provider 之间使用独立的负载均衡设施(可
以是硬件,如 F5,也可以是软件,如 nginx),由该设施负责把访问请求通过某种策略转发provider;
进程内负载均衡(客户端负载均衡),将负载均衡逻辑集成到 consumer,consumer 从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的 provider。Ribbon 属于后者,它只是一个类库,集成于 consumer 进程,consumer 通过它来获取 provider 的地址。
4.Ribbon负载均衡策略
- 轮询策略(默认)
策略对应类名:
RoundRobinRule
实现原理:轮询策略表示每次都顺序取下一个 provider,比如一共有 5 个 provider,第 1 次取第 1 个,第 2 次取第 2 个,第 3 次取第 3 个,以此类推。
- 权重轮询策略
策略对应类名:
WeightedResponseTimeRule
实现原理:根据每个 provider 的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。原理:一开始为轮询策略,并开启一个计时器,每 30 秒收集一次每个 provider 的平均响应时间,当信息足够时,给每个 provider 附上一个权重,并按权重随机选择 provider,高权越重的 provider 会被高概率选中。
- 随机策略
策略对应类名:
RandomRule
实现原理:从 provider 列表中随机选择一个。
- 最少并发数策略
策略对应类名:
BestAvailableRule
实现原理:选择正在请求中的并发数最小的 provider,除非这个 provider 在熔断中。
- 重试策略
策略对应类名:
RetryRule
实现原理:其实就是轮询策略的增强版,轮询策略服务不可用时不做处理,重试策略服务不可用时会重新尝试集群中的其他节点。
- 可用性敏感策略
策略对应类名:
AvailabilityFilteringRule
实现原理:过滤性能差的 provider
第一种:过滤掉在 Eureka 中处于一直连接失败的 provider。
第二种:过滤掉高并发(繁忙)的 provider。
- 区域敏感性策略
策略对应类名:
ZoneAvoidanceRule
实现原理:以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的 provider。如果这个 ip 区域内有一个或多个实例不可达或响应变慢,都会降低该 ip 区域内其他 ip 被选中的权重。
5.Ribbon案例
创建项目 pom父工程(在Eurake项目中,添加service-provider02)
添加依赖
<!-- 继承父依赖 -->
<parent>
<groupId>com.shsxt</groupId>
<artifactId>eureka-demo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<properties>
<!-- 项目打包和编译使用的编码字符集以及 jdk 版本 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- 项目依赖 -->
<dependencies>
<!-- netflix eureka client 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- spring boot web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- lombok 依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!-- spring boot actuator 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- spring boot test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
配置文件
spring:
application:
name: service-provider # 应用名称(集群下相同)
# 端口
server:
port: 7071
# 配置 Eureka Server 注册中心
eureka:
instance:
prefer-ip-address: true # 是否使用 ip 地址注册
instance-id: ${spring.cloud.client.ip-address}:${server.port} # ip:port
client:
service-url: # 设置服务注册中心地址
defaultZone: http://root:123456@localhost:8761/eureka/,http://root:123456@localhost:8762/eureka/
服务及启动类
跟service-provider一样
@SpringBootApplication
// 开启 EurekaClient 注解,目前版本如果配置了 Eureka 注册中心,默认会开启该注解
//@EnableEurekaClient
public class ServiceProvider02App {
public static void main(String[] args) {
SpringApplication.run(ServiceProvider02App.class,args);
}
}
访问
注册中心:http://localhost:8761/
消费服务:http://localhost:8080/user/manage
6.Ribbon指定其他负载均衡策略
全局
在启动类或配置类中注入负载均衡策略对象。所有服务请求均使用该策略。
//随机策略
@Bean
public RandomRule randomRule(){
return new RandomRule();
}
局部
修改配置文件指定服务的负载均衡策略。
# 负载均衡策略
# service-provider 为调用的服务的名称
service-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
7.Ribbon点对点直连
点对点直连是指绕过注册中心,直接连接服务提供者获取服务,一般在测试阶段使用比较多。
添加依赖
<!-- netflix ribbon 依赖 -->
<!-- Ribbon 点对点直连 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
配置文件
# 负载均衡策略
# service-provider 为调用的服务的名称
service-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
# 指定具体的 Provider 服务列表,多个用逗号隔开
listOfServers: http://localhost:7070,http://localhost:7071
# 关闭 Eureka 实现 Ribbon 点对点直连
ribbon:
eureka:
enabled: false # false:关闭,true:开启
访问
关闭 Eureka 注册中心,服务提供者由于无法连接至注册中心所以会报连接异常。但是服务是可以正常可消费的,所以目前使用的是点对点的方式来进行调用的。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/121458.html