zoukankan      html  css  js  c++  java
  • 负载均衡服务调用【Ribbon】

    Ribbon 简介:

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

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

    Ribbon  官网:

    https://github.com/Netflix/ribbon/

    目前Ribbon 也已经进入了维护模式,但是Ribbon中有些组件,还被大规模的使用。所以,一时半会儿也不会被 Spring Cloud LoadBalancer 全部替换掉。

    LB(负载均衡 Load Balance):

    负载均衡简单地说就是将用户的请求分摊的分配到多个服务商,从而达到系统的 HA(高可用)。常见的负载均衡软件有:Nginx ,LVS ,硬件 F5 等。

    Ribbon 本地负载均衡 客户端 和 Nginx 服务端负载均衡的区别:

    Nginx 是服务器负载均衡,客户端所有的请求都会交给Nginx,然后由Nginx实现转发请求。即 负载均衡是由服务端实现的。

    Ribbon 本地负载均衡,在调用微服务接口的时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

    打个比方:

    Nginx就相当于医院的挂号处,所有病人进来都要先到挂号处,然后挂号处再把病人分配到具体的某个科室。Nginx就拦截所有的客户端请求,然后把不同的请求转发给具体的服务提供者。

    Ribbon 就相当于每一个科室的排队叫号系统,科室里面的几个医生,这几个医生都可以提供治疗这一类病情的服务,排队系统就根据某种算法,将病人分配到某个医生那里去治病。Ribbon 就根据某种负载均衡算法,把请求分配到提供服务的集群中的具体某个服务提供者。

    LB分类:

    集中式LB:在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5,也可以是软件,如Nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方。

    进程内LB:将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。Ribbon 就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。

    Ribbon = 负载均衡 + RestTemplate 调用。

     

    Ribbon的架构说明:

     消费者Consumer 自己就集成了Ribbon 这套客户端软件,实现软负载均衡,自己就可以去服务注册中心查询可用的服务列表,然后通过负载均衡,请求一个服务提供者实例来提供服务。

     

    POM:

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

    问题:在之前的集群环境中,也用到负载均衡,但是在客户端中,却没有引入任何Ribbon相关的依赖,却也达到了负载均衡的效果,这是为什么?

    解答:因为在之前引入的Eureka Client 依赖中,它已经集成了 Ribbon 了(H 版的SpringCloud才有的功能)

     

    Ribbon 核心组件 IRule:

    IRule,根据特定算法,从服务列表中选取一个需要访问的服务。

    Ribbon 自带的常用的有如下 7 种 负载均衡的规则:

     

     Ribbon 默认的规则为 RoundRobinRule (轮询),如果需要替换成其他规则,则按照如下步骤:

    1. 自定义配置类,配置其他的负载均衡规则。

    package com.yct.rule;
    
    import com.netflix.loadbalancer.IRule;
    import com.netflix.loadbalancer.RandomRule;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * 定义其他的负载均衡规则
     */
    @Configuration
    public class MySelfRule {
        @Bean
        public IRule myselfRule(){
            return new RandomRule();
        }
    }
    MySelfRule

    注意配置细节:

    自定义配置类,不能放在 @ComponentScan 所扫描的当前包及子包下(也就是说,不能放在主启动类同级及以下的包下),否则自定义的这个配置类就会被所有的Ribbon客户端所共享,达不到特殊定制化的目的了。

     

    2. 主启动类表明访问哪个服务用哪种负载均衡规则,添加注解:@RibbonClient(name = "服务名",configuration = 自定义规则类.class)

    package com.yct.springcloud;
    
    import com.yct.rule.MySelfRule;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.ribbon.RibbonClient;
    
    @EnableEurekaClient
    @SpringBootApplication
    @RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)
    public class CustomerOrderApplication8080 {
        public static void main(String[] args) {
            SpringApplication.run(CustomerOrderApplication8080.class,args);
        }
    
    }
    主启动类
  • 相关阅读:
    android Serializable 和 Parcelable 区别
    Android HttpClient 用法以及乱码解决
    android 头像选择以及裁剪
    播放动画
    跑马灯效果
    Paint基本属性
    安卓开发中的各种事件
    View类和surfaceView详细介绍
    hadoop资源
    wsdl文件转换为java
  • 原文地址:https://www.cnblogs.com/y3blogs/p/13508168.html
Copyright © 2011-2022 走看看