当一个服务存在多个实例的,我们就需要使用能够满足 **负载均衡 **的 HTTP 组件。
注:基于 SpringCloud之项目初始化 之上操作。
一、 Loadbalancer
1.1 Loadbalancer 介绍
LoadBalancerClient 是 SpringCloud 提供的负载均衡器客户端,它先从提供的服务中获取某一个实例(默认策略为轮询),通过 choose() 方法获取到节点中的一个服务,拿到服务的信息之后取出服务 IP 信息,就可以得到完成的想要访问的 IP地址和接口,最后通过 RestTempate 访问服务。
1.2 Loadbalancer 使用
- 新建 HttpConfig ,启用 @LoadBalanced 实现负载均衡功能
@Configuration
public class HttpConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
- 完善 OrderController.getPrice() 方法
@GetMapping("/getPrice")
public BigDecimal getPrice(String productId) {
final BigDecimal price = restTemplate.getForObject("http://PRICE-SERVICE/price/getPrice/" + productId, BigDecimal.class);
return price;
}
- 启动 OrderService 服务,访问
http://localhost:8005/order/getPrice?productId=123
,返回:
100
说明调用成功了,我们再访问二次请求,然后查看 PriceService 控制台输出:
查看 PriceService01控制台:
productId=123
productId=123
查看 PriceService02 控制台:
productId=123
可以看到使用了轮询机制。
二、 Ribbon
Spring Cloud Netflix Ribbon 是 Spring Cloud Netflix 子项目的核心组件之一,主要给服务间调用及 API 网关转发提供负载均衡的功能。
2.2.1 Ribbon的常用配置
全局配置:
ribbon:
ConnectTimeout: 1000 #服务请求连接超时时间(毫秒)
ReadTimeout: 3000 #服务请求处理超时时间(毫秒)
OkToRetryOnAllOperations: true #对超时请求启用重试机制
MaxAutoRetriesNextServer: 1 #切换重试实例的最大个数
MaxAutoRetries: 1 # 切换实例后重试最大次数
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #修改负载均衡算法
指定服务进行配置:
user-service:
ribbon:
ConnectTimeout: 1000 #服务请求连接超时时间(毫秒)
ReadTimeout: 3000 #服务请求处理超时时间(毫秒)
OkToRetryOnAllOperations: true #对超时请求启用重试机制
MaxAutoRetriesNextServer: 1 #切换重试实例的最大个数
MaxAutoRetries: 1 # 切换实例后重试最大次数
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #修改负载均衡算法
可以看出与全局配置的区别就是 ribbon 节点挂在服务名称下面。
2.2.2 Ribbon的负载均衡策略
ribbon可以选择以下几种负载均衡策略:
* com.netflix.loadbalancer.RandomRule:从提供服务的实例中以随机的方式;
* com.netflix.loadbalancer.RoundRobinRule:以线性轮询的方式,就是维护一个计数器,从提供服务的实例中按顺序选取,第一次选第一个,第二次选第二个,以此类推,到最后一个以后再从头来过;
* com.netflix.loadbalancer.RetryRule:在RoundRobinRule的基础上添加重试机制,即在指定的重试时间内,反复使用线性轮询策略来选择可用实例;
* com.netflix.loadbalancer.WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择;
* com.netflix.loadbalancer.BestAvailableRule:选择并发较小的实例;
* com.netflix.loadbalancer.AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例;
* com.netflix.loadbalancer.ZoneAwareLoadBalancer:采用双重过滤,同时过滤不是同一区域的实例和故障实例,选择并发较小的实例。