服务消费之负载均衡

当一个服务存在多个实例的,我们就需要使用能够满足 **负载均衡 **的 HTTP 组件。

注:基于 SpringCloud之项目初始化 之上操作。

一、 Loadbalancer

1.1 Loadbalancer 介绍

LoadBalancerClientSpringCloud 提供的负载均衡器客户端,它先从提供的服务中获取某一个实例(默认策略为轮询),通过 choose() 方法获取到节点中的一个服务,拿到服务的信息之后取出服务 IP 信息,就可以得到完成的想要访问的 IP地址和接口,最后通过 RestTempate 访问服务。

1.2 Loadbalancer 使用

  1. 新建 HttpConfig ,启用 @LoadBalanced 实现负载均衡功能
@Configuration
public class HttpConfig {

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
  1. 完善 OrderController.getPrice() 方法
@GetMapping("/getPrice")
public BigDecimal getPrice(String productId) {
    final BigDecimal price = restTemplate.getForObject("http://PRICE-SERVICE/price/getPrice/" + productId, BigDecimal.class);
    return price;
}
  1. 启动 OrderService 服务,访问 http://localhost:8005/order/getPrice?productId=123 ,返回:
100

说明调用成功了,我们再访问二次请求,然后查看 PriceService 控制台输出:

查看 PriceService01控制台:

productId=123
productId=123

查看 PriceService02 控制台:

productId=123

可以看到使用了轮询机制。

二、 Ribbon

Spring Cloud Netflix RibbonSpring 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:采用双重过滤,同时过滤不是同一区域的实例和故障实例,选择并发较小的实例。
posted @ 2020-08-13 15:55  MarkLogZhu  阅读(220)  评论(0)    收藏  举报