【微服务架构】SpringCloud Alibaba(三):负载均衡 LoadBalance

news2025/4/3 22:51:43

文章目录

  • SpringCloud Alibaba
    • 1、核心组件
    • 2、优势
    • 3、应用场景
  • 一、Loadbalance介绍
  • 二、Ribbon和Loadbalance 对比
  • 三、整合LoadBlance
    • 1、升级版本
    • 2、移除ribbon依赖,增加loadBalance依赖
  • 四、自定定义负载均衡器
  • 五、重试机制
  • 六、源码分析
    • 1、猜测源码的实现
    • 2、初始化过程
    • 3、获取负载均衡器
    • 4、获取实例
    • 5、获取服务实例列表
    • 6、进行调用

在这里插入图片描述
个人主页:道友老李
欢迎加入社区:道友老李的学习社区

SpringCloud Alibaba

Spring Cloud Alibaba是阿里巴巴提供的一站式微服务解决方案,是Spring Cloud体系中的一个重要分支,它将阿里巴巴在微服务领域的实践经验和开源技术进行了整合,为开发者提供了一系列便捷的工具和组件,用于构建分布式微服务应用。以下是其详细介绍:

1、核心组件

  • Nacos:用于服务注册与发现以及配置管理。它可以帮助微服务实例自动注册到注册中心,并能够动态获取配置信息,使应用程序能够灵活地应对配置的变化,无需重启服务。
  • Sentinel:主要用于流量控制、熔断降级等功能。它可以保护微服务免受高并发、流量异常等情况的影响,确保系统在压力下能够稳定运行,避免因个别服务出现问题而导致整个系统崩溃。
  • RocketMQ:是一款高性能、高可靠的分布式消息队列。它在微服务架构中常用于实现异步消息传递、解耦系统组件之间的依赖关系,从而提高系统的整体性能和可扩展性。
  • Seata:致力于提供分布式事务解决方案,确保在分布式系统中数据的一致性。它通过对事务的协调和管理,使得多个微服务之间在进行数据交互时能够遵循ACID原则。

2、优势

  • 一站式解决方案:涵盖了微服务架构中的多个关键领域,包括服务治理、配置管理、流量控制、分布式事务等,开发者无需再从多个不同的开源项目中进行整合,大大降低了微服务架构的搭建和维护成本。
  • 与Spring Cloud生态的深度集成:基于Spring Cloud的编程模型和规范进行开发,使得熟悉Spring Cloud的开发者能够快速上手并轻松集成到现有的Spring Cloud项目中,充分利用Spring Cloud的各种特性和优势。
  • 阿里巴巴的技术实力和实践经验支持:得益于阿里巴巴在大规模分布式系统开发和运营方面的丰富经验,Spring Cloud Alibaba的组件经过了实际生产环境的考验,具有较高的稳定性、性能和可扩展性,能够应对各种复杂的业务场景和高并发流量。

3、应用场景

  • 电商系统:在电商业务中,存在多个微服务,如商品服务、订单服务、库存服务等。Spring Cloud Alibaba可以通过Nacos进行服务注册与发现,使用Sentinel对各个服务的流量进行控制,利用RocketMQ实现异步消息通知,比如下单成功后异步通知库存服务扣减库存,通过Seata保证分布式事务的一致性,确保订单和库存等数据的准确性。
  • 金融系统:金融领域对数据一致性和系统稳定性要求极高。Spring Cloud Alibaba的Seata可以确保在多个金融业务操作之间的分布式事务一致性,如转账操作涉及到两个不同账户服务之间的资金变动。Nacos可以提供配置管理,方便对金融业务的各种配置参数进行动态调整,Sentinel则可以防止因突发的高并发交易对系统造成冲击。
  • 物联网(IoT)平台:物联网场景中,大量的设备会产生实时数据并上传到云端。Spring Cloud Alibaba可以通过Nacos管理各个物联网服务的注册与发现,使用RocketMQ接收和处理大量的设备数据消息,进行异步处理和分发。Sentinel可以对物联网服务的流量进行控制,防止因设备数据突发增长导致系统过载。

一、Loadbalance介绍

Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器,抽象和实现,用来替代Ribbon(已经停更),

二、Ribbon和Loadbalance 对比

组件组件提供的负载策略支持负载的客户端
Ribbon随机 RandomRule
轮询 RoundRobinRule
重试 RetryRule
最低并发 BestAvailableRule
可用过滤 AvailabilityFilteringRule
响应时间加权重 ResponseTimeWeightedRule
区域权重 ZoneAvoidanceRule
Feign或openfeign、RestTemplate
Spring Cloud LoadbalancerRandomLoadBalancer 随机(高版本有,此版本没有RoundRobinLoadBalancer 轮询(默认)Ribbon 所支持的、WebClient

LoadBalancer 的优势主要是,支持响应式编程的方式异步访问客户端,依赖 Spring Web Flux 实现客户端负载均衡调用。

三、整合LoadBlance

注意如果是Hoxton之前的版本,默认负载均衡器为Ribbon,需要移除Ribbon引用和增加配置spring.cloud.loadbalancer.ribbon.enabled: false。

1、升级版本

Spring Cloud AlibabaSpring cloudSpring Boot
2.2.6.RELEASESpring Cloud Hoxton.SR92.3.2.RELEASE

2、移除ribbon依赖,增加loadBalance依赖

<!--nacos-服务注册发现-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
	<exclusions>
		<!--将ribbon排除-->
		<exclusion>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
		</exclusion>
	</exclusions>
</dependency>


<!--添加loadbalanncer依赖, 添加spring-cloud的依赖-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

四、自定定义负载均衡器

package com.dyll.order.loadbalance;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.reactive.DefaultResponse;
import org.springframework.cloud.client.loadbalancer.reactive.EmptyResponse;
import org.springframework.cloud.client.loadbalancer.reactive.Request;
import org.springframework.cloud.client.loadbalancer.reactive.Response;
import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import reactor.core.publisher.Mono;
import java.util.List;
import java.util.Random;

public class CustomRandomLoadBalancerClient implements ReactorServiceInstanceLoadBalancer {
 
    // 服务列表
    private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;
 
    public CustomRandomLoadBalancerClient(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider) {
        this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
    }
 
    @Override
    public Mono<Response<ServiceInstance>> choose(Request request) {
        ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider.getIfAvailable();
        return supplier.get().next().map(this::getInstanceResponse);
    }
 
    /**
     * 使用随机数获取服务
     * @param instances
     * @return
     */
    private Response<ServiceInstance> getInstanceResponse(
            List<ServiceInstance> instances) {
        System.out.println("进来了");
        if (instances.isEmpty()) {
            return new EmptyResponse();
        }
 
        System.out.println("进行随机选取服务");
        // 随机算法
        int size = instances.size();
        Random random = new Random();
        ServiceInstance instance = instances.get(random.nextInt(size));
 
        return new DefaultResponse(instance);
    }
}
@EnableDiscoveryClient
@SpringBootApplication
// 设置全局负载均衡器
@LoadBalancerClients(defaultConfiguration = {CustomRandomLoadBalancerClient.class})
// 指定具体服务用某个负载均衡
//@LoadBalancerClient(name = "dyll-stock",configuration = CustomRandomLoadBalancerClient.class)
//@LoadBalancerClients(
//        value = {
//                @LoadBalancerClient(value = "dyll-stock",configuration = CustomRandomLoadBalancerClient.class)
//        },defaultConfiguration = LoadBalancerClientConfiguration.class
//)
public class OrderApplication {

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

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

五、重试机制

spring:
  cloud:
    loadbalancer:
      #以下配置为LoadBalancerProperties 配置类
      clients:
        #default 表示去全局配置,如要针对某个服务,则填写毒地应的服务名称即可
        default:
          retry:
            enbled: true
            #是否有的的请求都重试,false表示只有GET请求才重试
            retryOnAllOperation: true
            #同一个实例的重试次数,不包括第一次调用:比如第填写3 ,实际会调用4次
            maxRetriesOnSameServiceInstance: 3
            #其他实例的重试次数,多节点情况下使用
            maxRetriesOnNextServiceInstance: 0

六、源码分析

1、猜测源码的实现

我们这里是给RestTemplate增加了@LoadBalanced就实现了负载均衡,我们学习Ribbon的时候是也是在RestTemplate上加了@LoadBalanced也实现了负载均衡,当时我们说RestTemplate上面有个扩展点ClientHttpRequestInterceptor, 我们Ribbon通过LoadBalancerInterceptor实现了这个扩展点,将dyll-stock替换为 192.168.0.3:8003,如果所示:通过LoadBalancerClient 的实现类 RibbbonLoadBalancerClient 实现负载

image.png

那我们现在我们想LoadBalancer是不是也是同样的功能呢? 我们发现LoadBalancerClient 只有一个实现类是BlockingLoadBalancerClient

image.png

这是我们大概的猜想,他应该和我们的Ribbon的整体逻辑差不多

2、初始化过程

依旧是以前的逻辑找自动装配类,进入我们spring-cloud-starer-loadbalnecer:2.2.6.REALEAS 查找spring.factories,我们发现里面并没有对应spring.factories,这说明的这个starter只是起到jar管理的作用(查看的mybatis和SpringBoot整合的源码的话,会发现也是这样),所以我们进入pom中会发现应该是在spring-cloud-loadbalancer里面。

image.png

我们分析这里自动配置类BlockingLoadBalancerClientAutoConfiguration和我们刚才分析的BlockingLoadBalancerClient前边名称一样,那这个应该是我们重点分析的自动配置类

进入BlockingLoadBalancerClientAutoConfiguration 你会发现这里和Ribbon中的配置相似,都是在LoadBalancerAutoConfiguration之前

image.png

而LoadBalancerAutoConfiguration和我们将Ribbon中的配置是一样的,如下:

image.png

在BlockingLoadBalancerClientAutoConfiguration中我们看到一个重要的类BlockingLoadBalancerClient,这个类在前面我们分析过,通过他我们进行的负载均衡,里面有个参数是LoadBalancerClientFactory,这个参数我们可以想起我们讲解Ribbon中的SpringClientFactory,那哪里创建的他呢?

image.png

我们全文搜索会发先:在 LoadBalancerAutoConfiguration里面,这个类注意是在loadbalance包下和上面我们加载的LoadBalancerAutoConfiguration不是一个

image.png

对应加载配置和顺序如下:

image.png

3、获取负载均衡器

RestTemplate发送请求一定经过LoadBalancerInterceptor,中的intercept方法,这里loadBalancer是BlockingLoadBalancerClient

image.png

这里获取负载均衡器

image.png

image.png

image.png

这里就是从上面文中获取负载均衡器:RoundRobinLoadBalancer

4、获取实例

image.png

掉用RoundRobinLoadBalancer.choose方法

image.png

image.png

利用求余的方式选择一个实例,看到这我们发现实例列表已经获取到了,那什么时候获取到的呢?

5、获取服务实例列表

我们的服务列表是作为ServiceInstanceListSupplier的一个属性,那我们需要看在哪里创建的这个类:

image.png

在LoadBalancerClientConfiguration创建对应的类ServiceInstanceListSupplier

image.png我们看他withDiscoveryClient方法:

image.png

在DiscoveryClientServiceInstanceListSupplier构造方法里面:

image.png

image.png

image.png

image.png

6、进行调用

image.png

image.png

这个request前面已经构建出来

image.png

image.png

重构URL

image.png

在下面进行执行

image.png

image.png

image.pngimage.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2326172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

06-02-自考数据结构(20331)- 查找技术-动态查找知识点

自考数据结构动态查找算法主要讲二叉树和平衡二叉树,但是感觉到了,就又续接了一部分,所以这篇备考的小伙伴着重看前两种就可以了。 知识拓扑 知识点介绍 二叉排序树(BST) 定义 二叉排序树(Binary Search Tree)又称二叉查找树,它或者是一棵空树,或者是具有下列性质的二…

Upload-labs 靶场搭建 及一句话木马的原理与运用

1、phpstudy及upload-labs下载 &#xff08;1&#xff09;下载phpstudy小皮面板 首先需要软件phpstudy 下载地址 phpStudy下载-phpStudy最新版下载V8.1.1.3 -阔思亮 &#xff08;2&#xff09;然后到github网址下载源码压缩包 网址 https://github.com/c0ny1/upload-labs 再…

爬虫的第三天——爬动态网页

一、基本概念 动态网页是指网页内容可以根据用户的操作或者预设条件而实时发生变化的网页。 特点&#xff1a; 用户交互&#xff1a;动态网页能够根据用户的请求而生成不同的内容。内容动态生成&#xff1a;数据来自数据库、API或用户输入。客户端动态渲染&#xff1a;浏览器…

力扣HOT100之矩阵:48. 旋转图像

这道题本来想用剥洋葱的办法的&#xff0c;一直写不对&#xff0c;放弃了。。。直接去看题解&#xff0c;用剥洋葱其实也可以做&#xff0c;就是要从外层处理到内层&#xff0c;每一个边界上的元素为matrix[0].size() - 1个&#xff0c;这样一来&#xff0c;四条边界上的元素个…

uniapp微信小程序获取用户手机号uniCloud云开发版

开发微信小程序&#xff0c;很多时候需要获取用户的手机号&#xff0c;这样方便平台更好的为用户服务&#xff0c;但是微信小程序不允许开发者直接获取用户的手机号&#xff0c;需要用户手动授权才能获取手机号&#xff0c;且需要配合后端进行解密才能获得完整的手机号&#xf…

31天Python入门——第18天:面向对象三大特性·封装继承多态

你好&#xff0c;我是安然无虞。 文章目录 面向对象三大特性1. 封装2. 继承3. 多态4. 抽象基类5. 补充练习 面向对象三大特性 面向对象编程&#xff08;Object-Oriented Programming, 简称OOP&#xff09;有三大特性, 分别是封装、继承和多态.这些特性是面向对象编程的基础, …

第十六届蓝桥杯模拟二(串口通信)

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…

UE5学习笔记 FPS游戏制作32 主菜单,暂停游戏,显示鼠标指针

文章目录 一主菜单搭建UI显示主菜单时&#xff0c;暂停游戏&#xff0c;显示鼠标绑定按钮 二 打开主菜单 一主菜单 搭建UI 添加一个MainUi的控件 添加一个返回游戏的按钮和一个退出游戏的按钮 修改一下样式&#xff0c;放中间 显示主菜单时&#xff0c;暂停游戏&#xff0…

LLM - 开源强化学习框架 OpenR1 的环境配置与训练参数 教程

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/146838740 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 OpenR1 是一个开源的强化学习框架,复现 DeepSeek-R1 的训练流程,为研…

蓝桥杯备赛之枚举

用循环等方式依次去枚举所有的数字组合&#xff0c;一一验证是否符合题目的要求 题目链接 0好数 - 蓝桥云课 题目解析 好数的概念: 数的奇数位位奇数,偶数位为偶数,就是一个好数 求输入n里面有多少个好数 题目原理 1> 遍历每个数 2> 每次遍历判断是不是好数 把这…

C++编程语言:抽象机制:一个矩阵的设计(Bjarne Stroustrup)

第29章 一个矩阵的设计(A Matrix Design) 目录 29.1 引言 29.1.1 基本的 Matrix 用法 29.1.2 Matrix 的要求 29.2 一个 Matrix 模板 29.2.1 构造和赋值(Construction and Assignment) 29.2.2 下标和分片(Subscripting and Slicing) 29.3 Matrix算术运算(Matrix…

MSYS2学习笔记

前言 本文内容是MSys2 Documentation的学习笔记可以使用MSYS2编译QGis 学习笔记 什么是MSYS2&#xff1f; MSYS2&#xff08;Minimal System 2&#xff09;是一个为Windows平台打造的软件开发环境和包管理系统&#xff0c;它结合了Cygwin的POSIX兼容层、Arch Linux的pacman…

合规+增效 正也科技携智能营销产品出席中睿论坛

正也科技作为医药数字化领域的标杆企业&#xff0c;受邀参展第二届中睿医健产业企业家年会暨第十三届中睿医药新春论坛&#xff0c;本次论坛以“合力启新程”为主题&#xff0c;吸引了800多位医药健康企业的董事长、总经理参与&#xff0c;并通过主论坛、分论坛、路演等形式探讨…

计算机网络 TCP/IP参考模型

目录 TCP IP模型预览 OSI和TCP的相同点 OSI和TCP的不同点 层参考模型 层参考模型的数据封装与解封装 TCP IP模型预览 OSI和TCP的相同点 OSI和TCP的不同点 层参考模型 层参考模型的数据封装与解封装

JSON的基础知识

文章目录 前言json协议的基本格式json 数组类型 的语法规则json协议报文的实例json常见的一些格式错误在gd32中使用cjson库小结 前言 json协议在互联网应用&#xff0c;物联网应用中都会用到。所谓工欲善其事必先利其器&#xff0c;我们需要学习了解json协议的具体格式&#xf…

区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测

区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区…

11 配置Hadoop集群-免密登录

第一课时 一、复习导入 前面的课程中我们在虚拟机上安装并测试使用了hadoop的示例程序wordcount&#xff0c;并且在准备好了集群的同步工具&#xff0c;那接下来&#xff0c;我们就可去配置hadoop集群了。 二、授新 &#xff08;一&#xff09;认识ssh命令 SSH&#xff08;Secu…

13 配置Hadoop集群-测试使用

第一课时 一、导入 前面的课程我们搭建了hadoop集群&#xff0c;并成功启动了它&#xff0c;接下来我们看看如何去使用集群。 测试的内容包括&#xff1a;1.上传文件&#xff0c;2.下载文件&#xff0c;3.运行程序 二、授新 &#xff08;一&#xff09;上传小文件 上传文件的时…

简单ELK框架搭建

简介 ELK 框架是一套开源的日志管理和分析工具&#xff0c;由 Elasticsearch、Logstash 和 Kibana 三个主要组件组成&#xff0c;现在新增了Filebeat组件&#xff0c;可以更高效的收集数据。 Elasticsearch&#xff1a;是一个分布式、高可扩展的开源搜索引擎&#xff0c;能快速…

Vue2和Vue3响应式的基本实现

目录 简介Vue2 响应式Vue2 响应式的局限性 Vue3 响应式Vue3 响应式的优点 Vue2 和 Vue3 响应式对比 简介 在 Vue 框架中&#xff0c;数据的响应式是其核心特性之一。当页面数据发生变化时&#xff0c;我们希望界面能自动更新&#xff0c;而不是手动操作 DOM。这就需要对数据进…