SpringCloudAliBaba篇之Ribbon负载均衡器:让你的应用从容应对高并发

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
网络型负载均衡 NLB,每月750个小时 15LCU
简介: SpringCloudAliBaba篇之Ribbon负载均衡器:让你的应用从容应对高并发

1、什么是Ribbon

目前主流的负载均衡大致有以下两种

  • 服务端的负载均衡,比如nginx
  • 客户端的负载均衡,Ribbon就属于客户端自己做负载均衡

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

1.1、客户端的负载均衡

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

1.2、服务端的负载均衡

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

1.3、常见的负载均衡算法

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

2、Nocos中使用Ribbon

1、依赖

nacos-discovery依赖了ribbon,可以不用再引入ribbon依赖

2、添加@LoadBanlanced注解

@Configuration
public class RestConfig{
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

3、编写controller层即可调用

@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    RestTemplate restTemplate;
    @GetMapping("/orderList")
    public String getOrder() {
        String message = restTemplate.getForObject("http://stock-server/stock/stockList", String.class);
        return "order" + message;
    }
}

4、Ribbon的负载均衡策略

RandomRule:随机选择一个服务实例

RoundRobinRule:轮询复杂均衡策略

RetryRule:在轮询的基础上进行重试(没有超时的情况下)

WeightedResponseTimeRule:自动计算权重(如果一个服务的平均响应时间越短权重越大,被选中执行任务的概率就越大)

BestAvailableRule:过滤掉失效的服务实例的功能,然后顺便找出并发请求最小的服务器实例来使用

ZoneAvoidanceRule:默认规则,根据服务所在区域的性能和服务的可用性选择服务器

5、修改默认负载均衡策略

  • 方式一

配置类的方式:

@Configuration
public class RibbonConfig {
    /**
     * 指定负载均衡策略
     */
    @Bean
    public IRule iRule(){
        // Nacos提供的负载均衡策略(优先调用同一集群下的实例,基于随机权重)
        return new NacosRule();
    }
}

注意:配置类不能写在@SpringbootApplication注解的@CompentScan扫描的到的地方,否则自定义的配置类就会被所有的RibbonClients共享,所以可放在其他目录下

策略配置好了,最后利用@RibbonClient指定微服务及其负载均衡策略

测试效果:(l两个提供者(9002,9003),一个消费者9001)

nacos注册中心可以看到,我们的实例都成功注册了进来

浏览器进行访问:

随着不断刷新,根据随机权重选择不同的服务。

  • 方式二:(配置文件的方式)

修改application.yml

启动即可。

6、自定义负载均衡

继承AbstractLoadBalancerRule即可,比如挨个每个访问5次

public class MyRibbonConfig extends AbstractLoadBalancerRule {
    /**
     * 默认等于0,如果等于5,指向下一个服务
     */
    private int total = 0;
    /**
     * 默认=0,如果total=5,currentIndex++
     */
    private int currentIndex = 0;
    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        } else {
            Server server = null;
            while (server == null) {
                if (Thread.interrupted()) {
                    return null;
                }
                //获得所有的服务
                List<Server> upList = lb.getReachableServers();
                //获得活着的服务
                List<Server> allList = lb.getAllServers();
                int serverCount = allList.size();
                if (serverCount == 0) {
                    return null;
                }
                if (total < 5) {
                    server = upList.get(currentIndex);
                    total++;
                } else {
                    total = 0;
                    currentIndex++;
                    if (currentIndex > upList.size()) {
                        currentIndex = 0;
                    }
                    server = upList.get(currentIndex);
                }
                if (server == null) {
                    Thread.yield();
                } else {
                    if (server.isAlive()) {
                        return server;
                    }
                    server = null;
                    Thread.yield();
                }
            }
            return server;
        }
    }
    protected int chooseRandomInt(int serverCount) {
        return ThreadLocalRandom.current().nextInt(serverCount);
    }
    @Override
    public Server choose(Object key) {
        return choose(getLoadBalancer(), key);
    }
    @Override
    public void initWithNiwsConfig(IClientConfig clientConfig) {
        // TODO Auto-generated method stub
    }
}

注入我们自己写的负载均衡策略

@Configuration
public class RibbonConfig {
    /**
     * 指定负载均衡策略
     */
    @Bean
    public IRule iRule(){
        // Nacos提供的负载均衡策略(优先调用同一集群下的实例,基于随机权重)
        return new MyRibbonConfig();
    }
}

扩展

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

# 开启饥饿加载,解决第一次调用慢的问题
ribbon:
  eager-load:
    enabled: true
    # 配置stock-server使用饥饿加载,多个的话用逗号分隔
    clients: stock-server

7、使用LoadBalancer替代Ribbon

1、剔除依赖,既然不用ribbon自然要把依赖去除掉

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--添加loadbalancer依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

2、如果不剔除,也可以在yml进行配置

spring:
  application:
    name: order-server
  cloud:
    nacos:
    loadbalancer:
      ribbon:
        enable: false

3、配置完成后直接启动即可,将以轮询的策略进行访问。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
11天前
|
负载均衡 Java Nacos
Ribbon负载均衡
Ribbon负载均衡
21 1
Ribbon负载均衡
|
3月前
|
负载均衡 算法 架构师
Ribbon负载均衡
上一节就已经实现的负载均衡笔者并未深入探讨,本节通过分析负载均衡算法、Ribbon实现负载均衡的底层原理和实现过程,让大家对负载均衡有了一个大体认识,同时针对Ribbon自定义负载均衡策略,饥饿加载让大家对于Ribbon的了解又多一些。Ribbon实现的负载均衡只是方案之一,我们可以尽量多了解但不要局限于此。
|
9天前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
23 5
|
17天前
|
负载均衡 监控 算法
论负载均衡技术在Web系统中的应用
【11月更文挑战第4天】在当今高并发的互联网环境中,负载均衡技术已经成为提升Web系统性能不可或缺的一环。通过有效地将请求分发到多个服务器上,负载均衡不仅能够提高系统的响应速度和处理能力,还能增强系统的可扩展性和稳定性。本文将结合我参与的一个实际软件项目,从项目概述、负载均衡算法原理以及实际应用三个方面,深入探讨负载均衡技术在Web系统中的应用。
48 2
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
3月前
|
存储 设计模式 缓存
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
该文章主要介绍了如何在OpenFeign中集成Ribbon以实现负载均衡,并详细分析了Ribbon中服务选择和服务过滤的核心实现过程。文章还涉及了Ribbon中负载均衡器(ILoadBalancer)和负载均衡策略(IRule)的初始化方式。
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
|
3月前
|
缓存 负载均衡 Java
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
文章标题为“OpenFeign的Ribbon负载均衡详解”,是继OpenFeign十大可扩展组件讨论之后,深入探讨了Ribbon如何为OpenFeign提供负载均衡能力的详解。
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
|
2月前
|
负载均衡 Java 开发者
Ribbon框架实现客户端负载均衡的方法与技巧
Ribbon框架为微服务架构中的客户端负载均衡提供了强大的支持。通过简单的配置和集成,开发者可以轻松地在应用中实现服务的发现、选择和负载均衡。适当地使用Ribbon,配合其他Spring Cloud组件,可以有效提升微服务架构的可用性和性能。
32 0
|
4月前
|
负载均衡 算法 网络协议
Ribbon 负载均衡源码解读
Ribbon 负载均衡源码解读
61 15
Ribbon 负载均衡源码解读
|
3月前
|
负载均衡 算法 应用服务中间件
负载均衡技术在Web服务器集群中的应用
【8月更文第28天】随着互联网的发展和用户对Web服务需求的增长,单台服务器很难满足大规模访问的需求。为了提高系统的稳定性和扩展性,通常会采用Web服务器集群的方式。在这种架构中,负载均衡器扮演着至关重要的角色,它能够合理地分配客户端请求到不同的后端服务器上,从而实现资源的最优利用。
127 2

热门文章

最新文章

  • 1
    高并发场景下,到底先更新缓存还是先更新数据库?
    66
  • 2
    Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
    74
  • 3
    Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
    68
  • 4
    Java面试题:如何实现一个线程安全的单例模式,并确保其在高并发环境下的内存管理效率?如何使用CyclicBarrier来实现一个多阶段的数据处理任务,确保所有阶段的数据一致性?
    62
  • 5
    Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
    55
  • 6
    Java面试题:假设你正在开发一个Java后端服务,该服务需要处理高并发的用户请求,并且对内存使用效率有严格的要求,在多线程环境下,如何确保共享资源的线程安全?
    69
  • 7
    在Java中实现高并发的数据访问控制
    42
  • 8
    使用Java构建一个高并发的网络服务
    29
  • 9
    微服务06----Eureka注册中心,微服务的两大服务,订单服务和用户服务,订单服务需要远程调用我们的用,户服务,消费者,如果环境改变,硬编码问题就会随之产生,为了应对高并发,我们可能会部署成一个集
    37
  • 10
    如何设计一个秒杀系统,(高并发高可用分布式集群)
    129