当前位置: 首页 > news >正文

SpringCloud 负载均衡

Spring Cloud 负载均衡

文章目录

  • Spring Cloud 负载均衡
    • 1. 概念
    • 2. 分类
      • 2.1 服务端负载均衡
      • 2.2 客户端负载均衡
    • 3. Spring Cloud LoadBalancer
    • 4. 负载均衡策略

1. 概念

负责均衡 (Load Balance,简称LB),是高并发、高可用系统必不可少的关键组件。

当服务流量增大时,通常会采用增加机器的方式来进行扩容,负载均衡就是用来在多个机器或者其它资源中按照一定的规则合理分配负载

类似于在公司中,一个团队最开始只有一个人,后来随着工作量的增加,公司又招聘了几个人,就要考虑到负载均衡,如何把工作量均衡的分配到这几个人身上,从而提高整个团队的效率!

2. 分类

负责均衡分为服务端负载均衡和客户端负载均衡:

2.1 服务端负载均衡

在服务端进行负责均衡的算法分配,比较有名的服务端负载均衡器是Nginx,请求先到达Nginx负载均衡器,然后通过负载均衡算法,在多个服务器之间选择一个进行访问:

在这里插入图片描述

2.2 客户端负载均衡

在客户端进行负载均衡的算法分配.

把负责均衡的功能以库的方式集成到客户端,而不再是由一台指定的负载均衡设备集中提供

比如Spring Cloud的Ribbon,请求发送到客户端,客户端从注册中心(如Eureka)获取服务列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问

在这里插入图片描述

Ribbon是Spring Cloud早期的默认实现,由于现在已不再维护,最新版本的Spring Cloud负载均衡集成的是由Spring Cloud官方维护的 Spring Cloud LoadBalancer

3. Spring Cloud LoadBalancer

在SpringCloud中,我们使用Spring Cloud LoadBalancer来实现负载均衡,使用方式如下

  1. RestTemplate这个Bean添加 @LoadBalanced注解

    package com.order.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;@Configuration
    public class BeanConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}
    
  2. 修改IP端口号为服务名称(OrderServiceImpl)

    package com.order.service.Impl;import com.order.mapper.OrderMapper;
    import com.order.model.OrderInfo;
    import com.order.model.ProductInfo;
    import com.order.service.OrderService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.client.ServiceInstance;
    import org.springframework.cloud.client.discovery.DiscoveryClient;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;import java.util.List;@Service
    public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate DiscoveryClient discoveryClient;@Autowiredprivate RestTemplate restTemplate;@Overridepublic OrderInfo selectOrderById(Integer orderId) {OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
    //        String url = "http://127.0.0.1:9090/product/" + orderInfo.getProductId();String url = "http://product-service/product/" + orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
    }
    
  3. 启动多个product-service实例

    先复制一份实例:

    在这里插入图片描述

    更改实例名称,并修改选项:

    在这里插入图片描述

    选择 Add VM options 选项:

    在这里插入图片描述

    添加 -Dserver.port=自定义端口号

    在这里插入图片描述

部署好后同时启动多个product-service实例,并刷新eureka-server

在这里插入图片描述

在这里插入图片描述

可以看到新创建的几个实例都加入了注册中心!

这个时候我们来调用order-service服务,并多次刷新调用,可以看到每个product-service都被均衡的调用到了

在这里插入图片描述

4. 负载均衡策略

负载均衡策略是一种思想,无论是哪种负载均衡器,它们的负载均衡策略都是相似的。Spring Cloud LoadBalancer 仅支持两种负载均衡策略:轮询策略随机策略

  • 轮询(Round Robin):指服务器轮流处理用户的请求,这个一种实现最简单,也最常用的策略
  • 随机选择(Random):随机选择一个后端服务器来处理新的请求

Spring Cloud LoadBalancer 默认负载均衡策略是 轮询策略,实现的是RoundRobinLoadBalancer,如果服务的消费者需要采用随机的负载均衡策略也可以自行定义:

参考官网地址:Spring Cloud LoadBalancer :: Spring Cloud Commons

具体操作:

  1. 定义随机算法对象,通过@Bean将器加载到Spring容器中

    package com.order.config;import org.springframework.cloud.client.ServiceInstance;
    import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
    import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
    import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
    import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.core.env.Environment;public class LoadBalancerClient {@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
    }
    
  2. RestTemplate配置类上方使用@LoadBalancerClient 或者 @LoadBalancerClients 注解(根据不同的服务提供方配配置不同的客户端负载均衡算法策略,这里我们使用@LoadBalancerClient )

    package com.order.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;@LoadBalancerClient(name = "product-service", configuration = CustomLoadBalancerConfiguration.class)
    @Configuration
    public class BeanConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}
    

    @LoadBalancerClient注解中的name表示该负载均衡策略对哪个服务生效(服务提供方),Configuration表示该负载均衡器使用哪个负载均衡策略
    配置完成后,后续对product-service服务实例的调用就是随机的了!!

相关文章:

  • linux、windows、macos,命令终端清屏
  • 从0到1:理发店预约剪发小程序开发笔记(上)
  • SpringBoot接入mongodb例子,并有增删改查功能
  • 四、GD32 MCU 常见外设介绍 (5) TIMER 模块介绍
  • Vue中的diff算法
  • 华为嵌入式面试题及参考答案(持续更新)
  • PyTorch 中的一个函数:torch.pow
  • 完美捕捉趋势!立足市场必备“指数通行红绿灯”!股票量化分析工具QTYX-V2.8.7...
  • 数据库(MySQL)-视图、存储过程、触发器
  • WPF MVVM框架:CommunityToolkit.Mvvm包使用介绍
  • 【Python】sqlite加密库pysqlcipher3编译安装步骤
  • C#/WinFrom TCP通信+ 网线插拔检测+客服端异常掉线检测
  • Linux中,MySQL的用户管理
  • 集合的面试题和五种集合的详细讲解
  • 小猪佩奇.js
  • [数据结构]链表的实现在PHP中
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 2017届校招提前批面试回顾
  • JavaScript函数式编程(一)
  • 前端学习笔记之观察者模式
  • 如何利用MongoDB打造TOP榜小程序
  • 如何选择开源的机器学习框架?
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 栈实现走出迷宫(C++)
  • 正则表达式小结
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​​​【收录 Hello 算法】9.4 小结
  • ​linux启动进程的方式
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #define 用法
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • ${factoryList }后面有空格不影响
  • (1)(1.9) MSP (version 4.2)
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (接口封装)
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • ./configure,make,make install的作用
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .gitattributes 文件
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • @Data注解的作用
  • [ solr入门 ] - 利用solrJ进行检索
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • []我的函数库
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)