Spring Cloud Ribbon负载均衡组件

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。
负载均衡在系统架构中是一个非常重要,因为负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。之前负载均衡都指的是服务端负载均衡,其中分为硬件负载均衡(F5)和软件负载均衡(VS,HAProxy)。微服务框架中的负载均衡是集成服务消费者进程中的。

POM添加依赖

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

使用注解实现负载均衡

在这里插入图片描述

使用代码实现负载均衡

在这里插入图片描述

Ribbon的负载均衡策略

RandomRule:随机策略

package com.gf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;

@Configuration
public class RibbonConfiguration {
 
    @Autowired
    private SpringClientFactory springClientFactory;
 
    @Bean
    public IRule ribbonRule() {
        return new RandomRule();
    }
}

RoundRobinRule:表示轮询策略。

package com.gf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RoundRobinRule;

@Configuration
public class RibbonConfiguration {
 
    @Autowired
    private SpringClientFactory springClientFactory;
 
    @Bean
    public IRule ribbonRule() {
        return new RoundRobinRule();
    }
}

RetryRule:采用RoundRobinRule的选择机制,进行反复尝试,当花费时间超过设置的阈值maxRetryMills时,就返回null。

package com.gf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;

@Configuration
public class RibbonConfiguration {
 
    @Autowired
    private SpringClientFactory springClientFactory;
 
    @Bean
    public IRule ribbonRule() {
        return new RetryRule();
    }
}

WeightedResponseTimeRule:表示加权策略。

package com.gf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.WeightedResponseTimeRule;

@Configuration
public class RibbonConfiguration {
 
    @Autowired
    private SpringClientFactory springClientFactory;
 
    @Bean
    public IRule ribbonRule() {
        return new WeightedResponseTimeRule();
    }
}

BestAvailableRule:表示请求数最少策略。

package com.gf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.WeightedResponseTimeRule;

@Configuration
public class RibbonConfiguration {
 
    @Autowired
    private SpringClientFactory springClientFactory;
 
    @Bean
    public IRule ribbonRule() {
        return new BestAvailableRule();
    }
}

PredicateBasedRule:
ClientConfigEnabledRoundRobinRule的子类,基于Predicate实现的策略。通AbstractServerPredicate的chooseRoundRobinAfterFiltering方法进行过滤,获取备选的服务实例清单,然后用线性轮询选择一个实例,是一个抽象类,过滤策略在AbstractServerPredicate的子类中具体实现。

AvailabilityFilteringRule:可用过滤策略,首先过滤出故障的或者并发请求大于阀值的服务列表,然后以线性轮训过滤后的服务列表。

package com.gf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.netflix.loadbalancer.AvailabilityFilteringRule;
import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.WeightedResponseTimeRule;

@Configuration
public class RibbonConfiguration {
 
    @Autowired
    private SpringClientFactory springClientFactory;
 
    @Bean
    public IRule ribbonRule() {
        return new AvailabilityFilteringRule();
    }
}

9.ZoneAvoidanceRule:区域感知策略,首先用主过滤条件对所有服务实例过滤,再用次过滤条件过滤,最后使用轮询方式选择一个服务实例

package com.gf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.netflix.loadbalancer.AvailabilityFilteringRule;
import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.WeightedResponseTimeRule;
import com.netflix.loadbalancer.ZoneAvoidanceRule;

@Configuration
public class RibbonConfiguration {
 
    @Autowired
    private SpringClientFactory springClientFactory;
 
    @Bean
    public IRule ribbonRule() {
        return new ZoneAvoidanceRule();
    }
}

猜你喜欢

转载自blog.csdn.net/qixiang_chen/article/details/87869611