06 负载均衡之Ribbon

1 Ribbon概述

1.1 是什么

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

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

1.2 能干啥:负载均衡

什么是负载均衡

简单来说就是将用户的请求平摊到多个服务上,从而达到系统的高可用。常见的负载均衡有软件有nginx,LVS,硬件F5

Ribbon本地负载均衡客户端和nginx服务端负载均衡区别

  • nginx是服务端负载均衡,客户端所有请求都会交给nginx,由nginx实现转发请求,即负载均衡由服务端实现的。既请求由 nginx 服务器端进行转发。
  • Ribbon 是从 注册中心服务器端上获取服务注册信息列表,缓存到JVM本地,然后在本地实现RPC远程服务调用

应用场景的区别

Nginx 适合于服务器端实现负载均衡 比如 Tomcat ,Ribbon 适合与在微服务中 RPC 远程调用实现本地服务负载均衡,比如 Dubbo、SpringCloud 中都是采用本地负载均衡。

集中式负载均衡和进程内的负载均衡

  • 集中式:在服务的消费方和提供方之间使用独立的负载均衡设施(可以是硬件,比如F5,也可以是软件,比如nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方。
  • 进程内:将负载均衡集成到消费方,消费方从注册中心获知有哪些地址可用,然后自己再从这些地址中选择一个合适的地址。RIbbon就是属于进程内的负载均衡,他只是一个类库,集成到消费方的进程中,消费方通过它来获取服务提供方的地址。

在这里插入图片描述
Ribbon工作时分两步

  1. 先选择注册中心Server(比如Eureka Server),优先选择同一个区域内负载较少的Server
  2. 在根据配置的负载均衡策略,从注册中心获取到服务注册列表中选择一个服务地址。

1.3 其他说明

新版已经集成了Ribbon

新版的引入springCloud的服务发现,已经自动集成了Ribbon,比如zookeeper
在这里插入图片描述
这也就是之前我们根本没有引入Ribbon的依赖,已经可以使用@LoadBlance注解

RestTemplate使用

可参考:这里不多介绍
RestTemplate使用

2 Ribbon负载均衡策略

2.1 Ribbon负载均衡策略有哪些

com.netflix.loadbalancer.IRule 这个接口就定义了负载均衡策略的实现规范。

public interface IRule{
    /*
     * choose one alive server from lb.allServers or
     * lb.upServers according to key
     * 
     * @return choosen Server object. NULL is returned if none
     *  server is available 
     */

    public Server choose(Object key);
    
    public void setLoadBalancer(ILoadBalancer lb);
    
    public ILoadBalancer getLoadBalancer();    
}

常用的策略:

在这里插入图片描述

  • com.netflix.loadbalancer.RoundRobinRule: 轮询策略
  • com.netflix.loadbalancer.RandomRule:随机策略
  • com.netflix.loadbalancer.RetryRule:先按照RoundRobinRule策略获取服务,如果获取失败则在指定时间内会进行重试
  • com.netflix.loadbalancer.WeightedResponseTimeRule:对轮询策略的扩展,响应速度越快的实例选择权重越大,越容易被选中
  • com.netflix.loadbalancer.BestAvailableRule: 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量小的服务。
  • com.netflix.loadbalancer.AvailabilityFilteringRule: 先过滤掉故障实例,在选择并发小的实例
  • com.netflix.loadbalancer.ZoneAvoidanceRule: 默认规则,复合判断Server所在区域的性能和Server的可用性选择服务器

2.2 如何替换

在之前Eureka章节演示了轮询负载均衡规则

这里我们演示一下如何更换为随机规则。

  1. 在消费者订单服务中增加Ribbon轮询规则配置
    注意:关于轮询规则配置类不能放到@ComponentScan注解所扫描到的包及其子包,否则这个类就会被所有的Ribbon客户端所共享,达不到特殊化定制的目的
package study.wyy.ribbon.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author by wyaoyao
 * @Description
 * @Date 2020/12/15 4:23 下午
 */
@Configuration
public class RibbonConfig {
    @Bean
    public IRule iRule(){
        return new RandomRule();
    }
}
  1. 在消费者订单服务的启动类增加@RibbonClients
package study.wyy.cloud.order;

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;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import study.wyy.ribbon.config.RibbonConfig;

/**
 * @author by wyaoyao
 * @Description
 * @Date 2020/10/28 8:55 下午
 */
@SpringBootApplication
@EnableEurekaClient
@RibbonClients({
        @RibbonClient(name = "cloud-payment-service",configuration = RibbonConfig.class)
})
public class OrderApp {

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值