Spring Cloud LoadBalancer基础知识

LoadBalancer

  • 概念
  • 常见的负载均衡策略
  • 使用随机选择的负载均衡策略
    • 创建随机选择负载均衡器
    • 配置
  • Nacos 权重负载均衡器
    • 创建 Nacos 负载均衡器
    • 配置
  • 自定义负载均衡器(根据IP哈希策略选择)
    • 创建自定义负载均衡器
    • 封装自定义负载均衡器
    • 配置
  • 缓存

概念

LoadBalancer(负载均衡器)是一种网络设备或软件机制, 用于分发传入的网络流量负载(请求)到多个后端目标服务器上, 从而实现系统资源的均衡利用和提高系统的可用性和性能
负载均衡分为服务器端负载均衡和客户端负载均衡

  1. 服务器端负载均衡是指放在服务器端的负载均衡器(反向代理), 如: Nginx, HAProxy, F5等
  2. 客户端负载均衡器是指嵌套在客户端的负载均衡器(正向代理), 如: Ribbon, Spring Cloud LoadBalancer等

服务器端负载均衡器所有请求都会发送到服务器端, 就会造成服务器端压力大的情况

常见的负载均衡策略

  1. 轮询(默认): 按照顺序将请求发送到服务器
  2. 随机选择: 随机选择一个服务器处理请求
  3. 最少连接: 选择连接数最少的一个服务器
  4. IP 哈希: 使用客户端IP地址计算哈希值然后发送到与之对应的服务器
  5. 加权轮询: 按照权重值的比例发送请求
  6. 加权随机选择: 按照权重值随机选择后端服务器
  7. 最短响应时间: 将请求发送到响应时间最短的服务器

Spring Cloud LoadBalancer 默认只支持轮询和随机选择, 但是可以自定义负载均衡策略

使用随机选择的负载均衡策略

创建随机选择负载均衡器

public class MyRandomLoadBalancer {@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

配置

image.png
注意: 配置局部负载均衡器有可能不起作用, 可以配置全局负载均衡器
image.png

Nacos 权重负载均衡器

Nacos 中支持两种负载均衡器, 一种是权重负载均衡器, 另一种是第三方的CMDB(地域就近访问)标签负载均衡器, 我们可以将Spring Cloud LoadBalancer 直接配置为 Nacos 的负载均衡器

创建 Nacos 负载均衡器

@LoadBalancerClients(defaultConfiguration = MyNacosLoadBalancer.class)
public class MyNacosLoadBalancer {@Resourceprivate NacosDiscoveryProperties nacosDiscoveryProperties;@Beanpublic ReactorLoadBalancer<ServiceInstance> nacosLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name, nacosDiscoveryProperties);}
}

配置

image.png

自定义负载均衡器(根据IP哈希策略选择)

创建自定义负载均衡器

public class CustomLoadBalancer implements ReactorServiceInstanceLoadBalancer {private static final Log log = LogFactory.getLog(RandomLoadBalancer.class);private final String serviceId;private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;public CustomLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId) {this.serviceId = serviceId;this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;}public Mono<Response<ServiceInstance>> choose(Request request) {ServiceInstanceListSupplier supplier = (ServiceInstanceListSupplier)this.serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new);return supplier.get(request).next().map((serviceInstances) -> {return this.processInstanceResponse(supplier, serviceInstances);});}private Response<ServiceInstance> processInstanceResponse(ServiceInstanceListSupplier supplier, List<ServiceInstance> serviceInstances) {Response<ServiceInstance> serviceInstanceResponse = this.getInstanceResponse(serviceInstances);if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) {((SelectedInstanceCallback)supplier).selectedServiceInstance((ServiceInstance)serviceInstanceResponse.getServer());}return serviceInstanceResponse;}private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {if (instances.isEmpty()) {if (log.isWarnEnabled()) {log.warn("No servers available for service: " + this.serviceId);}return new EmptyResponse();} else {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();String ipAddress = request.getRemoteAddr();System.out.println("ip地址:" + ipAddress);int hash = instances.hashCode();int index = hash % instances.size();ServiceInstance instance = (ServiceInstance) instances.get(index);return new DefaultResponse(instance);}}
}

由于自定义负载均衡器和内置的负载均衡器只是在服务器选择的时候有所不同, 所以我们可以直接复制 RandomLoadBalancer 然后 在 getInstanceResponse()方法中进行改动即可

封装自定义负载均衡器

image.png

配置

image.png

缓存

Spring Cloud LoadBalancer 在获取实例时有两种选择:

  1. 及时获取: 每次都从注册中心获取到最新的实例, 效果好但是开销大
  2. 缓存服务列表: 每次得到服务列表后, 缓存一段时间,

spring Cloud LoadBalancer 默认缓存过期时间为 35s, 保存个数为 256个
我们也可以通过配置来改变这两个值

spring:cloud:loadbalancer:cache:ttl: 10capacity: 1000
#       enabled: false 关闭缓存

生产环境下不要关闭缓存否则会降低性能

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

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

相关文章

2023年数维杯国际大学生数学建模挑战赛

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 cs数模团队在数维杯前为大家提供了许多资料的内容呀&#xff0…

Redis应用之二分布式锁2

一、前言 前一篇 Redis应用之二分布式锁 我们介绍了使用SETNX来实现分布式锁&#xff0c;并且还遗留了一个Bug&#xff0c;今天我们对代码进行优化&#xff0c;然后介绍一下Redisson以及数据库的乐观锁悲观锁怎么用。 二、SetNX分布式锁优化后代码 RedisService.java Inven…

基于ssm+vue协同过滤算法的电影推荐系统

基于ssmvue协同过滤算法的电影推荐系统 摘要 电影推荐系统在信息技术发展的背景下日益成为研究的焦点&#xff0c;本研究基于SSM&#xff08;Spring SpringMVC MyBatis&#xff09;框架与Vue.js技术&#xff0c;以协同过滤算法为核心&#xff0c;旨在构建一种高效、准确的电影…

JVM在线分析-解决问题的工具一(jinfo,jmap,jstack)

1. jinfo (base) PS C:\Users\zishi\Desktop> jinfo Usage:jinfo <option> <pid>(to connect to a running process)where <option> is one of:-flag <name> to print the value of the named VM flag #输出对应名称的参数-flag [|-]<n…

C语言--1,5,10人民币若干,现在需要18元,一共有多少种?

今天小编给大家分享一下穷举法的一道典型例题 一.题目描述 1,5,10人民币若干,现在需要18元,一共有多少种? 二.思路分析 总共有18块钱&#xff0c;设1元有x张&#xff0c;5元有y张&#xff0c;10元有z张&#xff0c;则有表达式&#xff1a;x5y10z18&#xff0c;穷举法最重要的…

Java事务详解

一、事务的理解&#xff1a; 1、事务的特性&#xff1a; 1) 原子性&#xff08;atomicity&#xff09;&#xff1a;事务是数据库的逻辑工作单位&#xff0c;而且是必须是原子工作单位&#xff0c;对于其数据修改&#xff0c;要么全部执行&#xff0c;要么全部不执行。 2) 一致性…

大数据之LibrA数据库系统告警处理(ALM-12033 慢盘故障)

告警解释 系统每一秒执行一次iostat命令&#xff0c;监控磁盘I/O的系统指标&#xff0c;如果在60s内&#xff0c;svctm大于100ms的周期数大于30次则认为磁盘有问题&#xff0c;产生该告警。 更换磁盘后&#xff0c;告警自动恢复。 告警属性 告警ID 告警级别 可自动清除 1…

vue,react虚拟dom

Virtual DOM 前言 在传统的Web开发中&#xff0c;直接操作真实的DOM通常是一个昂贵且低效的操作。为了解决这个问题&#xff0c;Virtual DOM&#xff08;虚拟DOM&#xff09;被引入为一个中间层&#xff0c;允许开发者在内存中进行操作&#xff0c;从而避免频繁且不必要的真实D…

什么是代理IP池?真实测评IP代理商的IP池是否真实?

代理池充当多个代理服务器的存储库&#xff0c;提供在线安全和匿名层。代理池允许用户抓取数据、访问受限制的内容以及执行其他在线任务&#xff0c;而无需担心被检测或阻止的风险。代理池为各种在线活动&#xff08;例如网页抓取、安全浏览等&#xff09;提高后勤保障。 读完…

【C语言 | 预处理】C语言预处理详解(一) —— #define、#under、#if、#else、#elif、#endif、#include、#error

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

“第六十七天”

各位&#xff0c;昨天查找子串的方法想起来了&#xff0c;就是那个KMP算法......自己理解都有点困难&#xff0c;还看看能不能想一下&#xff0c;确实很困难啊。 不要忘了toupper函数和tolower函数不是直接改变字符的大小写&#xff0c;而是返回对应的大小写的值&#xff0c;需…

文件上传 [ACTF2020 新生赛]Upload1

打开题目&#xff0c;发现是一道文件上传题目 随便上传个一句话木马上去 发现网站前端有白名单限制&#xff0c;只能上传含有jpg&#xff0c;png&#xff0c;gif的后缀文件 那我们便传个2.jpg的一句话木马上去&#xff0c;bp抓包 我们改成php文件后缀试试&#xff0c;发现重发…

毕业设计项目:基于java+springboot的共享单车信息网站

运行环境 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Ma…

5. HTML常用标签

5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>(重要) HTML提供了…

【学习辅助】Axure手机时间管理APP原型,告别手机控番茄任务模板

作品概况 页面数量&#xff1a;共 30 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;时间管理、系统工具 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本品为「手机时间管理」APP原型&#xff0c;…

Redis集群,你真的学会了吗?

目录 1、为什么引入集群 1.1、先来了解集群是什么 1.2、哨兵模式的缺陷 引入集群解决了什么问题 1.3、使用集群&#xff0c;如何存储数据 2、三种主流的分片方式【经典面试题】 2.1、哈希求余算法 2.1.1、哈希求余算法的介绍 2.1.2、哈希求余算法如何扩容 2.2、一致性…

C# 并发编程

C# 并发编程 前言 对于现在很多编程语言来说&#xff0c;多线程已经得到了很好的支持&#xff0c; 以至于我们写多线程程序简单&#xff0c;但是一旦遇到并发产生的问题就会各种尝试。 因为不是明白为什么会产生并发问题&#xff0c;并发问题的根本原因是什么。 接下来就让…

vcomp120.dll丢失怎么办?vcomp120.dll丢失的解决方法分享

vcomp120.dll丢失”。这个错误通常会导致某些应用程序无法正常运行&#xff0c;给用户带来困扰。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何修复呢&#xff1f;下面我将为大家介绍四个修复vcomp120.dll丢失的方法。 一、使用dll修复程序修复 可以通过百度或许…

矢量绘图软件Sketch 99 for mac

Sketch是一款为用户提供设计和创建数字界面的矢量编辑工具。它主要用于UI/UX设计师、产品经理和开发人员&#xff0c;帮助他们快速设计和原型各种应用程序和网站。 Sketch具有简洁直观的界面&#xff0c;以及丰富的功能集&#xff0c;使得用户可以轻松地创建、编辑和共享精美的…

NSF服务器

目录 1.简介 1.1 NFS背景介绍 1.2 生产应用场景 2.NFS工作原理 2.1 实例图 2.2 流程 3.NFS的使用 3.1.安装 3.2.配置文件 3.3.主配置文件分析 3.4 实验 服务端&#xff1a; 客户端&#xff1a; 3.5.NFS账户映射 3.5.1.实验2 3.5.2.实验3 4.autofs自动挂载服务…