负载均衡服务调用【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);
    }

}
主启动类

 

posted @ 2020-08-15 16:05  糖油包子  阅读(579)  评论(0编辑  收藏  举报