`
阅读更多

SpringCloud Ribbon实现负载均衡,SpringCloud Ribbon自定义策略

 

========================

©Copyright 蕃薯耀 2021-03-09

http://fanshuyao.iteye.com/

 


一、SpringCloud Ribbon概述
SpringCloud Ribbon为客户端(消费者端)的负载均衡,Nginx为服务端的负载均衡。


官网地址:https://github.com/Netflix/ribbon


官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.1.0.RC2/single/spring-cloud-netflix.html#spring-cloud-ribbon


翻译文档:http://docs.springcloud.cn/user-guide/ribbon/

 

二、SpringCloud Ribbon几种策略:
1、轮询策略:com.netflix.loadbalancer.RoundRobinRule

ribbon默认策略

 

2、随机策略:com.netflix.loadbalancer.RandomRule
使用jdk自带的随机数生成工具,生成一个随机数,然后去可用服务列表中拉取服务节点Server。
如果当前节点不可用,则进入下一轮随机策略,直到选到可用服务节点为止。

3、轮询失败重试策略:com.netflix.loadbalancer.RetryRule
轮询失败重试策略(RetryRule)是这样工作的,首先使用轮询策略进行负载均衡,
如果轮询失败,则再使用轮询策略进行一次重试,相当于重试下一个节点,看下一个节点是否可用,如果再失败,则直接返回失败。

4、响应时间权重策略:com.netflix.loadbalancer.WeightedResponseTimeRule
根据响应时间,分配一个权重weight,响应时间越长,weight越小,被选中的可能性越低。

5、并发量最小可用策略:com.netflix.loadbalancer.BestAvailableRule
选择一个并发量最小的server返回。如何判断并发量最小呢?ServerStats有个属性activeRequestCount,
这个属性记录的就是server的并发量。轮询所有的server,选择其中activeRequestCount最小的那个server,就是并发量最小的服务节点。

6、可用过滤策略:com.netflix.loadbalancer.AvailabilityFilteringRule
过滤掉连接失败的服务节点,并且过滤掉高并发的服务节点,然后从健康的服务节点中,使用轮询策略选出一个节点返回。

7、区域权重策略:com.netflix.loadbalancer.ZoneAvoidanceRule
复合判断server所在区域的性能和server的可用性,来选择server返回。


三、SpringCloud Ribbon客户端实现负载均衡策略,SpringCloud Ribbon自定义负载均衡策略

1、RestTemplate添加注解@LoadBalanced实现负载均衡

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestConfig {

	//@LoadBalanced实现负载均衡
	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
}

 

 

2、启动添加注解@RibbonClient指定某微服务要实现的策略
@RibbonClient注解:
name为微服务名称,必须和服务提供者的微服务名称一致,configuration配置自定义的负载均衡规则
配置类不能被启动类扫描到(即不能放在启动类的包或者子包下),否则会成为全局配置:方式一:放在不同的包下。方式二:启动类排除该配置类

@SpringBootApplication
@EnableEurekaClient
//name为微服务名称,必须和服务提供者的微服务名称一致,configuration配置自定义的负载均衡规则
//RibbonConfig.class不能被启动类扫描到,否则会成为全局配置:方式一:放在不同的包下。方式二:启动类排除该配置类
@RibbonClient(name = "SPRINGCLOUD-EUREKA-SERVER", configuration = RibbonConfig.class)
public class SpringCloudEurekaWebApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringCloudEurekaWebApplication.class, args);
	}

}

 

 

3、定义要实现的策略配置类,策略只能返回唯一一个bean对象

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;

/**
 * Ribbon为客户端的负载均衡,Nginx为服务端的负载均衡
 *  Ribbon自定义负载均衡策略
 *  
   *    策略只能定义一个,不能定义多个,不然会报错:
 * org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
 * No qualifying bean of type 'com.netflix.loadbalancer.IRule' available: 
 * expected single matching bean but found 7: 
 * randomRule,retryRule,roundRobinRule,weightedResponseTimeRule,bestAvailableRule,availabilityFilteringRule,zoneAvoidanceRule
 *
 */
@Configuration
public class RibbonConfig {


	/**
	 * 轮询策略(ribbon默认策略)
	 * @return
	 */
	@Bean
	public IRule roundRobinRule() {
		return new RoundRobinRule();
	}
	
	
	/**
	 * 随机策略
	 * 随机策略:使用jdk自带的随机数生成工具,生成一个随机数,然后去可用服务列表中拉取服务节点Server。
	 * 如果当前节点不可用,则进入下一轮随机策略,直到选到可用服务节点为止。
	 * @return
	 */
    public IRule randomRule() {
        return new RandomRule();
    }
	
	
	/**
	 * 轮询失败重试策略
	 * 轮询失败重试策略(RetryRule)是这样工作的,首先使用轮询策略进行负载均衡,
	 * 如果轮询失败,则再使用轮询策略进行一次重试,相当于重试下一个节点,看下一个节点是否可用,如果再失败,则直接返回失败。
	 * @return
	 */
	public IRule retryRule() {
		return new RetryRule();
	}
	
	
	/**
	 *  响应时间权重策略
	 *  策略描述:根据响应时间,分配一个权重weight,响应时间越长,weight越小,被选中的可能性越低。
	 * @return
	 */
	public IRule weightedResponseTimeRule() {
		return new WeightedResponseTimeRule();
	}
	
	
	/**
	 *  并发量最小可用策略
	 *  策略描述:选择一个并发量最小的server返回。如何判断并发量最小呢?ServerStats有个属性activeRequestCount,
	 *  这个属性记录的就是server的并发量。轮询所有的server,选择其中activeRequestCount最小的那个server,就是并发量最小的服务节点。
	 * @return
	 */
	public IRule bestAvailableRule() {
		return new BestAvailableRule();
	}
	
	
	/**
	 *  可用过滤策略
	 *  策略描述:过滤掉连接失败的服务节点,并且过滤掉高并发的服务节点,然后从健康的服务节点中,使用轮询策略选出一个节点返回。
	 * @return
	 */
	public IRule availabilityFilteringRule() {
		return new AvailabilityFilteringRule();
	}
	
	
	/**
	 *  
	 *  策略描述:复合判断server所在区域的性能和server的可用性,来选择server返回。
	 * @return
	 */
	public IRule zoneAvoidanceRule() {
		return new ZoneAvoidanceRule();
	}
	
}

 

 

(如果文章对您有所帮助,欢迎捐赠,^_^)

 

================================

©Copyright 蕃薯耀 2021-03-09

http://fanshuyao.iteye.com/

 

1
1
分享到:
评论

相关推荐

    SpringCloud使用Ribbon实现负载均衡

    Spring Cloud是构建微服务架构的一套工具集,其中Ribbon是它提供的一个客户端负载均衡器,可以帮助我们实现服务间的智能路由。本篇文章将详细探讨如何在Spring Cloud中使用Ribbon实现负载均衡。 首先,我们要理解...

    spring_cloud_gateway负载均衡,动态路由

    spring cloud gateway的负载均衡和动态路由的实现 demo_01,demo_02,demo_03 这三个服务相当于是集群的微服务 gateway这个服务是 springcloude gateway + ribbon 做的负载均衡 gateway_01 这个服务 是动态路由的...

    02Spring Cloud Ribbon:负载均衡的服务调用1

    在Spring Cloud生态系统中,Spring Cloud Ribbon是一个至关重要的组件,它主要负责实现客户端的负载均衡,以确保服务间的调用能够均匀地分散到各个实例上,从而提高系统的整体可用性和性能。Ribbon是Netflix开发的一...

    springCloud路由网管负载均衡及拦截过滤的简单实现.

    Spring Cloud集成Ribbon或Netflix Eureka实现了客户端负载均衡。当`uri`以`lb://`开头时,Spring Cloud Gateway会使用Ribbon进行负载均衡,自动轮询调用服务实例。Ribbon会根据配置的策略(如轮询、随机等)选择一...

    SpringCloud 服务负载均衡和调用 Ribbon、OpenFeign的方法

    总的来说,SpringCloud 通过 Ribbon 和 OpenFeign 提供了灵活的客户端负载均衡解决方案,可以根据不同的场景和需求选择合适的工具和策略。无论是自定义负载均衡规则还是利用默认策略,都能帮助开发者有效地管理和...

    SpringCloud-Ribbon负载均衡服务调用及手写Ribbon算法代码

    四、自定义Ribbon负载均衡算法 默认的Ribbon策略可能无法满足所有场景需求,因此我们可以自定义负载均衡算法。这通常通过实现IRule接口来完成,例如: ```java public class MyRule extends ...

    springcloud入门代码基于Spring Cloud实现的Ribbon客户端负载均衡模板代码

    5. **自定义负载均衡策略**:如果默认的负载均衡策略无法满足需求,我们可以创建自定义策略类,通过实现`IRule`接口并覆盖`choose`方法,然后在Ribbon客户端配置中指定这个策略。 在提供的压缩包文件"springcloud-...

    SpringCloud之四 负载均衡Feign

    通过以上步骤和代码示例,可以清晰地看到Feign在Spring Cloud微服务架构中扮演的角色,以及如何实现远程服务调用和负载均衡。Feign的使用极大地简化了HTTP客户端的编程模型,使得开发者能够更加聚焦于业务逻辑的实现...

    《深入理解Spring Cloud与微服务构建》学习笔记(十七)~路由网关Spring Cloud Zuul~负载均衡

    总结来说,Spring Cloud Zuul作为微服务架构中的路由网关,结合Ribbon的负载均衡能力,提供了高效的请求分发和处理。通过Zuul和Ribbon的组合,开发者可以轻松地实现服务间的通信,同时保证系统的稳定性和可扩展性。...

    springCloud路由网管负载均衡的简单实现

    总之,Spring Cloud路由网管负载均衡的实现涉及多个组件的配合,包括Zuul或Spring Cloud Gateway的路由功能、Eureka的服务发现与Ribbon的负载均衡。通过合理配置和优化,可以构建出高效、稳定的微服务架构。

    SpringCloud自定义负载均衡算法

    本文将深入探讨如何在Spring Cloud 中实现自定义的负载均衡算法。 负载均衡是解决多台服务器间工作负载分配的关键技术,它能确保服务的高可用性和性能优化。Spring Cloud Netflix 提供了Ribbon组件,它是一个客户端...

    spring cloud Ribbon使用详细例子

    Spring Cloud Ribbon是Spring Cloud生态中的一个客户端负载均衡器,它集成在Netflix OSS组件中,用于在客户端进行服务发现和负载均衡。在这个详细例子中,我们将深入理解如何在实际项目中运用Ribbon,以及它的工作...

    SpringCloud-Ribbon,使用RestfulTemplate实现负载均衡练习

    2. 在Spring配置类中,创建一个Bean,注入`IRestTemplate`接口的实现,Spring Cloud会自动注入一个带有Ribbon负载均衡功能的RestTemplate实例: ```java @Configuration public class RestTemplateConfig { @...

    浅谈Spring Cloud Ribbon的原理

    Spring Cloud Ribbon是一个基于Netflix的开源项目,主要提供客户端的软件负载均衡算法,将中间层服务连接在一起。Ribbon客户端组件提供了一系列完善的配置项,如连接超时、重试等。简单来说,就是在配置文件中列出...

    springCloud 完整搭建-已实现负载均衡-内含教程

    在SpringCloud中实现负载均衡,通常会用到Ribbon。Ribbon是Netflix开源的一个客户端负载均衡器,它集成在Zuul中,可以自动地为每个HTTP请求选择一个合适的服务实例进行转发。Ribbon支持多种负载均衡策略,如轮询...

    spring cloud ribbon方式使用服务

    Spring Cloud Ribbon是Spring Cloud生态中的一个客户端负载均衡器,它与Eureka等服务发现组件结合,使得在微服务架构中能够实现对服务的智能路由。Ribbon的主要目标是为客户端提供一种透明化的负载均衡解决方案,...

    SpringCloud之Ribbon负载均衡的入门操作

    总结来说,Spring Cloud Ribbon是实现服务消费者端负载均衡的关键工具,它结合Eureka服务注册中心,使得服务调用更加灵活和健壮,提高了系统的可用性和可扩展性。通过正确地集成和配置Ribbon,我们可以避免硬编码...

    springcloud负载均衡

    SpringCloud通过Ribbon和Eureka的集成实现了客户端的负载均衡。Ribbon是一个内置的HTTP客户端库,它可以与服务发现组件(如Eureka)配合工作,自动将请求分发到不同的服务实例上。Ribbon提供了一些预定义的策略,如...

Global site tag (gtag.js) - Google Analytics