SpringCloud Netflix Ribbon

Eureka客户端的负载均衡:从Eureka server拿到节点列表,客户端自己使用负载均衡的算法确定要使用的节点;

Eureka服务端的负载均衡:服务端使用负载均衡的算法,从节点列表中确定要使用的节点,将该节点信息返回给客户端。

Ribbon实现的是客户端的负载均衡,默认使用的策略是轮询。


Ribbon内置的负载均衡策略

  • RoundRobinRule    轮询,Ribbon默认的策略。

  轮询是最简单的负载均衡算法,将所有节点围城一圈,轮着来,每个节点的负载差不多,适合节点性能都差不多的情况。

  加权轮询法   这个不是Ribbon的内置策略,此处只是作为补充。

在轮询的基础上,对每个节点施加权重。节点的性能不同,性能高的权重分配大些,轮到的几率就大些,负载大些。适合节点性能有明显区别的情况。

  • RetryRule   重试

  先按照RoundRobinRule策略获取provider,若获取失败,则在指定的时限内重试。默认的时限为500毫秒。

  • RandomRule   随机

  从所有节点中随机选择一个。

  • BestAvailableRule   最可用

  选择并发量最小的节点(连接的消费者数量最少的节点)。

  • AvailabilityFilteringRule  可用过滤

  过滤掉处于断路器跳闸状态的provider,或已经超过连接极限的provider,对剩余provider采用轮询策略。

  • ZoneAvoidanceRule

  根据大区性能、节点可用性综合进行选择。

  • WeightedResponseTimeRule  权重响应时间

  根据每个provider的平均响应时间计算其权重,响应时间越快权重越大,被选中的机率就越高。刚启动时采用轮询策略,计算出权重后就根据权重进行选择。


使用Ribbon内置的负载均衡策略

使用Eureka导入的依赖已经包含了Ribbon的依赖,所以不必再导依赖。

只需在消费者的引导类中设置Ribbon:

@SpringBootApplication
@EnableEurekaClient  //作为Eureka Client,也可使用@EnableDiscoveryClient,这两个注解作用差不多
public class UserServer {
    @Bean
    @LoadBalanced  //使用Ribbon实现负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    //设置Ribbon使用的负载均衡策略,只需创建一个实例、放到spring容器中即可。
    // 若不设置,默认使用轮询。
    @Bean
    public RandomRule getRule(){
        return  new RandomRule();
    }

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

}

使用自定义的负载均衡策略

(1)新建一个类作为负载均衡策略

//需继承AbstractLoadBalancerRule
public class MyRule extends AbstractLoadBalancerRule{

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }

    //自定义负载均衡策略,需返回一个节点
    @Override
    public Server choose(Object o) {
        //获取负载均衡器
        ILoadBalancer loadBalancer = this.getLoadBalancer();

        //获取目标服务的所有节点,包括了无效节点
        List<Server> allList = loadBalancer.getAllServers();
        //获取目标服务的所有可用节点
        List<Server> upList = loadBalancer.getReachableServers();

        for (Server server:upList){
            //有效且空闲
            if (server.isAlive() && server.isReadyToServe()){
                //ip
                System.out.println(server.getHost());
                //port
                System.out.println(server.getPort());
                //ip:port的形式
                System.out.println(server.getHostPort());
                return server;
            }
        }

        // Server的构造函数:Server(String ip,int port)
        // Server server = new Server("127.0.0.1", 10001);

        return null;
    }
}

注意导入的Server是com.netflix.loadbalancer.Server,不要导错了。

我们看到choose会传入一个Object类型的参数,这个参数是Ribbon缓存的目标服务所有节点的信息,会自动传入。

Ribbon对一个服务,会在缓存中维护2个List:一个是此服务的所有节点的信息,一个是此服务所有可用节点的信息。

维护过程:Ribbon从Eureka server拿到此服务所有的节点列表,这个节点列表一直保存在缓存中,不修改;将这个列表copy一份作为有效节点列表,也放在缓存中,并定时ping一下列表中的节点,判断节点是否还有效,若无效,则从有效节点列表中删除。

(2)引导类

@SpringBootApplication
@EnableEurekaClient  //作为Eureka Client,也可使用@EnableDiscoveryClient,这两个注解作用差不多
public class UserServer {
    @Bean
    @LoadBalanced  //使用Ribbon实现负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    //使用自定义的策略
    @Bean
    public MyRule getRule(){
        return  new MyRule();
    }

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

}

原文地址:https://www.cnblogs.com/chy18883701161/p/12304655.html

时间: 2024-08-30 18:14:45

SpringCloud Netflix Ribbon的相关文章

SpringCloud(4)---Ribbon服务调用,源码分析

SpringCloud(4)---Ribbon 本篇模拟订单服务调用商品服务,同时商品服务采用集群部署. 注册中心服务端口号7001,订单服务端口号9001,商品集群端口号:8001.8002.8003. 各服务的配置文件这里我这边不在显示了,和上篇博客配置一样.博客地址:SpringCloud(3)---Eureka服务注册与发现 一.商品中心服务端 1.pom.xml <?xml version="1.0" encoding="UTF-8"?> &l

SpringCloud:Ribbon负载均衡

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

浅谈SpringCloud (三) Ribbon负载均衡

什么是负载均衡 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力. 我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器.如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况. Ribbon

SpringCloud(六)Ribbon的负载均衡(一)

Ribbon 何为负载均衡? 负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容.因为负载均衡是对系统的高可用.网络压力的缓解和处理能力扩容的重要手段之一.我们通常所说的负载均衡都指的是服务端负载均衡,其中分为硬件负载均衡和软件负载均衡.硬件负载均衡主要通过在服务器节点之间按照专门用于负载均衡的设备,比如F5等:而软件负载均衡则是通过在服务器上安装一些用于负载均衡功能或模块等软件来完成请求分发工作,比如Nginx等.不论采用硬件负载均衡还是软件负载均衡,只要是服务端都能以类似下图的架构

【微服务架构】SpringCloud之Ribbon(四)

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

Netflix OSS 和 SpringCloud Netflix简介

Netflix OSS Netflix是一家互联网流媒体播放商,是美国视频巨头,随着Netflix转型为一家云计算公司,它也开始积极参与开源项目. Netflix OSS(Open Source)就是由Netflix公司主持开发的一套代码框架和库,目的是解决上了规模之后的分布式系统可能出现的一些有趣问题 SpringCloud Netflix SpringCloud 是基于springboot的一整套实现微服务的框架.SpringCloud 包含了非常多的子框架,其中springcloud ne

SpringCloud之Ribbon

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

Netflix Ribbon(负载均衡)介绍

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

springcloud 之Ribbon客户端负载均衡配置使用

pom.xml添加配置说明:这里服务注册与发现用的是Eureka,所以消费者端需要引入eureka,使用EurekaClient来调用服务 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <g