Spring Cloud学习(四)Ribbon负载均衡服务调用

本文介绍了Netflix Ribbon作为客户端负载均衡工具的功能与应用。Ribbon能够为服务调用提供负载均衡策略,包括内置的轮询算法及自定义算法实现。文中详细讲解了如何在Spring Cloud项目中集成并使用Ribbon。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。

1、概述

**负载均衡:**简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的高可用。

  • 集中式LB : 服务的消费和提供方 之间使用独立的lb设施 (可是硬件, nginx ),由改设施负责把访问的请求通过某种策略转发至服务提供方
  • 进程内LB: 将Lb逻辑集成到消费方, 消费方从服务注册中心获得由哪些地址可以用,然后自己在从这些地址中选择一个合适的服务器。

Ribbon能干什么:负载均衡+ RestTemplate调用

2、如何使用

默认我们使用eureka的新版本时,它默认集成了ribbon

image-20201101201144108

RestTemplate类

getForObject方法/getForEntity方法

image-20201101202653980

Ribbon核心组件IRule

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

Ribbon常用负载均衡算法

image-20201101202937122

默认的负载均衡算法是轮询,那么如何配置其它的负载均衡算法呢?

image-20201101203828427

image-20201101203731313

基于cloud-consumer-order80模块来演示Ribbon

  1. image-20201101204335901

  2. 创建配置类用于指定负载均衡算法

    package com.yu.myrule;
    
    @Configuration
    public class MySelfRule {
    
        @Bean
        public IRule myRule(){
            // 随机
            return new RandomRule();
        }
    }
    
  3. 修改主启动类

image-20201101205855372

如何自己实现一个负载均衡算法
Ribbon轮询算法原理

image-20201101210503664

自定义负载均衡算法
  1. 修改cloud-consumer-order80模块下的配置类image-20201101210732645

  2. 接口实现类

    @Component
    public class MyLB implements LoadBalancer {
    
        private AtomicInteger atomicInteger = new AtomicInteger(0);
    
        /**
         *  while条件:在这个循环条件下,假设有多个线程在同时执行这段代码,
         *  即使有一个线程在产生了新值之后,它还需要让它自己产生的新值与旧值比较之后才能决定要不要这个新值,
         *  如果出现compareAndSet方法的预期值不跟实际值一样,导致方法返回false,直到没有其他线程干扰。这时就确定了新产生的值。
         * @return 接口计数
         */
        public final int getAddIncrement(){
            int current;
            int next;
            do {
                current = this.atomicInteger.get();
                next = current >= 2147483647 ? 0:current+1;
            } while (!this.atomicInteger.compareAndSet(current, next));
            return next;
        }
    
        /**
         *
         * @param serviceInstances 服务
         * @return 真正要调用的服务的下标
         */
        @Override
        public ServiceInstance instances(List<ServiceInstance> serviceInstances) {
            int index = getAddIncrement() % serviceInstances.size();
            return serviceInstances.get(index);
        }
    }
    

    3,修改controller

    image-20201101214702589

    4,修改payment8001和8002模块

      @Value("${server.port}")
        private String serverPort;
    
        @GetMapping(value = "/payment/lb")
        public String getPaymentLb(){
            return serverPort;
        }
    

    5,测试:启动eureka集群,启动提供者8001/8002,启动消费者8090

image-20201101220402920

​ 刷新,端口会改变

image-20201101220429419

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值