SpringCloudAlibaba:负载均衡器Ribbon

什么是ribbon

目前主流的负载方案分为以下两种:

  • 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(如:F5),也有软件的(如:nginx)
  • 客户端根据自己的请求情况做负载均衡,Ribbon就属于客户端自己做负载均衡 

SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列完善的配置,如超时、重试等。通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询、随机等)去调用这些服务,Ribbon也可以实现我们自己的负载均衡算法。

1.1 客户端的负载均衡

例如SpringCloud中的Ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡,即在客户端就进行负载均衡算法分配。

 

1.2 服务端的负载均衡

例如nginx,通过nginx进行负载均衡,先发送请求,然后通过负载均衡算法,再多个服务器之间选择一个进行访问;即在服务端再进行负载均衡算法分配。

1.3 常见负载均衡算法 

  • 随机。通过随机选择服务进行执行,一般这种方式使用较少
  • 轮询。负载均衡默认实现方式,请求来之后排队处理
  • 加权轮询。通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力
  • 地址hash。通过客户端请求地址的HASH值取模映射进行服务器调度。ip hash
  • 最小连接数,即使请求均衡了,压力不一定均衡,最小连接数法就是根据服务器的情况,比如请求积压数等参数,将请求分配到当前压力最小的服务器上。最小活跃数

Nacos使用Ribbon

1.nacos-discovery依赖了ribbon,可以不再引用Ribbon依赖

 2.添加@LoadBalanced注解

  

 3.修改Controller

 Ribbon负载均衡策略

IRule 

这是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例

AbstractLoadBalancerRule

AbstractLoadBalancerRule是一个抽象类,里边主要定义了一个ILoadBalancer,就是我们上文所说的负载均衡器,这里定义它的目的主要是辅助负载均衡策略选取合适的服务端实例

  • RandomRule:这种负载均衡策略就是随机选择一个服务实例
  • RoundRobinRule:这种负载均衡策略是线性轮询负载均衡策略
  • RetryRule:在轮询的基础上进行重试
  • WeightResponseTimeRule:权重。如果一个服务的平均响应时间越短则权重越大,那么该服务实例被选中执行任务的概率也就越大
  •  ClientConfigEnabledRoundRobinRule:和RoundRobinRule的选择策略一致。
  • BestAvailableRule:过滤掉失效的服务实例,然后顺便找出并发请求最小的服务实例来使用
  • ZoneAvoidanceRule:默认规则
  • AvailabilityFilteringRule:

修改默认的负载均衡策略 

 修改默认的负载均衡策略有两种实现方式

1.基于配置类实现

  1.1 添加配置类

package com.zjb.ribbon;

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

/**
 * Ribbon负载均衡策略配置类
 */
@Configuration
public class RibbonRandomRuleConfig {

    /**
     * 
     * @return
     */
    @Bean
    public IRule iRule(){
        return new RandomRule();
    }
}

   注意此处有坑。不能写在@SpringBootApplication注解的@CompentScan扫描得到的地方,否则自定义的配置类就会被所有的RibbonClients共享。不建议这么使用,推荐yml方式。     

1.2 修改启动类,添加@RibbonClients注解,利用@RibbonClient指定服务名及其负载均衡策略

package com.zjb.order;

import com.zjb.ribbon.RibbonRandomRuleConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;

@SpringBootApplication
//配置多个 RibbonRandomRuleConfig不能被@SpringBootApplication的@CompentScan扫描到,否则就是全局配置效果
@RibbonClients({
            @RibbonClient(name = "stock-service",configuration = RibbonRandomRuleConfig.class)
})
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class,args);
    }
}

2.基于配置文件实现

 2.1 修改application.yml文件

# 被调用的服务名
stock-service:
  ribbon:
    # 指定使用负载均衡策略
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

自定义负载均衡策略

在这里我们实现一个简单的随机负载均衡策略,重点是如何自定义负载均衡策略

新增DIYRibbonRule 并继承AbstractLoadBalancerRule类

package com.zjb.ribbon;

import com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.util.internal.ThreadLocalRandom;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.List;

public class DIYRibbonRule extends AbstractLoadBalancerRule {
    
    public Server choose(Object o) {
        ILoadBalancer loadBalancer = this.getLoadBalancer();

        //或得当前请求的服务实例
        List<Server> reachableServers = loadBalancer.getReachableServers();

        int i = ThreadLocalRandom.current().nextInt(reachableServers.size());

        Server server = reachableServers.get(i);
        return server;
    }

    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }
}

 在调用的时候我们发现,在第一次调用的时候会很慢,这是因为懒加载,只有在调用的时候才去加载,那我们应该怎么解决这个问题呢?

开启饥饿加载,解决第一次调用慢的问题

ribbon:
  eager-load:
    #开启Ribbon饥饿加载
    enabled: true
    #配置stock-service使用ribbon饥饿加载,多个使用逗号分隔
    clients: stock-service

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值