`
m635674608
  • 浏览: 5027942 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

spring cloud 之 客户端负载均衡Ribbon深入理解

 
阅读更多

一、负载均衡

负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

1、服务端负载均衡:客户端请求到负载均衡服务器,负载均衡服务器根据自身的算法将该请求转给某台真正提供业务的服务器,该服务器将响应数据给负载均衡服务器,负载均衡服务器最后将数据返回给客服端。(nginx)

2、客服端负载均衡:基于客户端的负载均衡,简单的说就是在客户端程序里面,自己设定一个调度算法,在向服务器发起请求的时候,先执行调度算法计算出向哪台服务器发起请求,然后再发起请求给服务器。

基于客户端负载均衡的特点:

由客户端内部程序实现,不需要额外的负载均衡器软硬件投入。

程序内部需要解决业务服务器不可用的问题,服务器故障对应用程序的透明度小。

程序内部需要解决业务服务器压力过载的问题。

二、Ribbon实现客户端的负载均衡

我们使用spring boot 来测试。

pom文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.jalja.org</groupId>
 <artifactId>spring-consumer-server-ribbon</artifactId>
 <version>0.0.1-SNAPSHOT</version>
  
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
  </parent>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Camden.SR4</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
     <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-ribbon</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>
   
</project>

application.yml

1
2
3
stores:
 ribbon:
  listOfServers: www.baidu.com,www.jalja.org,www.163.com

Ribbon的负载均衡策略

1、RoundRobinRule(轮询模式)

public class RoundRobinRule extends AbstractLoadBalancerRule roundRobin方式轮询选择server 轮询index,选择index对应位置的server 该策略也是ribbon的默认策略

SpringCloudRibbonApplication.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class SpringCloudRibbonApplication {
  public static void main(String[] args) {
    SpringApplication.run(SpringCloudRibbonApplication.class, args);
  }
  @Autowired
  private LoadBalancerClient loadBalancer;
  @RequestMapping(value="static")
  public String staticRibbon(){
     ServiceInstance instance = loadBalancer.choose("stores");
     URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
     System.out.println(storesUri);
    return "static";
  }
}
 
连续请求6次执行结果:
 

2、RandomRule(随机策略)

public class RandomRule extends AbstractLoadBalancerRule 随机选择一个server 在index上随机,选择index对应位置的server。

在配置文件application.yml加入

1
2
3
4
5
6
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
stores:
 ribbon:
  listOfServers: www.baidu.com,www.jalja.org,www.163.org
  #随机
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

在SpringCloudRibbonApplication.java 中加入

1
2
3
4
@Bean
  public IRule ribbonRule() {
    return new RandomRule();//这里配置策略,和配置文件对应
  }

执行6次的结果:

3、BestAvailableRule(并发量)

public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule 选择一个最小的并发请求的server 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server

在配置文件application.yml加入

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule

在SpringCloudRibbonApplication.java 中加入

1
2
3
4
@Bean
  public IRule ribbonRule() {
    return new BestAvailableRule();//这里配置策略,和配置文件对应
  }

执行6次的结果:

4、AvailabilityFilteringRule(服务器状态)

public class AvailabilityFilteringRule extends PredicateBasedRule 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态

5、WeightedResponseTimeRule(根据响应时间)

public class WeightedResponseTimeRule extends RoundRobinRule 根据响应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。 一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择server。

6、RetryRule(根据策略+重试)

public class RetryRule extends AbstractLoadBalancerRule 对选定的负载均衡策略机上重试机制。
在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server

7、ZoneAvoidanceRule(Zone状态+服务状态)

public class ZoneAvoidanceRule extends PredicateBasedRule
复合判断server所在区域的性能和server的可用性选择server
使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。

 

http://www.jb51.net/article/115969.htm

分享到:
评论

相关推荐

    73-Spring Cloud客户端负载均衡Ribbon笔记1

    Spring Cloud中的Ribbon是实现客户端负载均衡的关键组件。在传统的服务端负载均衡中,像Nginx这样的代理服务器会接收请求并根据预设的算法(如轮询、权重轮询、随机等)转发到后端服务。而在客户端负载均衡模式下,...

    02_SpringCloud客户端负载均衡Ribbon.md

    SpringCloud的复杂均衡 属于客户端;nginx辅助均衡属于服务器端 ,restTemplate 进行RPC调用.对外使用 rest http方式。DiscoveryClient 可以自己实现一个负载均衡的算法(使用请求总数 % 服务列表个数).算法文件跟新...

    spring_cloud_gateway负载均衡,动态路由

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

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

    在本文中,我们将深入探讨如何使用Spring Cloud来实现Ribbon客户端负载均衡,这对于构建微服务架构至关重要。Spring Cloud是Spring生态系统中的一个集合,它提供了一系列工具和服务,帮助开发者快速搭建分布式系统,...

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

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

    springcloud-ribbon负载均衡demo

    其中,Spring Cloud Ribbon是一个客户端负载均衡器,它可以与Spring Cloud Netflix Eureka结合使用,实现服务间的智能路由和负载均衡。在这个"springcloud-ribbon负载均衡demo"中,我们将探讨Ribbon的基本概念、工作...

    SpringCloud——客户端负载平衡器(Ribbon)

    Ribbon是一个客户端负载均衡器,它可以很好地控制HTTP和TCP客户端的行为。

    Spring Cloud Ribbon实现客户端负载均衡的方法

    Spring Cloud Ribbon 实现客户端负载均衡的方法 ...本篇文章主要介绍了使用 Spring Cloud Ribbon 实现客户端负载均衡的方法,并详细地讲解了相关的知识点和注意事项,以帮助读者更好地理解和使用 Spring Cloud Ribbon。

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

    在Spring Cloud中,Ribbon是默认的客户端负载均衡器,它与Eureka(服务注册与发现组件)结合使用,可以从Eureka服务注册中心获取服务列表,并根据预定义的策略进行负载分配。 当客户端向Zuul发送请求时,Zuul会利用...

    方志朋版——深入理解Spring Cloud与微服务构建.pdf

    再者,Spring Cloud Netflix Ribbon和Spring Cloud OpenFeign是客户端负载均衡器,它们负责在调用远程服务时进行负载均衡,提高系统的可用性。Ribbon是基于HTTP和TCP的客户端负载均衡器,而OpenFeign则提供了一种...

    SpringCloud之四 负载均衡Feign

    4. **集成Ribbon**:Feign默认集成了Ribbon,Ribbon是一个客户端负载均衡器,它能够帮助Feign在调用远程服务时实现负载均衡。 5. **与Eureka整合**:通过与Eureka的整合,Feign能够利用服务注册与发现机制来选择合适...

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

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

    基于SpringCloud的Idea集成Ribbon客户端负载均衡设计源码

    该项目是一款基于SpringCloud框架的Idea集成Ribbon客户端负载均衡设计源码,总文件量达86个,涵盖33个Java源文件、12个XML配置文件、6个HTML文件、5个Git忽略文件、4个数据库文件、4个JAR包、4个属性文件、4个YAML...

    springcloud-负载均衡,服务注册demo

    1. 引入Spring Cloud相关依赖,如`spring-cloud-starter-eureka`(Eureka客户端)和`spring-cloud-starter-ribbon`(Ribbon客户端负载均衡)。 2. 配置Eureka服务器的相关参数,如服务注册地址、端口等。 3. 在...

    SpringCloud使用Ribbon实现负载均衡

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

    SpringCloud客户端的负载均衡Ribbon的实现

    SpringCloud客户端的负载均衡Ribbon的实现 微服务架构中,单个微服务有多个实例是不可避免的,这就需要对客户端的请求进行负载均衡,以便将请求分摊到多个微服务的实例上。Ribbon是一个由Netflix发布的负载均衡器,...

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

    Ribbon是客户端负载均衡器,而Eureka是服务发现组件。在Spring Cloud中,通常使用Eureka来注册和发现服务,Ribbon则会自动选择Eureka中的一个服务实例进行请求。引入`spring-cloud-starter-netflix-eureka-client`和...

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

    在Spring Cloud生态中,Ribbon是一个重要的客户端负载均衡器,它与Netflix的Eureka服务注册中心结合,使得微服务间的调用能够实现智能路由和负载均衡。本篇将深入探讨Spring Cloud Ribbon的工作原理、功能特性以及...

Global site tag (gtag.js) - Google Analytics