SpringCloud 整合Ribbon/LoadBalancer负载均衡

简介:负载均衡(Load Balance)就是将用户的请求平均的分配到多个服务上,从而达到系统的高可用,它是一种算法,可以通过该算法实现从地址列表中获取一个地址进行服务调用,LB实现方式包含集中式(在消费者和服务提供方中间使用独立的代理方式进行负载均衡)和进程内(根据自己的请求情况做负载均衡)两种。

一、Ribbon

  简介:Ribbon用于实现软负载均衡,核心三点:服务发现,发现依赖服务的列表、服务选择规则,在多个服务中如何选择一个有效服务、服务监听,检测失效的服务,高效剔除失效服务。

  1. Ribbon与Nginx比较

    A. Nginx:服务器负载均衡,客户端所有请求都会交给Nginx,然后Nginx实现转发请求,属于集中式实现负载均衡;

    B. Ribbon:本地负载均衡,在调用微服务接口的时候,会在注册中心上获取注册信息服务列表后缓存到本地,从而在本地实现RPC远程服务调用,属于进程内实现负载均衡。

  2. pom.xml Maven依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

  3. application.yml 文件配置

ribbon:
    # 全局连接超时时间(使用url路由方式配置不生效)
    ConnectTimeout: 5000
    # 全局请求超时时间(使用url路由方式配置不生效)
    ReadTimeout: 15000
    # 同一台实例最大重试次数,不含首次调用
    MaxAutoRetries: 0
    # 重试负载均衡其他实例的最大重试次数,不含首次调用
    MaxAutoRetriesNextServer: 0

    Ribbon总时间ribbonTimeout = (ribbon.ConnectTimeout + ribbon.ReadTimeout) * (ribbon.MaxAutoRetries + 1)  * (ribbon.MaxAutoRetriesNextServer + 1);其中histry的timeoutInMilliseconds值应大于或等于ibbonTimeout,否则出现下面错误。

 o.s.c.n.z.f.r.s.AbstractRibbonCommand    : The Hystrix timeout of 15000ms for the command *** is set lower than the combination of the Ribbon read and connect timeout, 20000ms

  4.  Ribbon注解

    A.  @LoadBalanced:启动Ribbon的负载均衡策略;

    B.  @RibbonClient(name = "service-name", configuration = RuleConfig.class):自定义负载均衡策略;

      name —— 服务名称

      configuration —— 负载均衡配置类

    C.  @RibbonClients(defaultConfiguration = RuleConfig.class):全局配置自定义负载均衡策略

      defaultConfiguration  ——  负载均衡配置类

  5.  Ribbon核心类组成

接口 作用 默认值
IClientConfig 读取配置 DefaultClientConfigImpl
IRule  负载均衡规则,选择实例 ZoneAvoidanceRule
IPing  筛选ping不通的实例 DummyPing
ServerList <Sever> 交给Ribbon的实例列表 ConfigurationBaseServerList
ServerListFilter <Sever> 过滤掉不符合条件的实例 ZonePreferenceServerListFilter
ILoadBalancer  Ribbon的入口 ZoneAwareLoadBalancer
ServerListUpdater 更新交给Ribbon的List的策略 PollingServerListUpdater

  6.  Ribbon负载均衡策略

    默认是ZoneAvoidanceRule,它是一个按照地域方式来进行负载均衡,但是在没有zone的情况下就是轮询(RoundRobinRule)。

负载均衡规则类 作用
RoundRobinRule 轮询选择, 轮询index,选择index对应位置的Server
AvailabilityFilteringRule 过滤掉那些一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个Server的运行状态
WeightedResponseTimeRule 根据响应时间分配一个weight(权重),响应时间越长,weight越小,被选中的可能性越低
ZoneAvoidanceRule 复合判断Server所在区域的性能和Server的可用性选择Server
BestAvailableRule 选择一个最小的并发请求的Server,逐个考察Server,如果Server被tripped了,则跳过
RandomRule 随机选择一个Server
RetryRule 对选定的负载均衡策略上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server

  7.  实现负载均衡的方式

    Eureka中已经集成了Ribbon,所以无需引入新的依赖;如果两种方式都配置,则以java代码配置为准。

    A. 基于application.yml配置文件

# service-name代表服务名称
service-name:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

    B. 基于java代码 

      会引起父子下文扫描重叠问题,这个会导致事务失效,解决方案是规则的定义(放在启动类之外的包目录下)和引入分开写隔离。可参考:Spring父子上下文重叠

package com.ruhaunxingyun.ribbon;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @description: 自定义负载均衡策略
 * @author: ruphie
 * @date: Create in 2020/8/16 13:56
 * @company: ruhuanxingyun
 */
@Configuration
public class RuleConfig {
    
    @Bean
    public IRule myRule() {
        return new RandomRule();
    }
    
}

      C. 两种方式的对比:代码配置优点是灵活,但存在上下文重叠的问题,修改以后需要重新打包;配置文件配置容易上手,配置更加直观,线上修改无需重新打包,发布优先级更高,缺点是若自定义规则需要代码配置。

       

posted @ 2020-08-15 21:50  如幻行云  阅读(1752)  评论(0编辑  收藏  举报