spring cloud使用ribbon实现负载负载均衡消费和ribbon七种负载均衡策略

ribbon是什么?

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

ribbon七种负载均衡策略

1.RandomRule-随性而为

从名字就能看出,这是个很随性的策略,随性到什么程度呢?它会从当前可用的服务节点中,随机挑选一个节点访问。

2.RoundRobinRule-按部就班

这个rule是RandomRule的亲兄弟,RandomRule是随性而为挑选节点,RobinRule却按部就班从一个节点一步一步地向后选取节点,既不会跳过一个,也不会原地踏步,每一次只向后移动一步。
在这里插入图片描述

3.RetryRule-卷土重来

RetryRule他的BUFF就是给其他负载均衡策略加上重试"功能。而在RetryRule里还藏着一个subRule ,这才是隐藏在下面的真正被执行的负载均衡策略,RetryRule正是要为它添加重试功能(如果初始化时没指定subRule,将默认使用RoundRibinRule ).
在这里插入图片描述

4.WeightedResponseTimeRule-能者多劳

这个Rule继承自RoundRibonRule ,他会根据服务节点的响应时间计算权重,响应时间越长权重就越低,响应越快则权重越高,权重的高低决定了机器被选中概率的低。也就是说,响应时间越小的机器,被选中的概率越大。

在这里插入图片描述

5.BestAvailableRule-让最闲的人来

在这里插入图片描述
应该说这个Rule有点智能的味道了,在过滤掉故啤服务以后,它会基于过去30分钟的统计结果选取当前并发量最小的服务节点,也就是最%闲”"的节点作为目标地址。如果统计结果尚未生成,则采用轮询的方式选定节点。

关键字

  1. 过滤故障服务
  2. 选取并发量最小的节点
6.AvailabilityFilteringRule-我是有底线的

这个规则底层依赖RandomRobinRule来选取节点,但并非来者不拒,它也是有一些底线的,必须要满足它的最低要求的节点才会被选中。如果节点满足了要求,无论其响应时间或者当前并发量是什么,都会被选中。
每次AvailabilityFilteringRule(简称AFR)都会请求RobinRule挑选一个节点,然后对这个节点做以下两步检查:

  1. 是否处于熔断状态(这里大家可以把熔断当做服务不可用)
  2. 节点当前的active请求连接数超过阈值,超过了则表示节点目前太忙,不适合接客

如果被选中的server不幸挂掉了检查,那么AFR会自动重试(次数最多10次),让RobinRule重新选择一个服务节点。

在这里插入图片描述

7.ZoneAvoidanceRule-我的地盘我做主

这个过滤器包含了组合过滤条件,分别是Zone级别和可用性级别。
在这里插入图片描述

  1. ZoneFilter:在Eureka注册中一个服务节点有Zone,Region和URL三个身份信息,其中Zone可以理解为机房大区(未指定则由Eureka给定默认值),而这里会对这个Zone的健康情况过滤其下面所有服务节点。
    可用性过滤∶这里和AvailabilityFilteringRule的验证非常像,会过滤掉当前并发量较大,或者处于熔断状态的服务节点。

如何使用ribbon

搭建一个ribbon-consumer
pom.xml
	<packaging>jar</packaging>
 <name>ribbon-consumer</name>
 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
application.properties
spring.application.name=ribbon-consumer

server.port=31000

eureka.client.serviceUrl.defaultZone=http://localhost:20000/eureka/
RibbonConsumerApplication
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonConsumerApplication {

    @Bean
    @LoadBalanced
    public RestTemplate template() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        new SpringApplicationBuilder(RibbonConsumerApplication.class)
                .web(WebApplicationType.SERVLET)
                .run(args);
    }

}
Controller
@RestController
public class Controller {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/sayHi")
    public String sayHi() {
        return restTemplate.getForObject(
                "http://eureka-client/sayHi",
                String.class);
    }

}
RibbonConfiguration

负载均衡的消费策略配置如下

@Configuration
public class RibbonConfiguration {

     @Bean
    public IRule defaultLBStrategy() {
    	//可以在这里指定负载均衡的消费策略
        //return new RandomRule();使用随机的负载均衡消费策略
         //return new RetryRule 
        return new RoundRobinRule();//默认的消费策略
    }

}

以上就是ribbon的简单实现。

测试

使用上一篇文章的两个项目eureka-client和eureka-server两个项目 然后重新在搭建一个eureka-client-ribbon项目。eureka-client-ribbon是和eureka-client代码是一样的只是启动端口不同。
启动分别启动四个项目。
项目启动的顺序依次是:eureka-serve->eureka-client->eureka-client-ribbon->ribbon-consumer
在这里插入图片描述
启动成功后再eureka控制台查看:
在这里插入图片描述
在这里插入图片描述
说明就启动成功
点击第一下是在30005的eureka-client项目上
在这里插入图片描述
点击第二下就跳到了30002的eureka-client-ribbon项目上了
在这里插入图片描述
这样就实现了ribbon负载均衡。
如果以上出现错误请指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值